将 case 语句切换到常量会大大减慢查询速度



我在SQL Server 2017中遇到了一个问题,其中替换了:

  • 分配数值的CASE语句
  • 具有恒定的数值

将查询速度减慢为 6+ 的系数。

相当复杂的查询具有以下一般形式:

WITH CTE1 AS
(
...
),
WITH CTE2 AS 
(
SELECT
--conditions based on below
FROM 
(SELECT
--various math,
CASE 
--statement assigning values to different runID combinations for samples with matching siteIDs and dates (due to the ON statement below)
ELSE NULL
....
END AS whichCombination
FROM 
CTE1 AS value1
JOIN 
CTE1 AS value2 ON (value1.siteID = value2.siteID, 
value1.date = value2.date, 
value1.sampleID <> value2.sampleID)
) AS combinations
WHERE combinations.whichCombination IS NOT NULL
)
SELECT various data
FROM dataTable
LEFT JOIN 
(stuff from CTE2) AS pairTable ON dataTable.sampleID = pairTable.sampleID

CASE语句将一对编号分配给自连接中的不同行组合。

然后,这用于仅选择我想要的组合。

但是,当CASE语句替换为:1 AS whichCombination(一个常量值,因此没有为任何行分配 NULL(时,查询会显著减慢。如果使用CASE WHEN 1 = 1 THEN 1也会发生这种情况。

这对我来说毫无意义,因为无论哪种方式,值都是:

  • 数值的
  • 不是唯一的
  • 不是索引

唯一唯一的是,每个行组合都被分配了一个唯一的值。

SQL Server是否以某种方式将其用作加快速度的索引?

如果没有 CASE 语句,我将如何复制此行为,因为此答案说您无法为 CTE 创建索引?

编辑:同样值得注意的是,仅当包含主选择语句(最后5行(时,才会发生减速(即,如果CTE2作为主选择语句而不是CTE运行(


贝斯特,京东

一种解决方法是将这些 CTE 拆分为临时表,然后您可以根据需要添加索引。

最新更新