优化TSQL

时间:2018-11-19 08:31:11

标签: tsql optimization

有一个选择查询重复运行,其中select子句中的第一列是唯一被其他列替换的东西,其余查询结构保持不变。 为了使该查询计划得到缓存,我们可以通过任何方式对第一列进行参数化。

选择c1,p,a 在表1中,

选择c2,p,a 从表1

选择c3,p,a 从表1

选择c4,p,a 从表1 每次查询运行时,只有第一列在变化。有什么方法可以优化这种查询?

1 个答案:

答案 0 :(得分:0)

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

您可以尝试以下方法:

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;

这个想法是使用CASE来决定在参数之后首先显示哪一列。如果您也想查看不同的列名(我用过DynamicFirstColumn

  • 为每种情况创建一个视图,或
  • 使用动态创建的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