SQL调优:带函数的谓词导致CBO Cardinality计算误差

今天处理了这样一问题,where条件中存在函数fun(date)<to_date('9999-01-01','YYYY-MM-DD')这样的无实际意义谓词,导致CBO计算基数时cardinality远小于实际情况,导致优化器认为2个源数据集的基数都不大,从而选择了HASH JOIN Right SEMI+SORT ORDER BY的执行计划,但是由于实际基数远大于computed 计算值所以变成了大的数据集做HASH JOIN并全数据排序,而实际该SQL只要求返回几十行数据而已,使用NESTED LOOP SEMI JOIN可以立即返回排序的前20行数据。 这里就需要解释带函数的谓词时CBO如何计算基数,我们通过下面的例子来说明:    
create or replace function check_date( RDATE in date)  return date is 
begin
IF rdate< to_date('2099-01-01','YYYY-MM-DD') then   return rdate;   ELSIF  rdate >=to_date('2099-01-01','YYYY-MM-DD') then return to_date('2000-01-01');end if;end check_date;/SQL> select check_date (sysdate) from dual;CHECK_DAT
---------
06-DEC-12drop table tab1;SQL> create table tab1 tablespace users as select * from dba_objects where rownum create view vtab1 as select object_id as id , object_name as name, object_type as type , check_date(created) cdata from tab1;View created.SQL> select count(distinct cdata) from vtab1;COUNT(DISTINCTCDATA)
--------------------130SQL> exec dbms_stats.gather_table_stats('','TAB1', method_opt=>'FOR ALL COLUMNS SIZE 254');PL/SQL procedure successfully completed.
    因为我们指定收集了直方图所以若直接以"created"为条件查询时可以获得较好的计算基数
   SQL> select count(*) from tab1 where  created  >= to_date('0001-10-10','YYYY-MM-DD');COUNT(*)
----------10000Execution Plan
----------------------------------------------------------
Plan hash value: 1117438016---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     8 |    40   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |
|*  2 |   TABLE ACCESS FULL| TAB1 | 10000 | 80000 |    40   (0)| 00:00:01 |
---------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter("CREATED">=TO_DATE(' 0001-10-10 00:00:00', 'syyyy-mm-ddhh24:mi:ss'))Statistics
----------------------------------------------------------1  recursive calls0  db block gets133  consistent gets0  physical reads0  redo size526  bytes sent via SQL*Net to client523  bytes received via SQL*Net from client2  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)1  rows processed
    在以上查询中>= to_date('0001-10-10','YYYY-MM-DD'); 这样的过滤条件实际无意义,在直接使用 "created"列作为谓词的情况下,CBO可以获得很好的基数10000。    
SQL> select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  6zy2k9dy4cv73, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ count(*) from vtab1 where  cdata
>= to_date('0001-10-10','YYYY-MM-DD')Plan hash value: 1117438016-------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |      1 |00:00:00.25 |     154 |
|   1 |  SORT AGGREGATE    |      |      1 |      1 |      1 |00:00:00.25 |     154 |
|*  2 |   TABLE ACCESS FULL| TAB1 |      1 |    500 |  10000 |00:00:00.31 |     154 |
-------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter("CHECK_DATE"("CREATED")>=TO_DATE(' 0001-10-10 00:00:00','syyyy-mm-dd hh24:mi:ss'))21 rows selected.
    通过gather_plan_statistics HINT,我们得到E-Rows 即CBO评估的基数,和 A-Rows实际的基数,可以看到这里E-Rows=500, 即在谓词左边存在使用内部函数或隐身装换的情况下,CBO无法通过现有统计信息的DISTINCT、DENSITY和HISTOGRAM获得较好的Cardinality,其基数总是统计信息中表的总行数/20,如上例中的 10000/20=500。 这就会引入不少的麻烦,因为开发人员有时候为了方便会在视图字段中嵌入自定义的函数,之后若在查询中使用该字段作为谓词条件,则可能导致CBO为相应表计算的基数偏少,是本身应当成本非常高的执行计划的COST变低,而容易被优化器选择。 对于上述问题可选的常见方案是若有这样问题的SQL较少则考虑加HINT或者SQL PROFILE,若较多还是需要考虑减少这种谓词左边有函数的现象。 implicit data_type conversion functions in Filter Predicates. Review Execution Plans. If Filter Predicatesinclude unexpected INTERNAL_FUNCTION to perform an implicit data_type conversion, be sure it is not preventing a column from being used as an Access Predicate.

