生產環境sql語句調優實戰第二篇
Global Information: EXECUTING
Instance ID | : | 1 |
|
||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Session | : | PRODUSER(14:22343) | |||||||||||||||||||||
SQL ID | : | fkzafpjs28d6d | |||||||||||||||||||||
SQL Execution ID | : | 16777216 | |||||||||||||||||||||
Execution Started | : | 07/17/2014 12:02:17 | |||||||||||||||||||||
First Refresh Time | : | 07/17/2014 12:02:21 | |||||||||||||||||||||
Last Refresh Time | : | 07/17/2014 16:51:01 | |||||||||||||||||||||
Duration | : | 17328s | |||||||||||||||||||||
Module/Action | : | xxxxxxx (TNS V1-V3)/- | |||||||||||||||||||||
Service | : | PRODB | |||||||||||||||||||||
Program | : | NextPricePl@XXXX(TNS V1-V3) | |||||||||||||||||||||
Fetch Calls | : | 2671 |
--》對應的sql語句如下:
select document.period_key,
document.cycle_seq_no,
document.ba_no,
document.customer_no,
bill_statement.pay_channel_no
from document, --千萬資料量 12671016 rows
cycle_control, --資料字典表,2118 rows
bill_statement, --千萬資料量 12671016 rows
cyc_payer_pop --百萬資料量 5400326 rows
where cycle_control.cycle_code = 2
and cycle_control.cycle_instance = 7
and cycle_control.cycle_year = 2014
and cyc_payer_pop.cycle_seq_no = cycle_control.cycle_seq_no
and cyc_payer_pop.db_status = 'BL'
and document.ba_no = cyc_payer_pop.ba_no
and document.cycle_seq_no = cyc_payer_pop.cycle_seq_no
and document.cycle_seq_run = cyc_payer_pop.cycle_seq_run
and document.period_key = cyc_payer_pop.period_key
and document.customer_key = cyc_payer_pop.customer_key
and document.doc_produce_ind in ('Y ', ' E ')
and document.document_status != ' N'
and bill_statement.ba_no = cyc_payer_pop.ba_no
and bill_statement.cycle_seq_no = document.cycle_seq_no
and bill_statement.cycle_seq_run = document.cycle_seq_run
and bill_statement.period_key = cyc_payer_pop.period_key
and bill_statement.customer_key = cyc_payer_pop.customer_key
and bill_statement.document_seq_no = document.doc_seq_no
可以透過執行計劃看到,效能的瓶頸主要在兩個地方,一個是做了全表掃描的部分 表CYC_PAYER_POP,另外一個就是CPU資源的過度消耗,表DOCUMENT
SQL Plan Monitoring Details (Plan Hash Value=1606258714)
Id | Operation | Name |
Estimated Rows |
Cost |
Active Period (17328s) |
Execs | Rows | Memory | Temp | IO Requests | CPU Activity | Wait Activity | Progress | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-> | 0 | SELECT STATEMENT |
. |
. |
. |
|
1 | 270K |
. |
. |
|
|
|
. |
||||||||||
-> | 1 | . NESTED LOOPS |
. |
. |
. |
|
1 | 270K |
. |
. |
|
. |
. |
. |
||||||||||
-> | 2 | .. NESTED LOOPS |
. |
1 | 16500 |
|
1 | 270K |
. |
. |
|
|
|
. |
||||||||||
-> | 3 | ... NESTED LOOPS |
. |
23 | 16497 |
|
1 | 270K |
. |
. |
|
. |
. |
. |
||||||||||
-> | 4 | .... NESTED LOOPS |
. |
56 | 16441 |
|
1 | 270K |
. |
. |
|
. |
. |
. |
||||||||||
. |
5 | ..... TABLE ACCESS BY INDEX ROWID | CYCLE_CONTROL | 1 | 1 |
|
1 | 1 |
. |
. |
|
. |
. |
. |
||||||||||
-> | 6 | ...... INDEX UNIQUE SCAN | CYCLE_CONTROL_1UQ | 1 | 1 |
|
1 | 1 |
. |
. |
|
. |
. |
. |
||||||||||
-> | 7 | .....PARTITION RANGE ALL |
. |
56 | 16440 |
|
1 | 270K |
. |
. |
|
. |
. |
. |
||||||||||
-> | 8 | ...... TABLE ACCESS FULL | CYC_PAYER_POP | 56 | 16440 |
|
171 | 270K |
. |
. |
|
|
|
|
||||||||||
-> | 9 | ....PARTITION RANGE ITERATOR |
. |
1 | 1 |
|
270K | 270K |
. |
. |
|
|
|
. |
||||||||||
-> | 10 | ..... TABLE ACCESS BY LOCAL INDEX ROWID | DOCUMENT | 1 | 1 |
|
270K | 270K |
. |
. |
|
|
|
. |
||||||||||
-> | 11 | ...... INDEX RANGE SCAN | DOCUMENT_1IX | 10 | 1 |
|
270K | 2M |
. |
. |
|
|
|
. |
||||||||||
-> | 12 | ...PARTITION RANGE ITERATOR |
. |
1 | 1 |
|
301K | 270K |
. |
. |
|
|
|
. |
||||||||||
-> | 13 | .... INDEX UNIQUE SCAN | BILL_STATEMENT_1IX | 1 | 1 |
|
301K | 270K |
. |
. |
|
|
|
. |
||||||||||
-> | 14 | .. TABLE ACCESS BY LOCAL INDEX ROWID | BL1_BILL_STATEMENT | 1 | 1 |
|
324K | 270K |
. |
. |
|
|
|
. |
可以看到CYC_PAYER_POP 做了全表掃描,估算出的資料條數是56條。
而絕大多數的IO都是在DOCUMENT,IO請求達1700萬次,大約是128G的資料量,而且還不停的走索引做資料查取。
奇怪的是估算的資料返回量和實際執行的資料返回差距太大,返回結果大約有27萬條。
-> | 8 | ...... TABLE ACCESS FULL | CYC_PAYER_POP | 56 | 16440 |
|
171 | 270K |
. |
. |
|
但是第8步的資料得到。 一次56條資料返回* 執行171次=9.5k 但是實際的返回結果得到了270K,差距實在太大。這是執行計劃不正確導致的。
明確了上面一步,下面DOCUMENT表做了1700萬次的io查詢就可以理解了,這些都是連帶的問題。
從千萬的資料中得到27萬的資料,還是很小的資料範圍。
首先排查 得到從資料字典表cycle_control中根據如下的條件,得到的資料只有一行。這和執行計劃是一致的。
cycle_control.cycle_code = 2
and cycle_control.cycle_instance = 7
and cycle_control.cycle_year = 2014
因為document和bill_statement都是千萬資料量的大表。所以在和它們兩個表做資料關聯的時候應該儘可能的過濾掉大部分資料。因為資料最終的返回只有27萬,相對千萬的資料還是很小的一部分。從百萬的資料中走全表掃描還是不小的消耗,看看能不能從索引的角度入手。
索引資訊如下:
INDEX_NAME TABLESPACE INDEX_TYPE UNIQUENES PAR COLUMN_LIST TABLE_TYPE STATUS NUM_ROWS LAST_ANAL
------------------------------ ---------- ---------- --------- --- ------------------------------ ---------- ------ ---------- ---------
CYC_PAYER_POP_1IX NORMAL NONUNIQUE YES CUSTOMER_NO TABLE N/A 5320775 16-JUL-14 N
CYC_PAYER_POP_2IX NORMAL NONUNIQUE YES CONFIRM_GROUP,CYCLE_SEQ_NO TABLE N/A 5642000 16-JUL-14 N
CYC_PAYER_POP_3IX NORMAL NONUNIQUE YES FORMAT_EXT_GROUP,CYCLE_SEQ_NO, TABLE N/A 5623545 16-JUL-14 N
DB_STATUS
CYC_PAYER_POP_4IX NORMAL NONUNIQUE YES GROUP_ID,CYCLE_SEQ_NO TABLE N/A 5142606 16-JUL-14 N
CYC_PAYER_POP_5IX NORMAL NONUNIQUE YES QA_GROUP,CYCLE_SEQ_NO TABLE N/A 5776258 16-JUL-14 N
CYC_PAYER_POP_PK NORMAL UNIQUE YES BA_NO,CYCLE_SEQ_NO,PERIOD_KEY, TABLE N/A 5368484 16-JUL-14 N
碰巧的是在資料的連線條件和輸出列中,都是和主鍵相關的一些列。這樣就可以考慮透過hint來啟用索引了。當然啟用索引也有一定的標準,在這個查詢中。
透過索引和過濾條件查到的資料有不到30萬,資料量是500多萬,佔到的資料比例不到10%,是可以考慮啟用索引的。如果資料結果集較大,啟用索引反而不利於資料的查詢速度。
明確了這一點,我嘗試把CYC_PAYER_POP的查詢和資料字典表結合起來,過濾掉絕大部分資料。形成一個子查詢。
在子查詢中,啟用了hint來強制查詢按照計劃的順序和索引來執行。
(select /*+ leading (c p) index(p CYC_PAYER_POP_PK)*/
p.ba_no,p.cycle_seq_no,p.cycle_seq_run,p.period_key,p.customer_key
from cyc_payer_pop p, cycle_control c
where c.cycle_code = 2
and c.cycle_instance = 7
and c.cycle_year = 2014
and p.cycle_seq_no = c.cycle_seq_no
and p.db_status = 'BL' ) cyc_payer_pop
然後在這個基礎上,再和兩個大表做關聯,
最佳化後的sql語句如下:
select /*+ leading( cyc_payer_pop bill_statement document)*/
document.period_key,
document.cycle_seq_no,
document.ba_no,
document.customer_no,
bill_statement.pay_channel_no
from document, --千萬資料量 12671016 rows
bill_statement ,--千萬資料量 12671016 rows
(select /*+ leading (c p) index(p CYC_PAYER_POP_PK)*/
p.ba_no,p.cycle_seq_no,p.cycle_seq_run,p.period_key,p.customer_key
from cyc_payer_pop p, cycle_control c
where c.cycle_code = 2
and c.cycle_instance = 7
and c.cycle_year = 2014
and p.cycle_seq_no = c.cycle_seq_no
and p.db_status = 'BL' ) cyc_payer_pop
where
and document.ba_no = cyc_payer_pop.ba_no
and document.cycle_seq_no = cyc_payer_pop.cycle_seq_no
and document.cycle_seq_run = cyc_payer_pop.cycle_seq_run
and document.period_key = cyc_payer_pop.period_key
and document.customer_key = cyc_payer_pop.customer_key
and document.doc_produce_ind in ('Y ', ' E ')
and document.document_status != ' N'
and bill_statement.ba_no = cyc_payer_pop.ba_no
and bill_statement.cycle_seq_no = document.cycle_seq_no
and bill_statement.cycle_seq_run = document.cycle_seq_run
and bill_statement.period_key = cyc_payer_pop.period_key
and bill_statement.customer_key = cyc_payer_pop.customer_key
and bill_statement.document_seq_no = document.doc_seq_no
最佳化後的執行計劃如下。document表的io請求數從1700萬次,降低到了將近8萬次。解決了效能瓶頸。
SQL Plan Monitoring Details (Plan Hash Value=1573871804)
Id | Operation | Name |
Estimated Rows |
Cost |
Active Period (247s) |
Execs | Rows |
Memory (Max) |
Temp (Max) |
IO Requests | CPU Activity | Wait Activity | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
. |
0 | SELECT STATEMENT |
. |
. |
. |
|
1 | 291K |
. |
. |
|
. |
. |
||||||||||
. |
1 | . NESTED LOOPS |
. |
. |
. |
|
1 | 291K |
. |
. |
|
. |
. |
||||||||||
. |
2 | .. NESTED LOOPS |
. |
1 | 5406 |
|
1 | 291K |
. |
. |
|
. |
. |
||||||||||
. |
3 | ... NESTED LOOPS |
. |
27 | 5403 |
|
1 | 291K |
. |
. |
|
. |
. |
||||||||||
. |
4 | .... NESTED LOOPS |
. |
56 | 5347 |
|
1 | 291K |
. |
. |
|
. |
. |
||||||||||
. |
5 | ..... TABLE ACCESS BY INDEX ROWID | CYCLE_CONTROL | 1 | 1 |
|
1 | 1 |
. |
. |
|
. |
. |
||||||||||
. |
6 | ...... INDEX UNIQUE SCAN | CYCLE_CONTROL_1UQ | 1 | 1 |
|
1 | 1 |
. |
. |
|
. |
. |
||||||||||
. |
7 | .....PARTITION RANGE ALL |
. |
56 | 5346 |
|
1 | 291K |
. |
. |
|
. |
. |
||||||||||
. |
8 | ...... TABLE ACCESS BY LOCAL INDEX ROWID | CYC_PAYER_POP | 56 | 5346 |
|
181 | 291K |
. |
. |
|
|
|
||||||||||
. |
9 | .......INDEX FULL SCAN | CYC_PAYER_POP_PK | 29672 | 2540 |
|
181 | 479K |
. |
. |
|
|
|
||||||||||
. |
10 | ....PARTITION RANGE ITERATOR |
. |
1 | 1 |
|
291K | 291K |
. |
. |
|
. |
. |
||||||||||
. |
11 | ..... TABLE ACCESS BY LOCAL INDEX ROWID | DOCUMENT | 1 | 1 |
|
291K | 291K |
. |
. |
|
|
|
||||||||||
. |
12 | ...... INDEX RANGE SCAN | DOCUMENT_1IX | 10 | 1 |
|
291K | 2M |
. |
. |
|
|
|
||||||||||
. |
13 | ...PARTITION RANGE ITERATOR |
. |
1 | 1 |
|
294K | 291K |
. |
. |
|
. |
. |
||||||||||
. |
14 | .... INDEX UNIQUE SCAN | BILL_STATEMENT_1IX | 1 | 1 |
|
294K | 291K |
. |
. |
|
|
|
||||||||||
. |
15 | .. TABLE ACCESS BY LOCAL INDEX ROWID | BILL_STATEMENT | 1 | 1 |
|
308K | 291K |
. |
. |
|
|
|
當然了關鍵的還是查取速度。
查詢速度也從原本的5個小時降低到了4-5分鐘。
在測試和生產環境中實際執行的速度和預期是一致的。
290896 rows selected.
Elapsed: 00:04:08.04
291001 rows selected.
Elapsed: 00:05:08.66
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1349317/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 生產環境sql語句調優實戰第三篇SQL
- 生產環境sql語句調優實戰第四篇SQL
- 生產環境sql語句調優實戰第五篇SQL
- 生產環境sql語句調優實戰第六篇SQL
- 生產環境sql語句調優實戰第八篇SQL
- 生產環境sql語句調優實戰第九篇SQL
- 生產環境sql語句調優實戰第七篇SQL
- 生產環境sql語句調優實戰第十篇SQL
- 生產環境大型sql語句調優實戰第一篇(一)SQL
- 生產環境大型sql語句調優實戰第一篇(二)SQL
- kafka生產環境規劃-kafka 商業環境實戰Kafka
- 使用hint來調優sql語句SQL
- 實戰生產環境vCenter HA配置(VCSA6.5)
- kafka生產者Producer引數設定及引數調優建議-kafka 商業環境實戰Kafka
- Eureka:生產環境優化總結。優化
- 生產系統pl/sql調優案例SQL
- MySQL調優篇 | SQL調優實戰(5)MySql
- SQL 語句調優_減少或者避免笛卡爾乘積的發生SQL
- oracle 對比sql語句執行環境OracleSQL
- 生產sql調優之統計資訊分析SQL
- 透過使用hint unnest調優sql語句SQL
- 通過使用hint unnest調優sql語句SQL
- 生產SQL語句突然變慢問題定位SQL
- 一條sql語句的建議調優分析SQL
- redmine生產環境搭建
- Django生產環境搭建Django
- SQL語句優化SQL優化
- 使用USE_HASH Hint調優一個SQL語句SQL
- 使用SQL調整顧問進行語句優化SQL優化
- HBase 核心元件協調及RegionServer JVM引數調優-OLAP商業環境實戰元件ServerJVM
- Vue 移動端專案生產環境的優化Vue優化
- MYSQL SQL語句優化MySql優化
- sql語句效能優化SQL優化
- SQL語句的優化SQL優化
- 求助:SQL語句優化SQL優化
- Java生產環境效能監控與調優—基於JDK命令列工具的監控JavaJDK命令列
- SQL Server優化之SQL語句優化SQLServer優化
- soar-PHP - SQL 語句優化器和重寫器的 PHP 擴充套件包、 方便框架中 SQL 語句調優PHPSQL優化套件框架