sql - 选择计数需要很长时间才能返回
问题描述
我正在做一个在 3 秒内完成的复杂查询:
WITH
Query1 as
( select ...
),
Query2 as
( select ... from Query1 ...
),
ComplexQuery AS
( select ... from Query2 ...
)
select * from ComplexQuery;
除了这些查询之外,还有很多操作,例如GROUP BY, ORDER BY, UNION
.
但是当我用这个改变最后一行时:
select count (*) from ComplexQuery;
这会产生一种奇怪的效果。查询开始执行很长时间。我等了大约 30 分钟,然后停下来。
我预计,由于原始查询在 3 秒内执行,计数应该需要大约 0.01 秒,因此总时间为 3.01 秒。相反,我看到的是计数似乎开始了某种涉及所有先前子查询的递归——这是我能想象的。
正常Oracle/SQL
吗?或者,为什么会这样?我怎样才能避免这个问题?
解决方案
您可以尝试提示优化器通过以下方式实现中间步骤/*+MATERIALIZE*/
:
WITH Query1 as ( select /*+MATERIALIZE*/ ...)
,Query2 as ( select /*+MATERIALIZE*/ ... from Query1 ...)
,ComplexQuery AS ( select /*+MATERIALIZE*/ ... from Query2 ...)
select count (*) from ComplexQuery;
推荐阅读
- php - 谷歌应用商店销售报告下载自动化
- php - 在php中将第一个值从数据库设置到底部
- vue.js - Framework7 选项卡
- java - 模块化应用程序 UI 测试脚本的最佳方法是什么?
- angular - 模态弹出窗口以角度显示
- javascript - 无法在 JavaScript 音板中播放音频(此处为新手)
- sql - 存在查询未产生预期结果时的 T-SQL 案例
- powershell - New-ComplianceSearchAction 参数“ShareRootPath”无效
- powershell - 从 Excel 粘贴数据并转换为数组?
- ruby-on-rails - 模块中的类可以预加载吗?