select count(*)
from
(select ... from ...) --> this is your current query
它将“强制”oracle获取所有行,这样您就可以看到实际需要多长时间。 除此之外,看看 SELECT 可以优化,例如。 查看是否在 WHERE 子句被索引 收集所有相关表的统计信息(用于 FROM 条款) 删除 ORDER BY 条款(如有;与ctas操作无关) 检查说明计划 性能调优远不是我建议的那样;这些只是一些建议,你可能想看看。
CREATE TABLE <Table Name> AS
(
SELECT foo
FROM baa
LEFT JOIN
( SELECT foo FROM baa WHERE DATES BETWEEN SYSDATE AND SYSDATE - 100 )
WHERE DATES_1 BETWEEN SYSDATE - 10 AND SYSDATE - 100
)
CREATE TABLE <Table Name> AS
(
SELECT foo FROM baa
LEFT JOIN ( SELECT foo FROM baa WHERE DATES BETWEEN SYSDATE - 10 AND SYSDATE - 100 )
WHERE DATES_1 BETWEEN SYSDATE - 10 AND SYSDATE - 100
)
4条答案
按热度按时间2j4z5cfb1#
如果你跑的话
SELECT
在一些gui中,请注意,大多数(如果不是全部)只返回几百行,而不是整个结果集。例如:如果您的查询真的返回2000万行,gui会显示前50行(或500行,取决于您使用的工具),这有点让人困惑——就像它让您困惑一样。如果将当前查询用作内联视图,例如。
它将“强制”oracle获取所有行,这样您就可以看到实际需要多长时间。
除此之外,看看
SELECT
可以优化,例如。查看是否在
WHERE
子句被索引收集所有相关表的统计信息(用于
FROM
条款)删除
ORDER BY
条款(如有;与ctas操作无关)检查说明计划
性能调优远不是我建议的那样;这些只是一些建议,你可能想看看。
zzoitvuj2#
您是否尝试过直接加载insert,方法是首先使用ctas(其中1=2)创建表,然后执行insert。这将至少告诉我们数据中是否有任何错误(损坏的数据)或者是否有性能问题。
eulz3vhy3#
我以前也遇到过同样的问题,因为新数据太大(700万行),执行代码花了我3个小时。
我最好的建议是创建一个视图,因为它占用的空间更少,而不是一个新表。
kiz8lqtg4#
所以这个问题的答案是。
问题是between语句与同一时间段不匹配,子查询查看的数据比主查询多(我猜这会导致对表的完全扫描?)
下面的查询具有语句时间段之间的匹配,此查询在3分钟内返回结果。