某字段不走索引分析

2021-06-16 10:18:27 字數 2847 閱讀 3768

表t_busi_main_presend2建了索引t_busi_main_presend2_shstatus在shstatus欄位,shstatus char(1) default '0',只有2個值 '0' ,'1'。初始值為『0』,處理之後為『1』,表中幾十萬資料,大部分為『1』,現在有8條為『0』。

現在,建索引(型別為normal,不能bitmap,會鎖)後,下面語句竟然是全表!

select * from t_busi_main_presend2  where shstatus='0'

於是,我:

1.重新分析表之後繼續執行,還是不行:

analyze table t_busi_main_presend2 compute statistics;

2.重建索引,仍然不行:

alter index t_busi_main_presend2_shstatus rebuild;

3.清空shar pool還是不行:

alter system flush shared_pool

這三種都不行,就先刪除表的統計,然後不要分析表,再看看走不走索引:

begin

dbms_stats.delete_table_stats(ownname => 'ydsoft_test',tabname => 't_mt');

end;

我自己這樣之後,走索引了。

另外,在pl/sql中用f5是看不到執行計畫的 統計資訊的,

select * from table ( dbms_xplan.display_cursor('sql_id'))  這種方法能看到

sql_id 自己到  v$sql 裡面撈去,或者到em中看

經過高人指點,有一下幾種方案:

2.一般可行的方法:

1.由於該欄位1值很多,0值很少,那麼

①先刪除之前該索引的統計資訊

②按表數量的1%來取樣收集統計資訊

取樣後:

查1的,走全表;查0的,走索引('ydsoft_test'是owner。注意收集1%那麼下面estimate_percent=>1後面不能要%,否則會

ora-06550: 第 2 行, 第 114 列:

pls-00103: 出現符號 "%"在需要下列之一時:

) , * & = - + < / > at in is

mod remainder not rem <> or != or ~= >= <=

<> and or like like2_ like4_ likec_ between || multiset

member submultiset_

符號 "%" 被忽略。

)。這是正確的結果:

引數解釋:

'ydsoft_test'是owner

cascade=true表示

estimate_percent=>1 索引也做分析這裡的百分比是約小越好,中間原因太複雜了,沒聽老師講明白。「桶」那個問題(在下面),不太明白。

method_opt 是表關聯分析

第一句是刪除索引的統計

sql> begin

2 dbms_stats.delete_index_stats(ownname => 'ydsoft_test',indname => 't_busi_main_presend2_shstatus');

3 end;

4 /

begin

dbms_stats.gather_table_stats('ydsoft_test', 't_busi_main_presend2', degree=>3, cascade=>true,estimate_percent=>1 ,no_invalidate => false);

end;

2.此方法對於自動執行的系統中不太實用,但是自己手動操作一些東西的時候還是可以用的

在pl/sql「解釋計畫視窗」中,選擇 「優化器目標」(選擇/規則/第一行/所有行),分別選,看哪個走索引,最後確定 規則/第一行 走索引,此時可以加 /*+rule*/ 使其強制走索引。

select  /*+rule*/* from t_busi_main_presend2  where shstatus='0'

update /*+rule*/t_busi_main_presend2 set shstatus='1' where shstatus='0' and id<>'504808'

筆記,關於取樣量:

取樣越大,是因為不同值太多

值太多,反而值越小越好

就把它看成個廠房的空間吧

比如值為1,佔比90%,那不為1人只佔10%,當然走索引了

當然,這裡的桶不存資料,只存資料規模

也就是說生成插計畫的時候,先判斷是否有hint,再看錶規模,再看資料直方圖中來判斷目標資料的規模

其實就是資料分布

比如1值佔比,資料分散性

這個和io都是相尖的 相關

直方圖,一是資料佔比,二是資料分散性的乙個指標

高度還沒看

掃瞄 數字越大越快,不是指表分析,是全表取樣掃瞄。我特指這種情況,不是表分析。

select * from tablename sample(95) order by rowid desc;

備註:此語句sample後面跟的數字越大,掃瞄速度越快。

以上語句,從乙個很大的表中,快速掃瞄到 最後插入的資料,非常有效。【其實這個也是基於,表分析的結果,篩選的】

oracle 查詢不走索引的範例分析

like 後 位置不走索引問題 create table t2 as select from dba objects 建立表 create index idx t2 name on t2 object name 建立索引 set autotrace on 開啟執行計畫跟蹤 select from t...

oracle 查詢不走索引的範例分析

oracle 11g中有個新特性,當表無資料時,不分配segment,以節省空間。alter system set deferred segment creation false 該引數值預設是true,當改為false時,無論是空表還是非空表,都分配segment。需注意的是 該值設定後對以前匯入...

不走索引的原因

補充 不走索引的原因,甚至加上hint 還不走索引,那可能是因為你要走索引的這列是nullable,雖然這列沒有空值。將字段改為not null 備註 不走索引的其它原因1 建立組合索引,但查詢謂詞並未使用組合索引的第一列,此處有乙個index skip scan概念。2 在包含有null值的tab...