(帽子提示在这里回答术语:Name for SELECT * FROM (VALUES (x,y)) AS TableLiteral(Col1, Col2)。非常感谢。)
我有一个大而复杂的查询(多个CTE,CTE引用回早期的CTE,WINDOWing函数,一些非常详细的WHERE子句等)。
数据有2个基于字符串的州列Foo
和Bar
有一次,我将行分为3类:
Foo
= x
和Bar
(p
,r
,{{1} })“或者......”在中等大小的数据集(100k行)上,查询的一个版本涉及将C定义为
t
在21秒内跑了。
然后我尝试了一个版本的查询,它重复了A& A的约束。 B,但不是他们。 那次跑得更愉快6秒,但显然非常WET。
然后我考虑尝试进一步尝试整个事情并定义此CTE,使用TableValued构造函数为任何给定的SELECT * FROM ALL
EXCEPT
(
SELECT * FROM A
UNION
SELECT * FROM B
)
和Foo
对定义类别:
Bar
并将相关列连接在一起,并根据这些JOIN中的“类别”列定义了我的类别CTE。
大!很好,干。
现在除了 28.5 分钟
<小时/> 是什么赋予了!? 为什么使用TVC似乎已经严重影响了 的性能。
我认识到这可能被视为X-Y问题,如果有人想就如何设计整个查询提出意见,那么我很乐意在其他地方详细介绍。但是现在我实际上想知道性能如何。我认为自己在SQL方面表现出色,而且性能差异完全令人震惊。
<小时/> 编辑:如果我可以说服公司给我SHOWPLAN权限,查询计划可能会即将到来。