首页 > 解决方案 > 优化 TSQL

问题描述

有一个选择查询重复运行,选择子句中的第一列是唯一被其他列替换的内容,查询结构的其余部分保持不变。为了让这个查询计划被缓存,有什么方法可以参数化第一列。

从 table1 中选择 c1,p,a,

从表 1 中选择 c2,p,a

从表 1 中选择 c3,p,a

Select c4,p,a From table1 每次查询运行时,只有第一列是变化的。有没有办法优化这种查询?

标签: tsqloptimization

解决方案


我必须承认,这有点味道。可能有更好的方法,但我们不知道您的用例。

你可以试试这个:

DECLARE @mockup TABLE(c1 INT, c2 INT, c3 INT, p VARCHAR(100),a VARCHAR(100));
INSERT INTO @mockup VALUES(1,2,3,'Row 1','blah 1')
                         ,(11,22,33,'Row 2','blah 2')
                         ,(111,222,333,'Row 3','blah 3');

DECLARE @FirstColumn VARCHAR(10)='c3';

SELECT CASE @FirstColumn WHEN 'c1' THEN c1
                         WHEN 'c2' THEN c2
                         WHEN 'c3' THEN c3
                         ELSE NULL END AS DynamicFirstColumn
      ,p
      ,a
FROM @mockup;

这个想法是使用 aCASE来决定在参数之后首先看到哪一列。如果您也想查看不同的列名(我使用过DynamicFirstColumn),您可以

  • 为每个案例创建一个 VIEW 或
  • 使用动态创建的 SQL。

作为一种解决方法,您可以包含传入的参数并将其与结果集一起返回。在这种情况下,消费者会知道使用了哪一列......

SELECT CASE @FirstColumn WHEN 'c1' THEN c1
                         WHEN 'c2' THEN c2
                         WHEN 'c3' THEN c3
                         ELSE NULL END AS DynamicFirstColumn
      ,p
      ,a
      ,@FirstColumn --<-- Here we include the source we use above
FROM @mockup

推荐阅读