我有一个直接的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
子句。
非常感谢!
更新
问:为什么我不能靠桌子跑来做?
A:
DBCC DROPCLEANBUFFERS
答案 0 :(得分:0)
正常数据量的三个选项之间不会有任何显着差异。我在一张有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行(s)受影响)
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行(s)受影响)
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行(s)受影响)
SQL Server执行时间: CPU时间= 8031 ms,经过时间= 69460 ms。 SQL Server解析和编译时间: CPU时间= 0 ms,经过时间= 0 ms。
CPU时间是关键测量,三次测试(7.4到8.2秒之间)大致相同。
如果您需要加快查询速度,可以通过将其替换为单个字符或tinyint来减小“大小”字段的大小。这样可以减小表的整体大小并加快I / O.
您还需要考虑返回结果所需的时间,这可能是限制因素。确实锁定表 - 其他用户是否在运行查询的同时更新表?