我有一个带有一个主表和多个历史/日志表的数据库,该数据库存储主表某些行的属性随时间的演变。这些属性未存储在主表本身上,但必须从相关的历史记录/日志表中查询。所有这些表都很大(以GB为单位)。
我想转储整个主表并加入所有历史记录/日志表的最后一个条目。
目前,我通过以下子查询来执行此操作:
WITH
foo AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY date DESC) AS rownumber,
...
FROM table1),
bar AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY date DESC) AS rownumber,
...
FROM table2)
SELECT
...
FROM maintable mt
JOIN foo foo ON foo.itemid = mt.itemid AND foo.rownumber = 1
JOIN bar bar ON foo.itemid = mt.itemid AND bar.rownumber = 1
WHERE ...
问题是这非常慢。是否有解决此问题的更快方法?
只允许我对此数据库执行只读查询:我无法对其进行任何更改。
在实际的Oracle版本中,通常最好使用侧向/ CROSS APPLY,因为CBO(基于Oracle成本的优化器)可以转换它们(DCL-lateral view decorrelation
转换),并根据您的情况/条件(表统计信息,基数等)使用最佳联接方法。 。
所以会是这样的:
SELECT
...
FROM maintable mt
CROSS APPLY (
SELECT *
FROM table1
WHERE table1.itemid = mt.itemid
ORDER BY date DESC
fetch first 1 row only
)
CROSS APPLY (
SELECT *
FROM table2
WHERE table2.itemid = mt.itemid
ORDER BY date DESC
fetch first 1 row only
)
WHERE ...
PS。您尚未指定oracle版本,所以我的答案是针对Oracle 12+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句