代码之家  ›  专栏  ›  技术社区  ›  SQL_M

T-SQL探针残留

  •  1
  • SQL_M  · 技术社区  · 7 年前

    我正在测试probe residual,将数据类型不匹配的表连接起来,以查看这对性能有何影响。在这个测试中,我连接了两个表,一个表的数据类型不匹配(nvarchar和varchar),另一个表的数据类型匹配。我使用的代码:

    SELECT REPLACE (CONVERT(VARCHAR(255), NEWID()), '-', '') AS ColA,
          ROW_NUMBER() OVER (ORDER BY ( SELECT 1)) AS RowNumb
    INTO #Varchar
    FROM sys.all_objects AS S
    CROSS JOIN sys.all_objects AS S2
    
    SELECT CAST (ColA AS NVARCHAR (255)) AS ColA,
           RowNumb
    INTO #Nvarchar
    FROM #Varchar
    
    SELECT TOP 1000000 *
    INTO #Subset
    FROM #Varchar
    
    CREATE INDEX i_VarcharColA ON #Varchar (ColA)
    CREATE INDEX i_NvarcharColA ON #Nvarchar (ColA)
    CREATE INDEX i_SubsetColA ON #Subset (ColA)
    
    SET STATISTICS IO, TIME ON
    SELECT COUNT(*) AS CountStar
    FROM #Varchar AS V
    INNER JOIN #Subset AS S ON V.ColA = S.ColA -- matching datatypes
    
    SELECT COUNT(*) AS CountStar
    FROM #Nvarchar AS V
    INNER JOIN #Subset AS S ON V.ColA = S.ColA -- non-matching datatypes
    

    性能有很大的差别。不过,令我吃惊的是,使用不匹配的数据类型实际上会有更好的效果。

    我一定忽略了一些事情,但任何见解都会受到极大的赞赏。

    谢谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Stanislav Kundii    7 年前
    1. 为清除测试添加选项(重新编译,maxdop 1)
    2. 使用DBCC DropCleanBuffers进行测试(从缓冲池中删除所有缓冲区)
    3. 在我的SQL(2016)中,第一个查询“更快”
    4. 无maxdop=1时的试验:
     INNER JOIN matching type -> NL JOIN
     CPU time = 15251 ms,  elapsed time = 4848 ms.
    
     INNER JOIN non-matching type -> MERGE JOIN + SORT 
     CPU time = 15889 ms,  elapsed time = 9776 ms.
    
    1. 用maxdop=1进行测试
    INNER JOIN matching type -> NL JOIN    
    CPU time = 8438 ms,  elapsed time = 9307 ms.
    
    INNER JOIN non-matching type -> NL JOIN + sort    
    CPU time = 8687 ms,  elapsed time = 10130 ms.
    

    早期版本可能有不同的计划,所以我希望不匹配的类型得到哈希连接和更多的CPU。

    P/S SQL Server试图创建一个更便宜的计划,以牺牲执行速度节省资源