是否可以将任何使用临时表的 SQL 查询重写为基于集合的查询? [已关闭]

问题描述 投票:0回答:1

通常,在 SQL 中处理复杂查询时,我会使用一个或多个临时表,将问题分解为更小的部分:我会创建一个新的临时表或(表变量),将一些数据保存到临时表中,使用该临时表创建另一个临时表,依此类推。直到最后,我从最后一个临时表中选择作为我的输出。这样做的原因是,对于一个非常复杂的问题,通过单个基于集合的操作来获得最终答案并不总是显而易见的。

我知道,一般来说,临时表被认为是次优解决方案,通常可以通过编写纯粹基于集合的查询(JOIN、WHERE 子句、子查询等)来优化

您可以将使用临时表的任何 SQL 查询重写为纯粹基于集合的查询吗?

sql sql-server query-optimization set-theory
1个回答
1
投票

从理论角度来看,您始终可以编写基于中间结果的查询,作为使用 CTE(通用表表达式)的单个查询。

例如,如果您有 3 个“真实表”X、Y 和 Z,并且有 4 个临时表来保存中间结果,则该过程可能如下所示:

create table a as select ... from x join y join z;
create table b as select ... from a join x; -- dependency on a
create table c as select ... from y;
create table d as select ... from a, b, c; -- dependency on a, b, and c
select from a join b join c join d; -- final query

使用 CTES 组装的查询,可以如下所示:

with
a as (select ... from x join y join z),
b as (select ... from a join x),
c as (select ... from y),
d as (select ... from a, b, c)
select from a join b join c join d;

从实践的角度来看,物化中间表确实有一些好处。其一,您可以更轻松地检查和调试。 此外,如果您适当地索引这些具体结果,有时可以提高性能。

缺点是您正在消耗[大量]表空间。此外,当组合为 CTE 时,某些引擎足够智能,可以以不同的方式“理清”并完全重新组织(技术术语是“重新表述查询”)查询集,从而执行速度可能更快,但即使如此,关于;从这个意义上说,有些引擎确实很聪明。它们还可以通过管道传输中间结果集,而如果您具体化它们,则无法做到这一点。

总体而言,运行你的马。

如果您有带宽,请尝试两者,看看哪一个更适合您。有时调试中间结果的能力至关重要。其他时候,性能才是驱动因素。一切都取决于您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.