Per*_*xed 2 sql sql-server inner-join
我有两个表:
查询是(简短版本):
SELECT TOP (2000) *
FROM [...].[Documents] AS [D]
INNER JOIN dbo.SE_CMSClientMatters AS [mat] ON [mat].[Mcode] = [D].[custom2]
Run Code Online (Sandbox Code Playgroud)
我一生都无法弄清楚为什么它不起作用 - 即从未完成执行 - 运行了 13 个小时,但仍然没有完成的迹象。
Documents 表大约有 1200 万行,ClientMatters 大约有 330,000 行。
原始查询还有其他几个左连接,这是唯一的内连接。如果我省略它,查询将在 20 秒内完成!
现在是凌晨 4 点,所以要么我丢失了它,要么错过了一些明显的东西。PS - 我确实重建了索引。Custom2 字段是一组索引字段的一部分(见图)。
任何帮助表示赞赏 - 谢谢!
我看到的问题之一是
mat.MCode 是类型 varchar(27)D.custom2 是类型 nvarchar(32)加入时这很糟糕(性能方面) - 一列是 Unicode,另一列不是。
尝试将一个转换为另一个 - 像这样:
SELECT TOP (2000) *
FROM [...].[Documents] AS [D]
INNER JOIN dbo.SE_CMSClientMatters AS [mat]
ON CAST([mat].[Mcode] AS NVARCHAR(32)) = [D].[custom2]
Run Code Online (Sandbox Code Playgroud)
作为一般规则,您应该始终尝试在用于连接的列中使用相同的数据类型- 并且在数字数据类型上连接通常更容易和更快,而不是基于字符串的数据类型。
如果可以 - 尝试将这两列之一转换为与另一列相同的数据类型 - 我很确定这会显着加快速度。
也:一个索引Documents,其中Custom2在第二位置将不能够被用于这个连接-尝试创建一个单独的指数custom2独自:
CREATE NONCLUSTERED INDEX IX_Documents_custom2 ON dbo.Documents(custom2)
Run Code Online (Sandbox Code Playgroud)