转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968127.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当充气娃娃过于逼真......

1 朋友一生一起走....▼2 总裁爹是被吓到了吗&#xff1f;▼3 我宣布&#xff1a;本届舞林大会&#xff0c;冠军已出&#xff01;▼4 哥哥&#xff0c;我来了&#xff01;▼5 为了防疫&#xff0c;泰国的小朋友们很不容易▼6 这位爸爸真的是非常巧妙了&#xff01;▼7 生…

Android之gallery 常见2种使用方法和3D效果总结

我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果,还可以根据你的点击或者触摸触发其他事件响应。同样的,在Android中也提供这这种实现,这就是通过Gallery在UI上实现缩略图浏览器。 一般情况下,我们在A…

(转)Android基础类之BaseAdapter

BaseAdapter就Android应用程序中经常用到的基础数据适配器&#xff0c;它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件&#xff0c;它是继承自接口类Adapter&#xff0c;1、Adapter类简介1)、Adapter相关类结构如下图所示&#xff1a;自定义…

[Windows]_[0基础]_[使用命令行工具dumpbin分析文件]

dumpbin(vs拥有) 1. 出口lib函数符号文件(symbols) dumpbin /exports zlib1.lib Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved.Dump of file zlib1.libFile Type: LIBRARYExportsordinal name1 _adl…

手把手教你学Dapr - 4. 服务调用

介绍通过使用服务调用&#xff0c;您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠、安全地通信。为什么不直接用HttpClientFactory呢先问几个问题&#xff1a;如何发现和调用不同服务的方法如何安全地调用其他服务&#xff0c;并对方法应用访问控制如何处理重试和…

高速的二舍八入三七作五_有没有发现,高速收费都是5的倍数,这是为什么?怎么判断的?...

要想富&#xff0c;先修路。这是劳动人民致富的第一要素。从最早的泥巴路到现在的高速公路&#xff0c;人民生活有了翻天覆地的变化。随后路上汽车的数量也就越来越多了&#xff0c;堵车便成为很常见的现象&#xff0c;所以就有了高架桥、立交桥的诞生&#xff0c;它们的出现很…

android http请求

参考&#xff1a;http://stackoverflow.com/questions/2742236/android-httpclient 源码 首先要在 AndroidManifest.xml中添加权限: <uses-permission android:name"android.permission.INTERNET"></uses-permission> </manifest> 代码&#xff1a…

清华大学再出神人,汽车被盗,用“贪心算法”瞬间找到偷车贼

全世界只有3.14 % 的人关注了爆炸吧知识惹谁都不要惹会算法的人今天要讲的故事的主人公&#xff0c;是来自圣母大学计算机系的副教授史戈宇。就在之前&#xff0c;他还经历了一场惊心动魄的劫车事件。度假旅游遇劫匪在某一个周末&#xff0c;史教授计划着开车带一家人去百慕大度…

Android之RecyclerView 实现真正的Gallery效果

简介&#xff1a; RecyclerView是support-v7包中的新组件&#xff0c;是一个强大的滑动组件&#xff0c;与经典的ListView相比&#xff0c;同样拥有item回收复用的功能&#xff0c;但是直接把viewholder的实现封装起来&#xff0c;用户只要实现自己的viewholder就可以了&#x…

关于梦想--------听说标题够长才有人看

今天同桌拿手机看新闻。看到某市某中学生在国旗下讲话时私自篡改了老师原先为其准备的演讲稿&#xff0c;“讲了些有关抨击高考制度&#xff0c;学校不应沦为制度下的机器什么的。听说被勒令退学了。看到这个想起来我初三时候写的一片作文。名字叫做《梦想》。记得当时我先后采…

Android之ADB常用命令

