有一个选择查询重复运行,其中select子句中的第一列是唯一被其他列替换的东西,其余查询结构保持不变。 为了使该查询计划得到缓存,我们可以通过任何方式对第一列进行参数化。
选择c1,p,a 在表1中,
选择c2,p,a 从表1
选择c3,p,a 从表1
选择c4,p,a 从表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
)
作为解决方法,您可以包括上交的参数,并将其与结果集一起返回。在这种情况下,消费者会知道使用了哪一列...
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