[20140802]cost=0.txt

[20140802]cost=0.txt

--我记得以前看基于成本优化的书提到,如果计算返回的行0,一般计算选择返回1行,除非查询条件为假.
--但是如果计算cost=0会出现什么情况呢?
--转载并测试(部分):

http://rajeshwaranbtech.blogspot.com/2014/07/cbo-estimates-cost-0.html

SCOTT@test01p> @ver

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> create table t1 as select * from all_objects;
Table created.

SCOTT@test01p> create table t2 as select * from all_objects;
Table created.

SCOTT@test01p> alter table t2 add constraint t2_pk primary key(object_id);
Table altered.

SCOTT@test01p> execute dbms_stats.gather_table_stats(user,'t1',cascade=>true,method_opt=>'for all columns size 1',no_invalidate=>false);
PL/SQL procedure successfully completed.

SCOTT@test01p> execute dbms_stats.gather_table_stats(user,'t2',cascade=>true,method_opt=>'for all columns size 1',no_invalidate=>false);
PL/SQL procedure successfully completed.

SCOTT@test01p> alter session set statistics_level=all;
Session altered.

SCOTT@test01p> select count(*) from t1, t2 where t1.object_id = t2.object_id ;
  COUNT(*)
----------
     89709

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
--------------------------------------
SQL_ID  a2dvtjh6t4p0t, child number 0
-------------------------------------
select count(*) from t1, t2 where t1.object_id = t2.object_id
Plan hash value: 1249090617
----------------------------------------------------------------------------------------------------
| Id  | Operation           | Name  | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |       |      1 |        |   424 (100)|      1 |00:00:00.13 |    2878 |
|   1 |  SORT AGGREGATE     |       |      1 |      1 |            |      1 |00:00:00.13 |    2878 |
|   2 |   NESTED LOOPS      |       |      1 |  89709 |   424   (2)|  89709 |00:00:00.12 |    2878 |
|   3 |    TABLE ACCESS FULL| T1    |      1 |  89709 |   420   (1)|  89709 |00:00:00.02 |    1513 |
|*  4 |    INDEX UNIQUE SCAN| T2_PK |  89709 |      1 |     0   (0)|  89709 |00:00:00.05 |    1365 |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")

--我们可以发现因为id=4选择INDEX UNIQUE SCAN,cost=0,导致执行计划趋向于 NESTED LOOPS.最后总的Buffers=2878.
--使用提示看看:

SCOTT@test01p> select /*+ use_hash(t1,t2) */ count(*) from t1, t2 where t1.object_id = t2.object_id ;
  COUNT(*)
----------
     89709

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  f0yyx5m29hb3x, child number 0
-------------------------------------
select /*+ use_hash(t1,t2) */ count(*) from t1, t2 where t1.object_id =
t2.object_id

Plan hash value: 2219068312

----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name  | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |       |      1 |        |   618 (100)|      1 |00:00:00.22 |    1707 |       |       |          |
|   1 |  SORT AGGREGATE        |       |      1 |      1 |            |      1 |00:00:00.22 |    1707 |       |       |          |
|*  2 |   HASH JOIN            |       |      1 |  89709 |   618   (1)|  89709 |00:00:00.22 |    1707 |  5536K|  3056K| 5645K (0)|
|   3 |    INDEX FAST FULL SCAN| T2_PK |      1 |  89710 |    52   (0)|  89710 |00:00:00.04 |     194 |       |       |          |
|   4 |    TABLE ACCESS FULL   | T1    |      1 |  89709 |   420   (1)|  89709 |00:00:00.01 |    1513 |       |       |          |
----------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")

--虽然cost=618比424高,但是Buffers=1707明显比前面2878的小.

时间: 2024-09-29 12:03:47

[20140802]cost=0.txt的相关文章

[20140802]cursor_sharing=similar.txt

[20140802]cursor_sharing=similar.txt --晚上看了http://www.dbaxiaoyu.com/archives/2248,在 cursor_sharing='similar'的情况下,会出现N多子光标(如果查询字段有直方 --图的情况下).实际上oracle在以后的版本会淘汰调cursor_sharing=similar的情况. SCOTT@test01p> @ver BANNER                                     

[20150626]建立索引pctfree=0.txt

[20150626]建立索引pctfree=0.txt --昨天看了链接: https://richardfoote.wordpress.com/2015/06/25/quiz-time-why-do-deletes-cause-an-index-to-grow-up-the-hill-backwards/ --自己测试看看来解答问题,不知道是否正确:-) 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION    

PostgreSQL 10.0 preview 性能增强 - mergesort(Gather merge)

标签 PostgreSQL , 10.0 , merge sort , gather merge 背景 在数据库中,经常会有多个节点append,然后sort的情况. 例如一张表有10个分区,查询所有分区,并按某列排序输出,常规的做法是所有的记录append,然后sort. PostgreSQL 10.0 将支持append node的并行计算,也就是说所有的分区表可以并行的sort,然后返回,此时就可以使用merge sort来提高排序的速度. 另外,像单表的并行计算,如果需要排序输出的话,每

[20171206]位图区一定在数据文件开头吗.txt

[20171206]位图区一定在数据文件开头吗.txt --//如果问你oracle数据文件的位图区位于数据文件开头部分吗?我想大家的回答一定,实际上在10g下未必,因为10g建立的数据文件. --//在数据区前面仅仅8块,第1块作为文件头,第2块作为位图区头,第3-8块(共6块)作为位图区,一般1个位图区块能容纳 --//(494+2)*32*4= 63488区,1个区=64K(对于SEGMENT SPACE MANAGEMENT AUTO). --//这样1个位图块可以容纳63488*64*

[20170909]为什么是12秒.txt

[20170909]为什么是12秒.txt --//在开发程序时我一般会强调开发尽量不要写一些自定义函数,往往可能导致CPU忙. --//例子很像这样: CREATE OR REPLACE FUNCTION get_dept (p_deptno dept.deptno%TYPE)    RETURN dept.dname%TYPE IS    l_dname   dept.dname%TYPE; BEGIN    DBMS_LOCK.sleep (1);    SELECT dname     

[20170703]SQL语句分析执行过程.txt

[20170703]SQL语句分析执行过程.txt --//正常sql select语句执行需要这些过程,create cursor,parse,execute and fetch. --//dml估计缺少fetch步骤.参考vage的书写的例子,原书的例子存在问题,理解如下脚本对于sql语句如何执行很有益处. --//当然正常的编程很少有人这样写代码的. DECLARE    mcur     NUMBER;    mstat    NUMBER;    v_name   VARCHAR2 (

[20160228]关于sys.bootstrap$.txt

[20160228]关于sys.bootstrap$.txt --关于sys.bootstrap$,在启动oracle数据库中占用很重要的位置,我以前看eygle,biti的blog,自已以前也探究过, --有许多东西一直不理解,自己也重复探究看看: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ ----------

[20151208]隐含参数_trace_pin_time.txt

[20151208]隐含参数_trace_pin_time.txt --使用隐含参数可以trace how long a current pin is held,作为测试与学习了解oracle内部相关知识. --自己测试看看. 1.测试环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------

[20131122]跟踪sql profile的操作.txt

[20131122]跟踪sql profile的操作.txt sql profile是11G的新特性,前几天我在给别人做优化时,偷懒直接使用toad,step by step分析使用sql profile,导致系统执行缓慢,不得不中断分析.今天有空跟踪sql profile的操作看看,了解一些过程. SCOTT@test> @verBANNER-----------------------------------------------------------------------------