在单个 SQL 服务器实例中使用多个数据库排序规则有什么问题?
What are the issues of having multiple database collations in single SQL Server instance?
我最近继承了一个 SQL 服务器集群,它是一个多实例 A/A 设置。
目前它有 6 个实例,其中 3 个是 运行 具有高事务率的大型单一数据库,我将单独放置,但其他 3 个在每个实例中托管多个数据库,并且已被拆分整理。
三个排序规则是:
- Latin1_General_CI_AS,
- SQL_Latin1_General_CP1_CI_AS,以及
- SQL_Latin1_General_CP850_BIN2
一些数据库没有被使用,所以可以完全脱离集群,一些数据库不保证成为集群的一部分,将被移动到虚拟盒子。
我的问题是如何处理剩余的数据库。我想将它们合并到一个实例中以便于管理。很少有数据库相互交互,而那些确实具有相同排序规则的数据库。
这样做的各种缺点是什么,重要的是它会以任何方式影响实例的更新和修补吗?
谢谢
一般来说,如果排序规则在所有地方都被显式使用,那么您不一定会遇到问题。但是,你完全可以。
一个大问题是查询中的常量。它们继承了查询为 运行 的数据库的默认排序规则。如果您更改排序规则,则查询可能会失败或者它们的性能可能会发生变化。不兼容的排序规则会影响索引的使用。
我会非常小心地在系统中使用多个排序规则。我认为您应该测试将数据库更改为通用排序规则,然后努力统一它们。如果特定目的需要不同的排序规则,则隔离该代码并使用 explicit 排序规则,而不是 default 排序规则用于例外情况。
将数据库移动到不同排序规则的实例时,请注意实例排序规则决定了数据库名称、变量、GOTO 标签和 tempdb 的排序规则。从 case-insensitive 实例归类到 case-sensitive 或二进制归类将破坏代码,除非变量和 GOTO 标签的定义和使用与大小写完全匹配。同样,如果 variables/labels 只是大小写不同,那么从 case-sensitive/binary 到 case-insensitive 将导致问题。
此外,除非明确指定 COLLATE DATABASE DEFAULT
,否则临时表的列排序规则将使用实例排序规则。这可能会导致在使用 tempdb 中的对象时出现排序规则冲突错误。
因此,可能需要修复代码以将不同排序规则的数据库整合到单个实例中。实例补丁不会受到影响。
我曾在混合整理环境中工作过,我可以说这是应该避免的事情,但对于大型遗留应用程序来说很难修复。
我最近继承了一个 SQL 服务器集群,它是一个多实例 A/A 设置。
目前它有 6 个实例,其中 3 个是 运行 具有高事务率的大型单一数据库,我将单独放置,但其他 3 个在每个实例中托管多个数据库,并且已被拆分整理。
三个排序规则是:
- Latin1_General_CI_AS,
- SQL_Latin1_General_CP1_CI_AS,以及
- SQL_Latin1_General_CP850_BIN2
一些数据库没有被使用,所以可以完全脱离集群,一些数据库不保证成为集群的一部分,将被移动到虚拟盒子。
我的问题是如何处理剩余的数据库。我想将它们合并到一个实例中以便于管理。很少有数据库相互交互,而那些确实具有相同排序规则的数据库。
这样做的各种缺点是什么,重要的是它会以任何方式影响实例的更新和修补吗?
谢谢
一般来说,如果排序规则在所有地方都被显式使用,那么您不一定会遇到问题。但是,你完全可以。
一个大问题是查询中的常量。它们继承了查询为 运行 的数据库的默认排序规则。如果您更改排序规则,则查询可能会失败或者它们的性能可能会发生变化。不兼容的排序规则会影响索引的使用。
我会非常小心地在系统中使用多个排序规则。我认为您应该测试将数据库更改为通用排序规则,然后努力统一它们。如果特定目的需要不同的排序规则,则隔离该代码并使用 explicit 排序规则,而不是 default 排序规则用于例外情况。
将数据库移动到不同排序规则的实例时,请注意实例排序规则决定了数据库名称、变量、GOTO 标签和 tempdb 的排序规则。从 case-insensitive 实例归类到 case-sensitive 或二进制归类将破坏代码,除非变量和 GOTO 标签的定义和使用与大小写完全匹配。同样,如果 variables/labels 只是大小写不同,那么从 case-sensitive/binary 到 case-insensitive 将导致问题。
此外,除非明确指定 COLLATE DATABASE DEFAULT
,否则临时表的列排序规则将使用实例排序规则。这可能会导致在使用 tempdb 中的对象时出现排序规则冲突错误。
因此,可能需要修复代码以将不同排序规则的数据库整合到单个实例中。实例补丁不会受到影响。
我曾在混合整理环境中工作过,我可以说这是应该避免的事情,但对于大型遗留应用程序来说很难修复。