开发者社区> 问答> 正文

将case语句切换为常量会大大降低查询速度

我在替换SQL Server 17时遇到问题:

分配数值的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作为主选择语句而不是bieng CTE运行),才会发生减速

展开
收起
Puppet 2020-01-03 10:44:13 556 0
1 条回答
写回答
取消 提交回答
  • 一种解决方法是将这些CTE拆分到临时表,然后根据需要添加索引。

    2020-01-03 10:46:20
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载