T-SQL 探针残差

T-SQL 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. 添加选项(重新编译,MAXDOP 1)以进行清晰测试
  2. 使用 DBCC DROPCLEANBUFFERS 进行测试(从缓冲池中删除所有缓冲区)
  3. 在我的 sql (2016) 第一次查询中 "faster"
  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.

早期版本可能有不同的计划,我希望不匹配的类型得到 HASH JOIN 和更多 CPU。

p/s Sql 服务器试图创建一个更便宜的计划,以牺牲执行速度为代价节省资源