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
性能差别很大。然而,令我绝对惊讶的是,使用不匹配的数据类型实际上表现得更好。
我一定是忽略了什么,但任何见解都将不胜感激。
非常感谢!
- 添加选项(重新编译,MAXDOP 1)以进行清晰测试
- 使用 DBCC DROPCLEANBUFFERS 进行测试(从缓冲池中删除所有缓冲区)
- 在我的 sql (2016) 第一次查询中 "faster"
- 没有 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.
- 测试 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 服务器试图创建一个更便宜的计划,以牺牲执行速度为代价节省资源
我正在测试探针残差,连接具有不匹配数据类型的表以查看这对性能有何影响。在此测试中,我连接了两个表,一个具有不匹配的数据类型(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
性能差别很大。然而,令我绝对惊讶的是,使用不匹配的数据类型实际上表现得更好。
我一定是忽略了什么,但任何见解都将不胜感激。
非常感谢!
- 添加选项(重新编译,MAXDOP 1)以进行清晰测试
- 使用 DBCC DROPCLEANBUFFERS 进行测试(从缓冲池中删除所有缓冲区)
- 在我的 sql (2016) 第一次查询中 "faster"
- 没有 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.
- 测试 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 服务器试图创建一个更便宜的计划,以牺牲执行速度为代价节省资源