比较 SQL 排序规则和 Windows 排序规则

文章翻译 文章翻译
文章编号: 322112 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

在 Microsoft SQL Server 2000 和 Microsoft SQL Server 2005 中,“排序规则”指定如何对字符串进行比较和排序,以及对非 Unicode 数据使用何种字符集。SQL Server 2000 支持两种类型的排序规则:
  • SQL 排序规则
  • Windows 排序规则
有关每种类型的排序规则的说明以及如何决定使用何种排序规则的全面概述,请参见 SQL Server 2000 联机丛书中的“选择排序规则”主题,或参见 SQL Server 2005 联机丛书中的“排序规则类型”主题。

本文讨论对有关安装 SQL Server 2000 或 SQL Server 2005 时选择 Windows 排序规则还是 SQL 排序规则的决定会有影响的其他注意事项。

更多信息

排序规则语义

对于 Windows 排序规则,对非 Unicode 数据的比较是通过使用与 Unicode 数据相同的算法实现的。在特定版本的 Windows 中,Unicode 和非 Unicode 排序都与字符串比较规则兼容。这在 SQL Server 中各种数据类型之间提供了一致性。这还使得使用 CompareString Win32 API 函数的开发人员可以在其应用程序中与 SQL Server 使用相同的规则对字符串进行排序。

在 SQL 排序规则中,SQL Server 为非 Unicode 数据定义了不同的比较语义。SQL Server 以 SQL“排列顺序”作为这些比较语义的基础。有关从排列顺序到 SQL 排序规则的映射,请参见 SQL Server 联机丛书中的“SQL 排序规则名称”主题。

用于对非 Unicode 数据进行排序的 SQL 排序规则与 Microsoft Windows 操作系统提供的任何排序例程都不兼容;但是,Unicode 数据的排序与特定版本的 Windows 排序规则兼容。由于非 Unicode 数据和 Unicode 数据的比较规则不同,因此使用 SQL 排序规则时对相同的字符进行比较可能会得到不同的结果,具体取决于基础数据类型。例如,如果您使用 SQL 排序规则“SQL_Latin1_General_CP1_CI_AS”,则非 Unicode 字符串 'a-c' 小于字符串 'ab',因为连字符(“-”)在排序时作为单独的字符位于“b”之前。但是,如果将这些字符串转换为 Unicode 并执行相同的比较,则认为 Unicode 字符串 N'a-c' 大于 N'ab',因为 Unicode 排序规则使用忽略连字符的“字排序”。

字符串比较性能

Unicode 排序规则比非 Unicode SQL 排列顺序的规则复杂得多。当 SQL Server 比较 Unicode 数据时,会为字符分配基于排序规则的区域设置而动态修改的权重。同时,还会根据比较样式的设置(如是否区分宽度、重音或假名)而修改数据。Unicode 排序例程支持更智能的排序行为,如字排序。

此外,由于这些例程必须处理 Unicode 数据,因此它们非常灵活,足以对数以千计的不同字符进行排序和比较,而多数 SQL Server 排列顺序最多只能处理 255 个字符。出于上述原因,使用 Unicode 排序规则的原始字符串比较工作通常比使用非 Unicode SQL 排列顺序的类似字符串比较在时间和 CPU 循环方面的开销更大。

SQL Server 中数据类型和排序规则类型可能的组合会产生以下结果:
  • 如果使用非 Unicode 数据类型(charvarchartext)存储和处理数据,且使用 SQL 排序规则,则字符串比较将按照非 Unicode SQL 排列顺序执行。
  • 如果使用非 Unicode 数据类型(charvarchartext)存储和处理数据,且使用 Windows 排序规则,则字符串比较将按照 Unicode 排序规则执行。这会导致某些极其依赖于字符串排序性能的操作比按照 SQL 排序规则执行的类似操作耗时更长且 CPU 占用率更大。
  • 如果使用 Unicode 数据类型(ncharnvarcharntext),则使用 SQL 排序规则和 Windows 排序规则的排序行为之间没有差异。两者都将使用 Unicode 排序规则。
