?
?
alter system set use_stored_outlines=crm2_cat1;
?
原因分析?


此处为什么oracle优化器选择走了IDX1_TF_B_TRADE_SVC的service_id列索引跳扫而没有使用PK_TF_B_TRADE_SVC上的trade_id呢,我们可以看一下索引的信息:
?
SQL> l 1* select index_name,blevel,AVG_LEAF_BLOCKS_PER_KEY,AVG_DATA_BLOCKS_PER_KEY from dba_indexes where TABLE_NAME='TF_B_TRADE_SVC' SQL> / INDEX_NAME BLEVEL AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY ------------------------------ ---------- ----------------------- ----------------------- IDX1_TF_B_TRADE_SVC 2 1 1 PK_TF_B_TRADE_SVC 3 1 1
当两个索引AVG_LEAF_BLOCKS_PER_KEY+AVG_DATA_BLOCKS_PER_KEY的值相同时,就判断blevel,此处由于IDX1_TF_B_TRADE_SVC的blevel=2,oracle
?
认为走这个索引会有较少的IO,而sql语句中正好有service_id的谓词,因此选择走了跳扫。详细描述参考为什么Oracle不使用我的索引?! 一文。
?
TABLE_NAME TABLE_OWNER INDEX_NAME COLUMN_NAME COLUMN_POSITION ------------------------------ ------------------------------ ------------------------------ ------------- --------------- TF_B_TRADE_SVC UCR_CRM2 IDX1_TF_B_TRADE_SVC USER_ID 1 TF_B_TRADE_SVC UCR_CRM2 IDX1_TF_B_TRADE_SVC SERVICE_ID 2 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC TRADE_ID 1 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC ACCEPT_MONTH 2 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC USER_ID 3 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC SERVICE_ID 4 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC START_DATE 5 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC PRODUCT_ID 6 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC PACKAGE_ID 7 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC USER_ID_A 8 TF_B_TRADE_SVC UCR_CRM2 PK_TF_B_TRADE_SVC MODIFY_TAG 9
?
------------------结束---------------------