在sql情况下最快的字符串比较



我有一个直接的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子句。

非常感谢!

问:为什么不能对着桌子跑?

:

  1. 在给定数据集上运行查询并不能证明解决方案对任何数据集都更快。
  2. 我没有权限重置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。

您还需要考虑返回结果所花费的时间,这可能是限制因素。实际上,对表进行锁定——其他用户是否在运行查询的同时更新表?

最新更新