我無法獲得正在查找的正確查詢(oracle)。 基本上我想要的是:使用sql查詢奇怪的速度更改
SELECT count(ck.id)
FROM claim_key ck
WHERE (ck.dte_of_srvce > (SYSDATE - INTERVAL '30' DAY))
AND ck.clm_type = 5
AND ck.prgrm_id = 1
解釋:
| Id | Operation | Name | Rows | Bytes | Cost | | 0 | SELECT STATEMENT | | 1 | 14 | 3080| | 1 | SORT AGGREGATE | | 1 | 14 | | | 2 | TABLE ACCESS BY INDEX ROWID| CLAIM_KEY | 6531 | 91434 | 3080| | 3 | INDEX SKIP SCAN | I_CLAIM_KEY_001 | 1306K| | 2813|
此查詢獲取我我想要的(平均爲20的結果),但需要10分鐘才能運行。
下面的查詢是不是很完整,但運行速度更快:
SELECT count(ck.id)
FROM claim_key ck
WHERE (ck.dte_of_srvce > (SYSDATE - INTERVAL '30' DAY))
AND ck.clm_type = 5
解釋:
| Id | Operation | Name | Rows | Bytes | Cost | | 0 | SELECT STATEMENT | | 1 | 11 | 9195 | | 1 | SORT AGGREGATE | | 1 | 11 | | | 2 | TABLE ACCESS FULL | CLAIM_KEY | 19592 | 210K| 9195 |
這將返回大約20爲好,雖然這只是僥倖,我可以」倚賴它,我需要包括prgrm_id。事情是,它只需要20秒。
下面的查詢是不是我要找的,但給人的性能的想法:
SELECT count(ck.id)
FROM claim_key ck
WHERE (ck.dte_of_srvce > (SYSDATE - INTERVAL '30' DAY))
| Id | Operation | Name | Rows | Bytes | Cost | | 0 | SELECT STATEMENT | | 1 | 8 | 4 | | 1 | SORT AGGREGATE | | 1 | 8 | | | 2 | INDEX FAST FULL SCAN| I_CLAIM_KEY_002 | 195K| 1530K| 4 |
這也需要20秒,但它返回的平均700條記錄。表claim_key大約有2500萬行。
該表上有多個索引。他們是:
IX_CLAIM_KEY_CREATED: CREATED_ON I_CLAIM_KEY_001: CLNC_STE_ID, PRVDR_ID, PRGRM_ID, UPDATED_ON I_CLAIM_KEY_002: SRCE_ID, PRVDR_ID, CLNC_ID, DTE_OF_SRVCE, PRGRM_ID I_CLAIM_KEY_003: CLNT_ID, DTE_OF_SRVCE I_CLAIM_KEY_004: TRNSMSN_ID, CLM_STTS I_CLAIM_KEY_005: UPDATED_ON I_CLAIM_KEY_006: PRVDR_ID, CMN_SRCE_ID PK_CLAIM_ID: ID
我想知道的是爲什麼添加prgrm_id減慢這麼多?我預料它會很快,因爲它只需要搜索(ck.dte_of_srvce > (SYSDATE - INTERVAL '30' DAY))
指定的700行。這是一個不正確的假設嗎?
編輯
在第一查詢中使用的提示/*+ FULL(ck) */
,它的執行時間下降,並且它會產生以下的計劃。
| Id | Operation | Name | Rows | Bytes | Cost | | 0 | SELECT STATEMENT | | 1 | 14 | 9195 | | 1 | SORT AGGREGATE | | 1 | 14 | | | 2 | TABLE ACCESS FULL | CLAIM_KEY | 6531 | 91434 | 9195 |
有關Oracle查詢性能問題的標準註釋:如果您可以發佈上述每個查詢的執行計劃,那麼人們將獲得更多有用的信息。 – 2010-08-06 18:26:19