Oracle SQL - 子查询工作正常,但是使用该子查询创建 Table 似乎挂起

Oracle SQL - Subquery Works fine, However Create Table with that subquery appears to hang

我有以下查询结构

CREATE TABLE <Table Name> AS 
(
   SELECT .... FROM ...
) 

当我 运行 自己执行 SELECT 语句时,这会在几秒钟内编译并 returns 结果。然而,当我 运行 使用 CREATE Table 语句时,它需要几个小时才能达到我认为它已挂起并且永远不会编译的地步。

这是什么原因?解决方法是什么?

如果您在某些 GUI 中 运行 SELECT,请注意它们中的大多数(如果不是全部)return 只有几百行,而不是整个结果集。例如:如果您的查询确实 return 有 2000 万行,GUI 会显示前 50(或 500,取决于您使用的工具)行,这有点令人困惑 - 就像它让您感到困惑一样。

如果您将当前查询用作内联视图,例如

select count(*)
from 
(select ... from ...)   --> this is your current query

它会 "force" Oracle 获取所有行,所以你会看到实际需要多长时间。

除此之外,看看SELECT是否可以优化,例如

  • 查看 WHERE 子句中使用的列是否已编入索引
  • 收集所有相关表的统计信息(在 FROM 子句中使用)
  • 删除ORDER BY条款(如果有;它与CTAS操作无关)
  • 检查说明计划

性能调优与我的建议相去甚远;这些只是您可能想要查看的一些建议。

您是否尝试过直接加载插入,首先使用 CTAS 创建 table,其中 1= 2,然后进行插入。这至少会告诉我们数据是否有问题(损坏的数据)或者是否是性能问题。

我之前遇到过同样的问题,因为新数据太大(700万行),我花了3个小时来执行代码。

我最好的建议是创建一个视图,因为它花费更少 space 而不是新的 table。

所以这个问题的答案。

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
)  

问题是 BETWEEN 语句与同一时间段不匹配,子查询查看的数据比主查询多(我猜这会导致对表进行全面扫描?)

下面的查询在语句时间段之间进行了匹配,并且在不到 3 分钟的时间内返回了结果。

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
)