JOIN子句上的SQL排序规则问题 - 极其缓慢的运行时

时间:2018-04-10 15:00:03

标签: sql sql-server sql-server-2012 collation collate

我正在尝试在查询中连接来自不同数据库的两个表。它们具有不同的排序规则类型。主DB具有排序规则: SQL_Latin1_General_CP1_CS_AS

我要加入的数据库具有排序规则: SQL_Latin1_General_CP1_CI_AS

当我尝试运行而没有整理(显然)时,我收到此错误:

  

无法解决之间的排序规则冲突   " SQL_Latin1_General_CP1_CS_AS"和" SQL_Latin1_General_CP1_CI_AS"在   等于操作。

我对整理很陌生,所以我不知道该怎么做。如果我从查询中删除第二个DB的方面,它会立即运行。一旦我开始使用联接,查询将运行一小时+但没有结果。

如果您需要更多背景信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

正如评论中所讨论的那样,在查询中对列进行排序,使语句成为非SARGable。这就是为什么您看到重要的性能损失,因为您无法使用索引。

如果您需要在2个数据库上保持不同的排序规则,那么一种方法是添加PERSISTED计算列。然后,您可以在该列上添加索引。这将保持SARGability。

如果您要保留非CaseSensitivity,则需要在Case Sensitive数据库中创建计算列。我不知道您的列的名称,但您的计算列的yuour语句将类似于:

ALTER TABLE YourTable ADD YourColumn_CI AS YourColumn COLLATE SQL_Latin1_General_CP1_CI_AS PERSISTED;

然后,您也可以在该新列上创建索引,并且 应该获得性能优势。

编辑:作为一个非常简单的示例索引:

CREATE INDEX YourColumn_CI_IX ON YourTable (YourColumn_CI ASC);