关于 sql server:JOIN 子句上的 SQL 排序规则问题 — 运行时极其缓慢

SQL Collation Issue on JOIN clause -- EXTREMELY slow runtime

我试图在一个查询中连接来自不同数据库的两个表。它们有不同的归类类型。主数据库有整理: SQL_Latin1_General_CP1_CS_AS

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

当我尝试在没有整理的情况下运行时出现此错误(显然):

Cannot resolve the collation conflict between
"SQL_Latin1_General_CP1_CS_AS" and"SQL_Latin1_General_CP1_CI_AS" in
the equal to operation.

我对整理不熟悉,所以我不知道该怎么办。如果我从查询中删除第二个数据库的方面,它会立即运行。一旦我开始使用连接,查询就会运行一个小时而没有结果。

如果您需要更多背景信息,请告诉我。


正如评论中所讨论的,在查询中更改列的排序规则会使语句不可 SARGable。这就是为什么您看到性能显着下降的原因,因为您无法使用索引。

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

如果它是您想要保留的非区分大小写,那么您需要在区分大小写的数据库中创建计算列。我不知道您的列的名称,但是您的计算列的语句类似于:

1
ALTER TABLE YourTable ADD YourColumn_CI AS YourColumn COLLATE SQL_Latin1_General_CP1_CI_AS PERSISTED;

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

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

1
CREATE INDEX YourColumn_CI_IX ON YourTable (YourColumn_CI ASC);