oraclesql-subquery工作正常,但是create table with the subquery似乎挂起了

gudnpqoy  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(334)

我有以下查询结构

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

当我自己运行select语句时,它会在几秒钟内编译并返回结果。但是,当我使用createtable语句运行它时,我认为它需要几个小时才能挂起,并且永远不会编译。
原因是什么?那周围的工作会是什么呢?
oracle数据库12c<12.1.0.2.0>

2j4z5cfb

2j4z5cfb1#

如果你跑的话 SELECT 在一些gui中,请注意,大多数(如果不是全部)只返回几百行,而不是整个结果集。例如:如果您的查询真的返回2000万行,gui会显示前50行(或500行,取决于您使用的工具),这有点让人困惑——就像它让您困惑一样。
如果将当前查询用作内联视图,例如。

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

它将“强制”oracle获取所有行,这样您就可以看到实际需要多长时间。
除此之外,看看 SELECT 可以优化,例如。
查看是否在 WHERE 子句被索引
收集所有相关表的统计信息(用于 FROM 条款)
删除 ORDER BY 条款(如有;与ctas操作无关)
检查说明计划
性能调优远不是我建议的那样;这些只是一些建议,你可能想看看。

zzoitvuj

zzoitvuj2#

您是否尝试过直接加载insert,方法是首先使用ctas(其中1=2)创建表,然后执行insert。这将至少告诉我们数据中是否有任何错误(损坏的数据)或者是否有性能问题。

eulz3vhy

eulz3vhy3#

我以前也遇到过同样的问题,因为新数据太大(700万行),执行代码花了我3个小时。
我最好的建议是创建一个视图,因为它占用的空间更少,而不是一个新表。

kiz8lqtg

kiz8lqtg4#

所以这个问题的答案是。

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
)

相关问题