【发布时间】:2013-01-29 03:44:46
【问题描述】:
我在使用子查询返回第一行的以下(示例)选择语句中遇到性能问题:
SELECT ITEM_NUMBER,
PROJECT_NUMBER,
NVL((SELECT DISTINCT
FIRST_VALUE(L.LOCATION) OVER (ORDER BY L.SORT1, L.SORT2 DESC) LOCATION
FROM LOCATIONS L
WHERE L.ITEM_NUMBER=P.ITEM_NUMBER
AND L.PROJECT_NUMBER=P.PROJECT_NUMBER
),
P.PROJECT_NUMBER) LOCATION
FROM PROJECT P
DISTINCT 通过执行SORT 和UNIQUE 导致性能问题,但我想不出替代方案。
但是,我更喜欢类似于以下内容的内容,但在 2 个 select 语句中引用不起作用:
SELECT ITEM_NUMBER,
PROJECT_NUMBER,
NVL((SELECT LOCATION
FROM (SELECT L.LOCATION LOCATION
ROWNUM RN
FROM LOCATIONS L
WHERE L.ITEM_NUMBER=P.ITEM_NUMBER
AND L.PROJECT_NUMBER=P.PROJECT_NUMBER
ORDER BY L.SORT1, L.SORT2 DESC
) R
WHERE RN <=1
), P.PROJECT_NUMBER) LOCATION
FROM PROJECT P
另外: - 我的权限不允许我创建函数。 - 我在主查询中循环浏览 10k 到 100k 条记录。 - 子查询在限制为 1 行之前可以返回 3 到 7 行。
感谢任何有助于提高性能的帮助。
【问题讨论】:
-
使用 ROW_NUMBER 代替 FIRST_VALUE
-
您如何知道 DISTINCT 是导致您的性能问题的原因?仅仅因为您在解释计划中看到 SORT / UNIQUE 并不意味着您的查询实际上正在排序或对大量数据进行排序,更不用说对其性能产生影响了。发布您的解释计划。
-
@JeffreyKemp,+1 你提出了很好的观点。我知道 EXPLAIN PLAN 和 PERFORMANCE 之间没有直接联系(也不想争论),但是以我的方式获得解决方案所涉及的额外工作量,我确定我错过了一个简单的解决方案。我只能去当EXPLAIN来估计系统正在做的工作。
标签: sql oracle oracle10g subquery