adb devices //列出所有的连接设备 adb connect <host>[:<port>] //通过tcp/ip连接&#xff0c;5555是默认端口 设备命令&#xff1a; adb push <local> <remote> //拷贝文件/目录到设备 adb pull <remote> [<local>] //从设备拷贝文件/目…

手把手教你学Dapr - 2. 必须知道的概念

Sidecar 边车Dapr API提供Http和gRPC两种通讯方式。运行方式则可以是容器也可以是进程&#xff08;Windows开发推荐使用Self Hosted&#xff0c;后续会解释&#xff09;。这样的好处是与运行环境无关&#xff0c;且独立运行不需要应用包含Dapr运行时的代码。只需要通过SDK集成即…

office打开服务器文件提示内存不足,打开Excel2016提示内存或磁盘空间不足的解决方法...

摘要在Excel2016或者2013中打开新建的空白文档提示&#xff1a;内存或磁盘空间不足&#xff0c;Microsoft Excel无法再次打开或保存任何文档。问题描述在Excel2016或者2013中打开新建的空白文档提示&#xff1a;内存或磁盘空间不足&#xff0c;Microsoft Excel无法再次打开或保…

模块化 JS Ajax 请求

为什么80%的码农都做不了架构师&#xff1f;>>> 现在有一个需求&#xff0c;点击 Button需要调用一个函数获取 JSON 数据传给 artTemplate 模板渲染生成页面&#xff0c;所以需要在这个函数中封装原生的 JS Ajax&#xff0c;同时重新渲染页面。 Arttemplate 模板 &…

女孩子胸前的秘密,研究三天后我出不来了……

全世界只有3.14 % 的人关注了爆炸吧知识前两天&#xff0c;知识君写了一篇关于胸大女生烦恼的科普文。忍“乳”负重&#xff0c;身材好的女孩子究竟有多不容易&#xff1f;我从科学的角度算出来了……你们居然觉得我有写广告的嫌疑&#xff1f;那就真的是让知识君觉得太委屈了&…

为什么ps图片打开是色块_PS教程 我的PS我做主之山村调色

执行【文件】|【打开】命令&#xff0c;打开原稿图像打开“图层”面板&#xff0c;按两次键盘上的快捷键“CtrlJ”复制背景层&#xff0c;得到图层1、图层1副本3. 打开“通道”面板&#xff0c;选取蓝通道&#xff0c;如图执行【图像】|【应用图像】命令&#xff0c;打开“应用…

Android之Color颜色值和RGB颜色对照表

RGB颜色对照表 #FFFFFF #FFFFF0 #FFFFE0 #FFFF00 #FFFAFA #FFFAF0 #FFFACD #FFF8DC #FFF68F #FFF5EE #FFF0F5 #FFEFDB #FFEFD5 #FFEC8B #FFEBCD #FFE7BA #FFE4E1 #FFE4C4 #FFE4B5 #FFE1FF #FFDEAD #FFDAB9 #FFD700 #FFD39B #FFC1C1 #FFC125 #FFC0CB #FFBBFF #FFB90F #FFB6C1 #…

C++中char*与wchar_t*之间的转换

把char*转换为wchar_t* 用stdlib.h中的mbstowcs_s函数&#xff0c;可以通过下面的例子了解其用法&#xff1a; char *CStr "string to convert"; size_t len strlen(CStr) 1; size_t converted 0; wchar_t *WStr; WStr(wchar_t*)malloc(len*sizeof(wchar_t)); mb…

EVGA Precision—— 显卡超频神器 可用于调节风扇转速 降温

EVGA Corporation&#xff0c;总部在美国&#xff0c;美国最大板卡公司之一&#xff0c;是Nvidia的核心合作伙伴。 EVGA Precision X是一个可以满足用户对显卡所有需求的软件。它可以让我们调节显卡的风扇转速、时钟速度以及电压等。 系统要求 微软Windows 8/7/Vista/XPGeForce…

ftp服务器新建虚拟目录,ftp服务器 虚拟目录

ftp服务器 虚拟目录 内容精选换一换下载地址&#xff1a;https://github.com/gmarcais/Jellyfish/releases/download/v2.2.10/jellyfish-2.2.10.tar.gz下载地址&#xff1a;http://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/human_g1k_vftp服务器 虚拟目录 相关…