CTE中具有表值的构造函数的性能

时间:2017-08-02 17:15:45

标签: sql sql-server performance

(帽子提示在这里回答术语:Name for SELECT * FROM (VALUES (x,y)) AS TableLiteral(Col1, Col2)。非常感谢。)

我有一个大而复杂的查询(多个CTE,CTE引用回早期的CTE,WINDOWing函数,一些非常详细的WHERE子句等)。

数据有2个基于字符串的州列FooBar 有一次,我将行分为3类:

  • A类(根据Foo = xBarpr,{{1} })“或者......”
  • B类(基于不同的,不相交的,但仍然冗长的类似条件。)
  • C类(其他所有)

在中等大小的数据集(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权限,查询计划可能会即将到来。

0 个答案:

没有答案