[英]Providing Partition Key to partitioned table, increases query cost
我正在研究一個查詢包含大量數據的表的Web應用程序。 由於UI性能問題-我一直在研究改善長期運行查詢性能的方法。
請在下面查看我們原始代碼的示例和說明計划。
EXPLAIN PLAN FOR
SELECT * FROM T1
INNER JOIN T2 ON (T2.ID = T1.ID)
WHERE
T1.EMPLOYEE_ID = '1001'
AND T1.RUN_TIMESTAMP = '16-JAN-19 17.39.36.000000000'
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 37183 | 31M| | 37654 (1)| 00:00:02 |
|* 1 | HASH JOIN | | 37183 | 31M| 6688K| 37654 (1)| 00:00:02 |
|* 2 | TABLE ACCESS BY INDEX ROWID BATCHED| T1 | 37183 | 6245K| | 2492 (1)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | IDX_T1_RT | 76305 | | | 410 (1)| 00:00:01 |
| 4 | TABLE ACCESS FULL | T2 | 577K| 399M| | 14704 (1)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------------
分區表
為了提高查詢性能-我決定按值對大表T1進行分區。 創建了45個分區,這些分區覆蓋了表中每個條目所分配的45個不同的值。 就本示例而言-值1-45。
在將數據從T1遷移到分區表T1_PART並提供了不同的分區鍵之后,我很失望地看到盡管現在僅按預期掃描單個分區。 成本收益只是微不足道的。
EXPLAIN PLAN FOR
SELECT * FROM T1_PART
INNER JOIN T2 ON (T2.ID = T1.ID)
WHERE
T1.EMPLOYEE_ID = '1001'
AND T1.PARTITION_KEY = '1'
AND T1.RUN_TIMESTAMP = '16-JAN-19 17.39.36.000000000'
----------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19912 | 17M| | 37341 (1)| 00:00:02 | | |
|* 1 | HASH JOIN | | 19912 | 17M| 3680K| 37341 (1)| 00:00:02 | | |
| 2 | PARTITION LIST SINGLE | | 19912 | 3441K| | 2131 (1)| 00:00:01 | KEY | KEY |
|* 3 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1_PART | 19912 | 3441K| | 2131 (1)| 00:00:01 | 19 | 19 |
|* 4 | INDEX RANGE SCAN | IDX_T1_RT | 57355 | | | 276 (1)| 00:00:01 | 19 | 19 |
| 5 | TABLE ACCESS FULL | T2 | 577K| 403M| | 14706 (1)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------------------------------------------
但是,真正讓我感興趣的是-當我不再指定分區鍵時,查詢的成本大大降低了。
我們可以從計划中看出,我們現在對表進行完整掃描,但是現在使用我沒有想到的某種形式的並行化來執行。
EXPLAIN PLAN FOR
SELECT * FROM T1_PART
INNER JOIN T2 ON (T2.ID = T1.ID)
WHERE
T1.EMPLOYEE_ID = '1001'
AND T1.RUN_TIMESTAMP = '16-JAN-19 17.39.36.000000000'
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19912 | 17M| 16926 (1)| 00:00:01 | | | | | |
| 1 | PX COORDINATOR | | | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10002 | 19912 | 17M| 16926 (1)| 00:00:01 | | | Q1,02 | P->S | QC (RAND) |
|* 3 | HASH JOIN BUFFERED | | 19912 | 17M| 16926 (1)| 00:00:01 | | | Q1,02 | PCWP | |
| 4 | PX RECEIVE | | 19912 | 3519K| 2217 (1)| 00:00:01 | | | Q1,02 | PCWP | |
| 5 | PX SEND HYBRID HASH | :TQ10000 | 19912 | 3519K| 2217 (1)| 00:00:01 | | | Q1,00 | P->P | HYBRID HASH|
| 6 | STATISTICS COLLECTOR | | | | | | | | Q1,00 | PCWC | |
| 7 | PX PARTITION LIST ALL | | 19912 | 3519K| 2217 (1)| 00:00:01 | 1 | 45 | Q1,00 | PCWC | |
|* 8 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1_PART | 19912 | 3519K| 2217 (1)| 00:00:01 | 1 | 45 | Q1,00 | PCWP | |
|* 9 | INDEX RANGE SCAN | IDX_T1_RT | 57355 | | 383 (1)| 00:00:01 | 1 | 45 | Q1,00 | PCWP | |
| 10 | PX RECEIVE | | 577K| 403M| 14706 (1)| 00:00:01 | | | Q1,02 | PCWP | |
| 11 | PX SEND HYBRID HASH | :TQ10001 | 577K| 403M| 14706 (1)| 00:00:01 | | | Q1,01 | S->P | HYBRID HASH|
| 12 | PX SELECTOR | | | | | | | | Q1,01 | SCWC | |
| 13 | TABLE ACCESS FULL | T2 | 577K| 403M| 14706 (1)| 00:00:01 | | | Q1,01 | SCWP | |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有人知道這里可能會發生什么嗎? 有沒有辦法在SQL的並行執行中僅利用單個分區掃描?
謝謝您的幫助! 比利
編輯:
在這個例子中...
T1有625,417行
T2有577,718行
T1中的所有行都與T2上的連接條件匹配
T1中的57,355行匹配T1.EMPLOYEE_ID ='1001'並且T1.RUN_TIMESTAMP = '19 -JAN-19 17.39.36.000000000
T2在ID上具有唯一索引,並且未分區
我遇到的情況是我加入了兩個表,兩個表都已分區。 該查詢在第一個表上使用了索引,但對第二個表執行了全表掃描。 我在第二個表上添加了使用索引的提示。 有了這個提示,解釋計划使用第二個表上的索引顯示查詢。
如果您在T2.ID上有一個索引,建議您在查詢中為該索引添加一個提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.