tsql - 优化 TSQL
问题描述
有一个选择查询重复运行,选择子句中的第一列是唯一被其他列替换的内容,查询结构的其余部分保持不变。为了让这个查询计划被缓存,有什么方法可以参数化第一列。
从 table1 中选择 c1,p,a,
从表 1 中选择 c2,p,a
从表 1 中选择 c3,p,a
Select c4,p,a From table1 每次查询运行时,只有第一列是变化的。有没有办法优化这种查询?
解决方案
我必须承认,这有点味道。可能有更好的方法,但我们不知道您的用例。
你可以试试这个:
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
推荐阅读
- java - JavaFX - 从不同的场景将数据添加到 TableView
- angular - 单击警报按钮后如何重定向到当前页面
- c++ - UB 更改 const 指针的非 const 数据时
- c# - c# .Net Core 2.1 授权属性 - 默认声明
- python - 按索引条件过滤数组
- python - 如何在 python 上使用 RSA 私钥和 SHA256 进行解密
- java - 为什么更新大型数组的元素时,次要 GC 持续时间会发生如此大的变化?
- docker - 使用 docker-compose 挂载卷时出错
- json - 如何从json字符串中只获取一个属性值
- text - Applescript - 重复直到静态文本不等于值