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

sql情况下最快的字符串比较,sql,sql-server,sql-server-2008-r2,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,

我有一个直接的
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
s。哪一个更快?此查询用于数据提取,它没有
WHERE
子句

非常感谢

更新

问:为什么我不能在桌子上跑步

A:

  • 在给定数据集上运行查询并不能证明解决方案对于任何数据集都更快
  • 我没有重置数据库的权限,因此测试运行是可比较的:
    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毫秒,运行时间=1毫秒

    (10000002行受影响)

    SQL Server执行时间: CPU时间=7422毫秒,运行时间=64791毫秒。 SQL Server解析和编译时: CPU时间=0毫秒,运行时间=0毫秒

    第二次测试

    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
    
    第二次测试的结果

    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毫秒,运行时间=1毫秒

    (10000002行受影响)

    SQL Server执行时间: CPU时间=8203毫秒,运行时间=69081毫秒。 SQL Server解析和编译时: CPU时间=0毫秒,运行时间=0毫秒

    第三次测试

    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
    
    第三次测试的结果

    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毫秒,运行时间=1毫秒

    (10000002行受影响)

    SQL Server执行时间: CPU时间=8031毫秒,运行时间=69460毫秒。 SQL Server解析和编译时: CPU时间=0毫秒,运行时间=0毫秒

    CPU时间是关键测量值,这与三个测试(7.4到8.2秒)基本相同

    如果需要加快查询速度,可以通过使用单个字符或tinyint替换大小字段来减小大小字段的大小。这将减小表的总体大小并加快I/O


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

    只需在查询中分别使用每种情况并运行它们即可。看看哪一个更快。没有其他办法回答这个问题。“我这里有3个$foo。哪一个更快?”-你测量过吗?我处于开发阶段,我的表太小,目前无法测量。@Stoleg然后用测试数据填充你的表;-)@ThorstenDittmar嗯。。。如果我能做的话,我早就做了。你认为经验方法是唯一的方法吗?你能添加逻辑/物理数据吗。你在测试之间做了
    DBCC DROPCLEANBUFFERS
    吗?@Stoleg你为什么不接受我做的,做更多的实验,并在这里分享结果?然而,我认为你不必要地担心你所问的三种选择之间可能存在的细微差异。如果你想提供更多的信息,建议你会有所帮助。表结构、数据卷、应用程序用途、报告要求、更新卷等@Stoleg如果问题是您无法访问SQL Server进行测试,则至少有三个选项:您可以下载免费的SQL Server Express,SQL Server Developer Edition的180天免费试用版,或者向Microsoft Azure注册一个免费帐户。