採用直方圖改善SQL執行效能
今天下午朋友QQ給我說他遇到一個SQL相關的效能問題,執行查詢相當…的慢,發SQL發過來之後,發現跟上次讓我看的是一樣的,上次調整過一次,似乎效果不是很理想…,進入正題。
select * from
(select * from U_MSG
where MS='DELIVRD'
and SA = '1066898829'
and ICP_ID='91188'
and SCTS>'2011-02-01'
and SIGN is null ) C
where rownum=1;
告訴朋友如何收集執行計劃,發過來的結果為:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
(Cost=4 Card=1 Bytes=217)
1 0
COUNT (STOPKEY)
2 1 TABLE
ACCESS (BY INDEX ROWID) OF 'U_MSG' (Cost=4 Card=1 Bytes=217)
3 2 INDEX (RANGE SCAN) OF 'INDEX_NEW_SCTS'
(NON-UNIQUE) (Cost=3 Card=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
128746 consistent gets
28245 physical reads
0 redo size
2451 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
從autotrace的結果可以看出,在SQL執行時,走的索引是INDEX_NEW_SCTS,且有相當嚴重的邏輯讀和物理讀,我們也知道,大量的物理讀勢必會影響到系統的效能。
透過觀察SQL語句和讓他發過來的表結構明細,瞭解到列MS、SA、ICP_ID、SCTS均是varchar2型別。然後看了下MS列的選擇性:
MS COUNT(*)
------------ ----------
DB:0101 791
DB:0102 721
DB:0107 33
DB:0115 9309
DB:0116 9
DB:0182 35
DELIVRD 268197
EXPIRED 3532
MB:1042 4
MC:0055 5
MI:0000 202
MI:0057 4
MK:0000 151
MK:0029 2
MS_MO 213517
MS_MT 298401
REJECTD 47723
UNDELIV 153652
可以看出在整張表中,MS的distinct值不是很多,但每個值的重複度不一樣,甚至差距較大,這種情況下,可以考慮採用直方圖,步驟如下:
在MS列建立索引:
SQL>create index GJPT.U_MSG_1IX on GJPT.U_MSG(ms) tablespace idx_tbs;
收集列MS上的直方圖統計資訊:
SQL>exec
dbms_stats.gather_table_stats('GJPT','U_MSG',cascade=>true,method_opt =>
'for columns MS size 10');
做完以上兩步之後,再次看執行計劃時發現執行計劃沒有任何變化,汗…
思考一會之後,決定把整張表重新analyze下,方法如下:
SQL> begin
2
DBMS_STATS.GATHER_TABLE_STATS(ownname=>'GJPT',
3
tabname=>'U_MSG',
4
estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,
5
cascade=>true);
6
end;
7
/
PL/SQL 過程已成功完成。
分析完之後,再此看執行計劃:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
(Cost=36.58368284467 Card=1
ytes=2280)
1 0
COUNT (STOPKEY)
2 1
TABLE ACCESS (BY INDEX ROWID) OF 'U_MSG' (Cost=36.583682 84467 Card=10
Bytes=2280)
3 2 BITMAP CONVERSION (TO ROWIDS)
4 3 BITMAP AND
5 4 BITMAP CONVERSION (FROM ROWIDS)
6 5 INDEX (RANGE SCAN) OF
'INDEX_NEW_SA' (NON-UNIQUE) Cost=6 Card=828)
7 4 BITMAP CONVERSION (FROM ROWIDS)
8 7 INDEX (RANGE SCAN) OF 'U_MSG_1IX'
(NON-UNIQUE)
Cost=230 Card=828)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
10253 consistent gets
0 physical reads
0 redo size
2457 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
從這個執行計劃可以看出,physical reads降至0,consistent gets從之前的128746降至10253,其實10253這個值也不算小,實際環境中OS的記憶體和DB_CACHE_SIZE設定的也都比較小,如果加大sga,還可以更好的改善效能,更重要的是執行時間從原來的十餘分鐘降至0.2毫秒左右。
--- END ---
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25834554/viewspace-1050016/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直方圖均衡化直方圖
- 直方圖學習直方圖
- Oracle當number型別超過一定長度直方圖限制導致SQL執行計劃錯誤Oracle型別直方圖SQL
- 如何改善SQL Server + SharePoint組合效能BGSQLServer
- python如何畫直方圖Python直方圖
- halcon-直方圖均衡直方圖
- 直方圖中最大矩形直方圖
- [Python影象處理] 十一.灰度直方圖概念及OpenCV繪製直方圖Python直方圖OpenCV
- 自適應查詢執行:在執行時提升Spark SQL執行效能SparkSQL
- 【TUNE_ORACLE】列出必須建立直方圖的列SQL參考Oracle直方圖SQL
- [20210205]警惕toad下優化直方圖相關sql語句.txt優化直方圖SQL
- OpenCV計算機視覺學習(9)——影像直方圖 & 直方圖均衡化OpenCV計算機視覺直方圖
- elasticsearch 之 histogram 直方圖聚合ElasticsearchHistogram直方圖
- Matplotlib直方圖繪製技巧直方圖
- Redis不是一直號稱單執行緒效率也很高嗎,為什麼又採用多執行緒了?Redis執行緒
- 5種方法教你用Python玩轉histogram直方圖PythonHistogram直方圖
- 聊一聊MySQL的直方圖MySql直方圖
- [20221227]Adaptive Cursor Sharing & 直方圖.txtAPT直方圖
- 淺析MySQL 8.0直方圖原理MySql直方圖
- 一文搞懂直方圖均衡直方圖
- opencv——影像直方圖與反向投影OpenCV直方圖
- 【沃趣科技】直方圖系列1直方圖
- 你知道直方圖都能幹啥?直方圖
- OpenCV之影象直方圖均衡化OpenCV直方圖
- [20210205]警惕toad下優化直方圖相關sql語句3.txt優化直方圖SQL
- 柱狀圖、直方圖、散點圖、餅圖講解直方圖
- 【16位RAW影像處理三】直方圖均衡化及區域性直方圖均衡用於16點陣圖像的細節增強。直方圖
- 微課sql最佳化(7)、統計資訊收集(5)-關於直方圖SQL直方圖
- 深度學習(模型引數直方圖)深度學習模型直方圖
- 直方圖均衡化原理與實現直方圖
- 一文搞懂 Prometheus 的直方圖Prometheus直方圖
- 灰度直方圖均衡化及其實現直方圖
- matplotlib的直方圖繪製(筆記)直方圖筆記
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- sql語句執行順序與效能優化(1)SQL優化
- 用 Explain 命令分析 MySQL 的 SQL 執行AIMySql
- PHP執行sqlPHPSQL
- MyBatis SQL執行MyBatisSQL