sql案例中最快的字符串比较

时间:2014-05-15 14:23:53

标签: sql sql-server sql-server-2008-r2

我有一个直接的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:

  1. 对给定数据集运行查询并不能证明任何数据集的解决方案都更快。
  2. 我没有权限重置数据库,因此测试运行具有可比性:DBCC DROPCLEANBUFFERS

1 个答案:

答案 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.

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