我有一个直接的SELECT
查询。现在我需要根据另一个varchar列更改一个列中的值。
下面是一个例子:
SELECT
Company_Name,
CASE
WHEN Size = 'Large' THEN Company_Name
ELSE 'Small company'
end,
CASE
WHEN left (Size,1) = 'L' THEN Company_Name
ELSE 'Small company'
end,
CASE
WHEN ASCII(Size) = 76 THEN Company_Name
ELSE 'Small company'
end,
Size
FROM MyTable
这里有3个CASE
。哪一个更快?此查询用于数据提取,不包含WHERE
子句。
非常感谢!
问:为什么不能对着桌子跑?
:
- 在给定数据集上运行查询并不能证明解决方案对任何数据集都更快。
- 我没有权限重置DB,所以测试运行是可比的:
DBCC DROPCLEANBUFFERS
对于正常的数据量,这三个选项之间不会有任何显著的差异。我在一个有1000万条记录的表上进行了测试。
CREATE TABLE dbo.Sizes
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
Size NVARCHAR(15) NOT NULL
)
DECLARE @i INT;
SET @i = 0;
WHILE @i < 10000000
BEGIN
INSERT dbo.Sizes (Size)
VALUES (N'Small'), (N'Medium'), (N'Large');
SET @i = @i + 3;
END
第一次测试。
SET STATISTICS TIME ON;
GO
SELECT ID,
CASE
WHEN Size = N'Large' THEN CAST(ID AS NVARCHAR(25))
ELSE N'Small company'
END AS 'SizeDescription',
Size
FROM dbo.Sizes;
GO
SET STATISTICS TIME OFF;
GO
第一次检查结果。
SQL Server解析和编译时间:CPU时间= 0 ms,运行时间= 1 ms。
(10000002行)
SQL Server执行时间:CPU时间= 7422 ms,运行时间= 64791 ms。SQL Server解析和编译时间:CPU时间= 0 ms,运行时间= 0 ms.第二次测试。
SET STATISTICS TIME ON;
GO
SELECT ID,
CASE
WHEN LEFT(Size,1) = N'L' THEN CAST(ID AS NVARCHAR(25))
ELSE N'Small company'
END AS 'SizeDescription',
Size
FROM dbo.Sizes;
GO
SET STATISTICS TIME OFF;
GO
第二次检查结果。
SQL Server解析和编译时间:CPU时间= 0 ms,运行时间= 1 ms。
(10000002行)
SQL Server执行时间:CPU时间= 8203 ms,运行时间= 69081 ms。SQL Server解析和编译时间:CPU时间= 0 ms,运行时间= 0 ms.第三测试。
SET STATISTICS TIME ON;
GO
SELECT ID,
CASE
WHEN ASCII(Size) = 76 THEN CAST(ID AS NVARCHAR(25))
ELSE N'Small company'
END AS 'SizeDescription',
Size
FROM dbo.Sizes;
GO
SET STATISTICS TIME OFF;
GO
第三次检查结果。
SQL Server解析和编译时间:CPU时间= 0 ms,运行时间= 1 ms。
(10000002行)
SQL Server执行时间:CPU时间= 8031 ms,运行时间= 69460 ms。SQL Server解析和编译时间:CPU时间= 0 ms,运行时间= 0 ms.CPU时间是关键度量,这三个测试的CPU时间基本相同(在7.4到8.2秒之间)。
如果您需要加快查询速度,您可以通过将size字段替换为单个字符或tinyint来减小其大小。这将减少表的总体大小并加快I/o。
您还需要考虑返回结果所花费的时间,这可能是限制因素。实际上,对表进行锁定——其他用户是否在运行查询的同时更新表?