【发布时间】:2011-10-18 04:37:45
【问题描述】:
我有一个简单的查询,它选择由其他索引列过滤的列之一排序的前 200 行。令人困惑的是为什么 PL/SQL Developer 中的查询计划显示,当我选择所有行时,仅使用此索引,例如:
SELECT * FROM
(
SELECT *
FROM cr_proposalsearch ps
WHERE UPPER(ps.customerpostcode) like 'MK3%'
ORDER BY ps.ProposalNumber DESC
)
WHERE ROWNUM <= 200
Plan 显示它使用索引 CR_PROPOSALSEARCH_I1,它是两列上的索引:PROPOSALNUMBER & UPPER(CUSTOMERNAME),这需要 0.985s 来执行:
如果我摆脱了 ROWNUM 条件,那么计划就是我所期望的,它会在 0.343s 内执行:
在哪里index XIF25CR_PROPOSALSEARCH is on CR_PROPOSALSEARCH (UPPER(CUSTOMERPOSTCODE));
怎么会?
编辑:我收集了cr_proposalsearch 表的统计信息,现在两个查询计划都显示它们使用XIF25CR_PROPOSALSEARCH 索引。
【问题讨论】:
-
两个不同的查询,两个不同的结果集,为什么不应该有两个不同的解释计划?
标签: sql oracle optimization plsql indexing