通常,Windows 排序规则和 SQL 排序规则之间的性能差异的程度不会很明显。只有负载受限于 CPU(而不是受 I/O 或受网络速度限制),且此类 CPU 负担中大部分由在 SQL Server 中执行的字符串操作或比较的开销所导致的时,才会显示出这种差异。可以明确表示性能差异的应用程序示例是应用程序将长字符串值传递到 SQL Server 存储过程的系统。然后,存储过程通过大量使用 Transact-SQL 字符串操作函数(如 CHARINDEX 或 PATINDEX)分析字符串。如果负载相对线性,且主要由执行这种字符串分析存储过程所导致,则 SQL 排序规则和 Windows 排序规则之间的性能差异就显而易见。但是,大多数应用程序的设计都不会导致出现显著的性能差异的情况。

建议

  1. 提供 SQL 排序规则是为了与 SQL Server 的早期版本向后兼容。Windows 排序规则在 SQL Server 中为 Unicode 和非 Unicode 文本都提供一致的字符串比较,而这些比较与 Windows 操作系统中的字符串比较也一致。出于上述原因,应首选 Windows 排序规则,除非存在要求 SQL 排序规则的向后兼容性问题或特定的性能问题。
  2. 如果仅根据 SOL 排序规则的性能特点而考虑使用它,那么请注意多数应用程序不会因更改排序规则而在性能方面显著受益。请确保已经找到可以显示 SQL 排序规则优势的查询。识别受影响的查询后,请立即考虑以下更改排序规则的替代方法。这两种替代方法都会带来大于将实例的排序规则更改为 SOL 排序规则所能得到的性能改善:
    1. 如果发现 Windows 排序规则的开销来自执行显式字符串操作或分析的 Transact-SQL 例程,并且正在使用非 Unicode 数据类型,则您可能希望为频繁执行且开销最大的操作指定使用 SQL 排序规则或二进制 Windows 排序规则。假设使用 PATINDEX 函数确定表中的文本列是否包含“x”字符。如果对该特定比较操作强制使用 SQL 排序规则,而对其余数据库和应用程序继续使用 Windows 排序规则,则不必更改整个系统的排序规则:
      SELECT PATINDEX ('%x%', MemoFld COLLATE SQL_Latin1_General_Cp1_CI_AS) FROM ...
    2. 如果发现 Windows 排序规则的开销来自并不使用复杂字符串操作函数的较常见查询,则改进索引或查询的设计可能提供的改善要比更改为 SQL 排序规则所获改善大得多。如果查询可以通过对适当的索引进行高度选择性的查找而得出结果,则它对字符串比较开销中的微小变化并不敏感。相反,如果查询必须执行表扫描并将特定值与数百万行进行比较,则每次字符串比较所产生的少量开销会在查询中迅速积累。如果通过更改索引或查询本身来避免由查询计划产生的大型表扫描或索引扫描,则查询执行起来会比更改为 SQL 排序规则时快得多。
注意:还有作为 SQL 排序规则变体的第三种类型的排序规则。此第三排序规则称为“兼容排序规则”或“退化排序规则”。兼容排序规则是一组在 SQL Server 2000 中没有预定义排序规则名称的排序和比较规则。例如,如果所安装的 SQL Server 7.0 中对 Unicode 和对非 Unicode 数据的大小写区分设置不一致,则将此 SQL Server 7.0 实例升级为 SQL Server 2000 时就会产生兼容排序规则。在本文前面所讨论的有关 SQL 排序规则的信息也适用于兼容排序规则。

有关兼容排序规则的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
270042 SQL Server 兼容排序规则说明

属性

文章编号: 322112 - 最后修改: 2006年3月3日 - 修订: 8.1
这篇文章中的信息适用于:
  • Microsoft SQL Server 2000 标准版
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
关键字:?
kbhowto kbinfo KB322112
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com