我有一个 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/