使用 CASE 时的 SQL 性能问题

标签 sql case table-valued-parameters

我有一个 SP,它每秒返回大量数据并显示在网格中。我现在正在尝试减少带宽,并考虑仅返回网格中当前显示的列。

这当然是简化和最小化的,但基本上我所拥有的是以下 SP:

SELECT
[Animals].[AnimalID] AS [AnimalID],
[Animals].[name] AS [AnimalName],
[Foods].[DisplayName] AS [Food],
[Animals].[Age] AS [AnimalAge],
[Animals].[AmountOfFood] AS [AmountOfFood]

我当前正在尝试传递当前显示在网格上的字段名称 (@fields) 的 TVP,并仅返回必需的字段,如下所示:

SELECT
[Animals].[AnimalID] AS [AnimalID],
[Animals].[name] AS [AnimalName],
CASE 
    WHEN ('Food' in (select * from @fields)) 
    THEN [Foods].[DisplayName] 
END AS [Food],
CASE 
    WHEN ('AnimalAge' in (select * from @fields)) 
    THEN [Animals].[Age] 
END AS [AnimalAge],
CASE 
    WHEN ('AmountOfFood' in (select * from @fields)) 
    THEN [Animals].[AmountOfFood] 
END AS [AmountOfFood]

我面临的问题是(正如预期的那样)我的 SP 从大约 200 毫秒变为大约 1 秒

有什么办法可以重写这个,这样它就不会杀死我们吗?

我的王国!

最佳答案

在 SQL Server 中,您还可以使用动态 SQL 来执行此操作。类似于:

declare @sql nvarchar(max);

select @sql = (select ', '+
                      (case when FieldName = 'Food' then 'Foods.DisplayName'
                            when FieldName = 'AnimalAge' then 'Animals.Age'
                         . . .
                       end)
               from @fields
               for xml path ('')
              );

select @sql = 'select [Animals].[AnimalID] AS [AnimalID], [Animals].[name] AS [AnimalName]'+@sql+RESTOFQUERY;

exec(@sql);

关于使用 CASE 时的 SQL 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627823/

相关文章:

sql - 优化排名查询

mysql - 如何删除字段-Mysql 查询中间的文本

SQL SELECT 使用 CASE 语句,但有多个条件

sql-server - T-SQL 条件 AND 语句

Python:在字符串周围插入双引号或单引号

sql - 如何使用 SQL 查找第二高的拍卖出价

C词法分析器。使用开关分析和计算小数/非小数

sql-server-2005 - 将比较运算符传递给 WHERE 子句

.net - 将空列表或 null 值绑定(bind)到存储过程 (.NET) 上的表值参数

sql - 创建一个以 SQL @tables 作为其成员的 UDT