【发布时间】:2011-03-26 10:33:51
【问题描述】:
我无法为我正在寻找的内容获取正确的查询 (oracle)。 基本上我想要的是:
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
解释:
|身份证 |操作 |姓名 |行 |字节 |成本 | | 0 |选择声明 | | 1 | 14 | 3080| | 1 |排序聚合 | | 1 | 14 | | | 2 |按索引 ROWID 访问表| CLAIM_KEY | 6531 | 91434 | 3080| | 3 |索引跳过扫描 | 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
解释:
|身份证 |操作 |姓名 |行 |字节 |成本 | | 0 |选择声明 | | 1 | 11 | 9195 | | 1 |排序聚合 | | 1 | 11 | | | 2 |表访问完全 | 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))
|身份证 |操作 |姓名 |行 |字节 |成本 |
| 0 |选择声明 | | 1 | 8 | 4 |
| 1 |排序聚合 | | 1 | 8 | |
| 2 |索引快速全扫描| 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) */,它的执行时间会下降,并生成以下计划。
【问题讨论】:
-
Oracle 查询性能问题的标准注释:如果您可以发布上述每个查询的执行计划,人们将获得更多有用的信息。