About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(182)
分类: Oracle
2025-04-06 21:05:42
create table default_t as select * from dba_objects; exec dbms_stats.delete_table_stats(ownname=>user,tabname=>'default_t'); create index idx_default_t on default_t(object_id); create index idx1_default_t on default_t(status); var v1 number; var v2 varchar2(100); exec :v1 := 1; exec :v2 := 'VALID'; select * from default_t where object_id = :v1 and status = :v2; SQL_ID gfqhn6rwb15hn, child number 0 ------------------------------------- select * from default_t where object_id = :v1 and status = :v2 Plan hash value: 865985874 ---------------------------------------------------------------------- | Id | Operation | Name | E-Rows | ---------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| DEFAULT_T | 7 | |* 2 | INDEX RANGE SCAN | IDX_DEFAULT_T | 16 | ---------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("STATUS"=:V2) 2 - access("OBJECT_ID"=:V1) |
alter system flush shared_pool; alter session set "_optim_peek_user_binds"=false; var v1 number; var v2 varchar2(100); exec :v1 := 1; exec :v2 := 'VALID'; select * from default_t where object_id = :v1 and status = :v2; Plan hash value: 865985874 --------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | 2 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| DEFAULT_T | 1 | 7 | 0 |00:00:00.01 | 2 | |* 2 | INDEX RANGE SCAN | IDX_DEFAULT_T | 1 | 265 | 0 |00:00:00.01 | 2 | --------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("STATUS"=:V2) 2 - access("OBJECT_ID"=:V1) Note ----- - dynamic statistics used: dynamic sampling (level=2) select/*+index(default_t(status) )*/ * from default_t where object_id = :v1 and status = :v2; Plan hash value: 3060018666 ---------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ---------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.02 | 1607 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| DEFAULT_T | 1 | 7 | 0 |00:00:00.02 | 1607 | |* 2 | INDEX RANGE SCAN | IDX1_DEFAULT_T | 1 | 265 | 73749 |00:00:00.01 | 176 | ---------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("OBJECT_ID"=:V1) 2 - access("STATUS"=:V2) Note ----- - dynamic statistics used: dynamic sampling (level=2) |
exec dbms_stats.gather_table_stats(ownname=>user,tabname=>'default_t',no_invalidate=>false); var v1 number; var v2 varchar2(100); exec :v1 := 1; exec :v2 := 'VALID'; select * from default_t where object_id = :v1 and status = :v2; -- 这个索引估算的行数就是1/num_distinct 计算选择率=1/73752 select * from default_t where object_id = :v1 and status = :v2 Plan hash value: 865985874 --------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | 2 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| DEFAULT_T | 1 | 1 | 0 |00:00:00.01 | 2 | |* 2 | INDEX RANGE SCAN | IDX_DEFAULT_T | 1 | 1 | 0 |00:00:00.01 | 2 | --------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("STATUS"=:V2) 2 - access("OBJECT_ID"=:V1) -- 这个索引估算的行数就是50%,按照1/num_distinct 计算选择率=1/2 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID 1rh5an6btwgd6, child number 1 ------------------------------------- select/*+index(default_t(status) )*/ * from default_t where object_id = :v1 and status = :v2 Plan hash value: 3060018666 ---------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ---------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.03 | 1607 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| DEFAULT_T | 1 | 1 | 0 |00:00:00.03 | 1607 | |* 2 | INDEX RANGE SCAN | IDX1_DEFAULT_T | 1 | 36877 | 73749 |00:00:00.01 | 176 | ---------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("OBJECT_ID"=:V1) 2 - access("STATUS"=:V2) |