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 语句时,它需要几个小时才能达到我认为它已挂起并且永远不会编译的地步。
这是什么原因?解决方法是什么?
- Oracle 数据库 12c <12.1.0.2.0>
如果您在某些 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
)
我有以下查询结构
CREATE TABLE <Table Name> AS
(
SELECT .... FROM ...
)
当我 运行 自己执行 SELECT 语句时,这会在几秒钟内编译并 returns 结果。然而,当我 运行 使用 CREATE Table 语句时,它需要几个小时才能达到我认为它已挂起并且永远不会编译的地步。
这是什么原因?解决方法是什么?
- Oracle 数据库 12c <12.1.0.2.0>
如果您在某些 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
)