用麻烦的内部连接永无止境的选择

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 字段是一组索引字段的一部分(见图)。

任何帮助表示赞赏 - 谢谢!

mar*_*c_s 5

我看到的问题之一是

  • 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)

  • 效果非常好 - 28 秒就完成了!太感谢了! (2认同)