SQL Server 2008 中数据库引擎功能的行为更改
本主题介绍数据库引擎中的行为更改。 与早期版本的 SQL Server 相比,SQL Server 2008 中的功能的工作或交互方式会受到行为更改的影响。
SQL Server 代理
对撰写 SQL Server 代理任务的脚本中的行为更改。
在 SQL Server 2008 中,如果您通过从现有作业复制脚本来创建一个新作业,则这个新作业可能会对现有作业产生不利影响。 若要使用来自现有作业的脚本创建新作业,请手动删除参数 @schedule\_uid,该参数通常是在现有作业中创建作业计划的部分中的最后一个参数。 这将为新作业创建一个新的独立计划并且不会影响现有作业。
访问检查缓存选项
在 SQL Server 2005 中,除非使用跟踪标志,否则无法配置 access check result cache 的内部结构。 在 SQL Server 2008 中,可以使用 access check cache 选项来修改此结构。 有关详细信息,请参阅访问检查缓存选项。
全文搜索
SQL Server 2008 引入了新的全文搜索体系结构。 全文搜索引擎现已完全整合到 SQL Server 数据库引擎中,而不再是单独的服务。 与早期版本的 SQL Server 相比,整合后提供更好的全文搜索可管理性、可扩展性、安全性和性能。 有关 SQL Server 2005 和 SQL Server 2008 中的全文搜索功能之间的主要区别,以及这一新整合的全文搜索引擎所关联的最佳实践的详细信息,请参阅 MSDN 上的技术文章“SQL Server 2008 Full-Text Search: Internals and Enhancements”(SQL Server 2008 全文搜索:内在变化与增强功能)。
链接服务器
SQL Server 2008 更改了针对环回链接服务器执行的 INSERT...EXECUTE 语句的事务语义。 SQL Server 2005 不支持此方案,此方案会导致错误。 在 SQL Server 2008 中,如果没有针对连接启用“多个活动结果集 (MARS)”,则可以针对环回链接服务器执行 INSERT...EXECUTE 语句。 如果针对连接启用了 MARS,则该行为与 SQL Server 2005 中相同。
并行度
已分区表的查询处理和并行度
相对于 SQL Server 2005,SQL Server 2008 中改进了分区表的设计,从而在对分区表进行查询处理时提高了并行度。 这种重新设计的连带影响是:只能归置双向联接。 SQL Server 2008 中的双向归置联接的查询计划与SQL Server 2005 中的类似,而且在性能上与 SQL Server 2005 具有可比性。 如果在该联接中包括更多具有对齐分区的表,将选择不同的计划,如后跟联接第三个表的哈希联接的双向归置联接。 两个以上表之间的归置联接并不常见,而且 SQL Server 2008 中对并行度的改进对归置联接没有任何改进作用。 不过,如果 SQL Server 2005 针对您的查询执行三向(或三向以上)的归置联接,在内存量相对于表大小较小的情况下,SQL Server 2008 中的查询可能运行较慢。 要改进这种情况下的性能,可以增大可用内存量,以及重写查询,以便在合并结果之前分别联接各个分区。 有关归置联接的其他信息,请参阅关于已分区表和索引的查询处理增强功能。
星型联接和并行度
SQL Server 提供了新的优化功能,可用于处理带有使用哈希联接和位图筛选器的星型联接的查询。 当某一查询在星型架构中处理将事实表联接到维度表所带来的大量数据时,使用这一新的优化功能的查询计划的执行速度可大大提高。
这样,如果现有查询适合星型联接模式,您可能看到相应的新查询计划。 在查询优化器的估计指示查询性能将得到提高时,查询优化器将选择此计划。 不过,如果开销估计中所用的统计信息不准确,查询优化器选用的星型联接优化可能比其他计划的执行速度慢。
如果 max degree of parallelism 配置选项或者 MAXDOP 索引选项设置为 1,查询优化器不会使用星型联接优化,您也就享受不到新的星型联接优化所提供的改进功能。 如果查询执行系统调度的查询使用仅具有一个线程的并行计划优化,则可能从多位图筛选器星型联接计划中删除某些位图筛选器。 这种更改可能使减慢的执行速度超出预期,例如从 2 个线程减为 1 个线程时。
星型联接优化功能仅在 SQL Server 的 Enterprise Edition、Developer Edition 和 Evaluation Edition 中提供。 有关位图筛选的详细信息,请参阅通过位图筛选优化数据仓库查询性能。 有关如何解释包含位图筛选器的查询计划的详细信息,请参阅解释包含位图筛选器的执行计划。 有关星型联接优化的详细信息,请参阅 TechNet 杂志文章“Data Warehouse Query Performance”(数据仓库查询性能)。
较少外侧行情况下的并行
SQL Server 2008 将在联接的外侧仅具有较少行时提高嵌套循环联接的并行度。 在 SQL Server 2005 中,如果有多个线程可用,将从联接的外侧为每个线程分配一页上的行。 如果仅有较少的行,这些行很可能位于同一页上。 在这种情况下只会利用一个线程,因而并行处理的潜在优势将丧失。SQL Server 2008 注意到这种情况,并为此引入了“交换运算符”,交换运算符可以为每一个线程分配一行,以充分利用所有可用的 CPU。 这种提高的并行度意味着与 SQL Server 2005 相比,CPU 占用率将暂时提高,但查询执行速度也将得到提高。 只有外侧行数较少且估计的查询开销较大,足以从额外的并行处理中受益的情况下,才会发生这种新行为。 如果估计的查询开销较小或者外侧的基数估计大于 1000,SQL Server 将像 SQL Server 2005 中那样为每个线程分配一页。 有关交换运算符和并行查询处理的详细信息,请参阅并行查询处理。
使用 USE PLAN 提示的分区表查询
SQL Server 2008 更改了对已分区表和索引的查询处理方式。 使用 USE PLAN 提示的已分区对象查询包含的计划可能无效。 建议在升级到 SQL Server 2008 之后使用下列过程。
如果在查询中直接指定 USE PLAN 提示:
从查询删除 USE PLAN 提示。
测试查询。
如果优化器未选择相应的计划、优化查询,则使用所需的查询计划指定 USE PLAN 提示。
如果在计划指南中指定 USE PLAN 提示:
使用 sys.fn_validate_plan_guide 函数来检查计划指南的有效性。 或者,可以使用 SQL Server Profiler 中的 Plan Guide Unsuccessful 事件检查是否存在无效计划。
如果计划指南无效,则删除该计划指南。 如果优化器未选择相应的计划、优化查询,则使用所需的查询计划指定 USE PLAN 提示。
有关已分区对象的查询处理的详细信息,请参阅关于已分区表和索引的查询处理增强功能。
计划指南
在 SQL Server 2008 中,如果不能遵守计划指南,则查询将使用不同的计划进行编译,并且不会返回错误。 在 SQL Server 2005 中,将引发错误,并且查询将失败。
升级到 SQL Server 2008 之后,在 SQL Server 2005 中创建的计划指南可能无效。 无效的计划指南不会导致应用程序失败,但不会使用该计划指南。 建议在将应用程序升级到 SQL Server 的新版本时,重新评估和测试计划指南定义。 性能优化要求和计划指南匹配行为可能会发生更改。 将数据库升级到 SQL Server 2008 之后,应使用 sys.fn_validate_plan_guide 函数执行下列任务来验证现有的计划指南。 或者,可以使用 SQL Server Profiler 中的 Plan Guide Unsuccessful 事件来监视是否有无效的计划指南。
查询处理器体系结构
SQL Server 2008 更改了对已分区表和索引的查询处理方式。 当已分区对象的查询将 USE PLAN 提示用于 SQL Server 2005 生成的计划时,它们包含的计划可能无效。 有关详细信息,请参阅升级数据库引擎时的注意事项。 有关已分区对象的查询处理的详细信息,请参阅关于已分区表和索引的查询处理增强功能。
REPLACE 函数
在 SQL Server 2005 中,当 REPLACE 函数的第一个输入参数属于 char 类型时,将裁剪在该参数中指定的尾随空格。 例如,在 SELECT '<' + REPLACE(CONVERT(char(6), 'ABC '), ' ', 'L') + '>' 语句中,值 'ABC ' 被错误计算为“ABC”。
在 SQL Server 2008 中,尾随空格始终都将保留。 对于依赖函数以前的行为的应用程序,在为函数指定第一个输入参数时,请使用 RTRIM 函数。 例如,以下语法将重现 SQL Server 2005 行为 SELECT '<' + REPLACE(RTRIM(CONVERT(char(6), 'ABC ')), ' ', 'L') + '>'。
系统数据库
资源数据库
在 SQL Server 2005 中,Resource 数据库的数据和日志文件依赖于 master 数据库的数据文件的位置。 因此,移动 master 数据库时还需要将 Resource 数据库移动到同一位置。 在 SQL Server 2008 中,不存在此依赖关系。 可以在不移动 Resource 数据库的情况下移动 master 数据库文件。
在 SQL Server 2008 中,Resource 数据库的默认位置为 <驱动器>:\Program Files\Microsoft SQL Server\MSSQL10.<实例名称>\Binn\。 无法移动 Resource 数据库。
tempdb 数据库
在 SQL Server 的早期版本中,tempdb 数据库的 PAGE_VERIFY 数据库选项设置为 NONE 且不能修改。 在 SQL Server 2008 中,对于全新安装的 SQL Server 的 tempdb 数据库,该默认值为 CHECKSUM。 如果是升级安装 SQL Server,则默认值仍为 NONE。 可以修改该选项。 我们建议为 tempdb 数据库使用 CHECKSUM。
使用 INSERT…SELECT 进行大容量加载数据并按最小方式记录日志
在 SQL Server 的早期版本中,通过使用语句 INSERT INTO <目标表> SELECT <列> FROM <源表> 来将行大容量加载到目标表,但是此操作总是会记录完整的日志。 在 SQL Server 2008 中,当目标表为堆、数据库的恢复模式设置为“简单”或“大容量日志”,且针对目标表指定 TABLOCK 提示时,可以在按最小方式记录日志的情况下执行此操作。 按最小方式记录日志可以提高语句的性能,减少在事务期间此操作填充可用事务日志空间的可能性。 有关详细信息,请参阅 INSERT (Transact-SQL)。
XML
将类型化的 XML 从 SQL Server 2005 升级到 SQL Server 2008
SQL Server 2008 包含对 XML 架构支持(包括对 lax 验证的支持)的多项扩展,改进了对 xs:date、xs:time 和 xs:dateTime 实例数据的处理,并新增了对 list 类型和 union 类型的支持。 大多数情况下,这些更改不会影响升级过程。 但是,如果使用 SQL Server 2005 中允许使用 xs:date、xs:time 或 xs:dateTime(或任何子类型)类型的值的 XML 架构集合,则在将 SQL Server 2005 数据库升级到 SQL Server 2008 时将执行以下升级步骤:
对于每个 xml 列,如果该列是使用包含特定元素或属性(这些元素或属性被类型化为 xs:anyType、xs:anySimpleType、xs:date 或其任何子类型、xs:time 或其任何子类型、xs:dateTime 或其任何子类型,或者属于包含上述任何类型的 union 类型或 list 类型)的 XML 架构集合进行类型化的,将会执行以下操作:
将禁用该列的所有 XML 索引。
将继续采用 Z 时区表示所有 SQL Server 2005 值,这是因为已针对 Z 时区将这些值规范化。
任何小于元年 1 月 1 日的 xs:date 或 xs:dateTime 值在重新生成索引或对包含该值的 xml 数据类型执行 XQuery 或 XML-DML 语句时,都将导致运行时错误。
xs:date 或 xs:dateTime 方面中的任何负年份或 XML 架构集合中的默认值都将自动更新为基 xs:date 或 xs:dateTime 类型允许的最小值。 例如,对于 xs:dateTime,则更新为 0001-01-01T00:00:00.0000000Z。
请注意,即使 XML 数据类型包含负年份,仍可以使用简单的 SQL SELECT 语句来检索整个 xml 数据类型。 我们建议您用新的受支持范围内的年份替换负年份,或将相应元素或属性的类型更改为 xs:string。 有关详细信息,请参阅类型化的 XML 与非类型化的 XML 的比较。
宽松验证与 xs:anyType 元素
SQL Server 2005 中不支持 lax 验证,所以对 anyType 类型的元素进行严格验证。 在 SQL Server 2008 中,使用 lax 验证对 anyType 类型的元素的内容进行验证。 有关详细信息,请参阅通配符组成部分和内容验证。
请参阅
参考
其他资源
更改历史记录
更新的内容 |
---|
添加了“访问检查缓存选项”、“全文搜索”、“并行”和“XML”等部分。 |
添加了“使用 INSERT…SELECT 进行大容量加载数据并按最小方式记录日志”一节。 |
添加了“对撰写 SQL Server 代理任务的脚本中的行为更改”一节。 |