SQL優化--強制走索引失效的情況
select count(0) from creditguarantee cg where 1=1
and cg.createddate>=to_date('2012-02-23','yyyy-MM-dd')
and cg.createddate<=to_date('2012-02-26','yyyy-MM-dd')
and 2=
(case
when
(select count(0) from creditlevelchange where customerid=cg.customerid and createddate<=to_date('2012-02-26','yyyy-MM-dd'))>0
then
(select newlevel from creditlevelchange where customerid=cg.customerid and
changeid=
(select max(changeid) from creditlevelchange where customerid=cg.customerid and createddate<=to_date('2012-02-26','yyyy-MM-dd'))
)
else
(case
when
(select count(0) from creditlevelchange where customerid=cg.customerid and createddate>to_date('2012-02-26','yyyy-MM-dd'))>0
then
(select oldlevel from creditlevelchange where customerid=cg.customerid and
changeid=
(select min(changeid) from creditlevelchange where customerid=cg.customerid and createddate>to_date('2012-02-26','yyyy-MM-dd'))
)
else
cg.creditlevelid
end)
end)
========================================================================================================
這是開發發過來的sql,完全一樣的SQL,在huifu2上面不到1秒能跑出來,在jsjdata0上面要跑3分鐘左右。
檢視執行計劃,可以很清晰的發現問題出在jsjdata0上面沒有走索引。creditguarantee這張表上面的列
CREATEDDATE上有一個索引NL_CREDATEDATE,在huifu2上面走了,但是在jsjdata0這裡訪問creditguarantee卻
是走的全表掃描。我第一反應是索引的統計資訊出問題了,用exec dbms_stats.gather_index_stats收集了
下索引的統計資訊,發現沒有任何效果。我先加hints再來試一試,把第一行資料改為如下寫法
select /*+index(creditlevelchange INDEX_CUSTOMERID)*/ count(0) from creditguarantee cg where 1=1
發現仍然不走索引,這就有點奇怪,這下應該是表的資料和索引有關係
jsjdata0
-- select max(CREATEDDATE) from creditguarantee 2012/2/23 17:46:01
-- select min(CREATEDDATE) from creditguarantee 2012/2/23 10:32:58
huifu2
-- select Max(CREATEDDATE) from creditguarantee 2012/2/3 16:48:56
-- select Min(CREATEDDATE) from creditguarantee 2012/1/20 14:45:52
這下原因就很簡單了,它大於的時間在表裡面根本就找不到
第一種情況:
select count(0) from creditguarantee cg where 1=1
and cg.createddate>=to_date('2012-02-23 09:33:00','yyyy-MM-dd hh24:mi:ss')
and cg.createddate<=to_date('2012-02-26 10:33:00','yyyy-MM-dd hh24:mi:ss')
and 2=
再寫細點,這種就不行
第二種情況:
下面這種就可以
select count(0) from creditguarantee cg where 1=1
and cg.createddate>=to_date('2012-02-23 10:40:00','yyyy-MM-dd hh24:mi:ss')
and cg.createddate<=to_date('2012-02-26 10:33:00','yyyy-MM-dd hh24:mi:ss')
and 2=
表裡面資料時間長度的區間
|-------------------------------------|
2012/2/23 10:32:58 2012/2/23 10:32:58
第一種情況:
|---------------------------------------------------------|
2012-02-23 09:33:00 2012-02-26 10:33:00
第二種情況:
|------------------------------------------|
2012-02-23 10:40:00 2012-02-26 10:33:00
總結:where後面的起始時間要大於表裡面資料的時間,如果起始時間小於表裡面的資料之後
,那個點上根本就沒有資料,那就談不上使用那個點上資料的索引了,所以強制走hints也補
會有效果。
在整個sql優化過程中,我一直把注意and 2= .....這語句的前面,通過執行計劃我發現了他們
屬於非相關聯合型操作。所以找到問題點在上面之後就不需要關注下面的SQL了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10678398/viewspace-717236/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql索引失效的情況MySql索引
- Mysql 會導致索引失效的情況MySql索引
- MYSQL索引失效的各種情況小結MySql索引
- sql最佳化-錯誤強制型別轉換導致索引失效SQL型別索引
- 簡單介紹MySQL索引失效的幾種情況MySql索引
- ORACLE MYSQL中join 欄位型別不同索引失效的情況OracleMySql型別索引
- 基於COST優化,oracle什麼情況不走索引優化Oracle索引
- SQL優化-索引SQL優化索引
- 聊聊索引和SQL優化索引SQL優化
- SQL優化--函式索引SQL優化函式索引
- sql優化之多列索引的使用SQL優化索引
- ORACLE索引被抑制情況Oracle索引
- mysql索引不會命中的情況MySql索引
- oracle order by索引是否使用的情況Oracle索引
- SQL優化之利用索引排序SQL優化索引排序
- 個人學習系列 - @Transactional失效的3種情況
- SQL優化(二)(聯合索引的使用)SQL優化索引
- MySQL哪些情況需要新增索引?MySql索引
- 優化-mysql子查詢索引失效問題解決優化MySql索引
- 圖片無法載入的情況下的優化優化
- SQL SERVER中什麼情況會導致索引查詢變成索引掃描SQLServer索引
- mysql 強制走索引MySql索引
- MySQL SQL 優化之覆蓋索引MySql優化索引
- SQL優化案例-正確的使用索引(二)SQL優化索引
- [zt] 基於索引的SQL語句優化索引SQL優化
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- [zt] Oracle不使用索引的幾種情況Oracle索引
- 資料庫效能優化-索引與sql相關優化資料庫優化索引SQL
- SQL優化案例-分割槽索引之無字首索引(六)SQL優化索引
- SQL優化之統計資訊和索引SQL優化索引
- SQL優化思路&結果集重用優化、分割槽索引優化測試SQL優化索引
- 《MySQL慢查詢優化》之SQL語句及索引優化MySql優化索引
- SQL精華總結索引型別優化SQL優化事務大表優化思維導圖❤️SQL索引型別優化
- 一次oracle sql調優的經歷(隱士轉換導致索引失效)OracleSQL索引
- SQL Server索引優化系列之二:索引效能考慮 (轉)SQLServer索引優化
- 理解索引:索引優化索引優化
- 高效的SQL(函式索引優化VIEW一例)SQL函式索引優化View
- 增加複合索引優化SQL的簡單過程索引優化SQL