你目前正处于脱机状态,正在等待 Internet 重新连接

FIX: 运行查询以检索 BLOB 数据 SQL Server 2005 年或 SQL Server 2008 中使用 NOLOCK 表提示时, 在查询运行得非常缓慢

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 961049
Microsoft 将 Microsoft SQL Server 2005 修补程序分发作为一个可下载的文件。因为该修补程序是累积性的因此每个新版本包含的所有修补程序和所有安全修补程序附带以前 SQL Server 2005 修补都程序版本。
Microsoft 分布 Microsoft SQL Server 2008 修复程序作为一个可下载的文件。因为该修补程序是累积性的因此每个新版本包含的所有修补程序和所有安全修复程序以前 SQL Server 2008 中包含的修补都程序版本。
症状
您可以使用 NOLOCK 表提示,在 Microsoft SQL Server 2005 或 Microsoft SQL Server 2008 中的查询。查询从一个大型表读取二进制大对象 (BLOB) 数据的下列数据类型之一:
  • 文本数据类型
  • nText 数据类型
  • 图像数据类型
您在运行查询时在查询的运行速度很慢。如果您检查查询生成的磁盘活动,您注意到的逻辑读取数是非常高。

注意若要显示磁盘活动,请使用 SET 统计 IO ON 子句来运行该查询。
原因
当使用 NOLOCK 表提示的查询中读取 BLOB 数据时 SQL Server 验证每个 BLOB 页通过检查相应的索引分配映射 (IAM) 分配。IAM 是分配页的链接的列表。每个 IAM 页可以包含大约 4 GB 的数据 (8 KB 页大小 * 8 页 * 64,000 个扩展盘区)。大型对象是否验证操作可能导致过多的逻辑读取。

例如对于有大型对象映射到一个文件组。文件组中的文件的总大小为 700 GB。在这种情况下此对象的 IAM 可以包含多达 175 的页面。如果您现在使用 NOLOCK 表提示,运行一个查询在此对象上,并且查询访问 10,000 BLOB 页面与 IAM 页相关的逻辑读取次数将 175 * 10,000 = 1,750,000 在最坏的情况下。 如果 SQL Server 通过遍历该链接列表的下半部分中找到相应的 IAM 页,与 IAM 页相关的逻辑读取操作的平均数目将大约 1,750,000 / 2 = 875,000。这是要为一个查询,以访问 10,000 BLOB 页会招致系统开销太高。
解决方案

SQL Server 2005 年的累积更新信息

累积更新 3 为 SQL Server 2005 Service Pack 3 中第一次释放此问题的修复程序。有关如何获取 SQL Server 2005 年此累积更新包的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
967909累积更新包 3 为 SQL Server 2005 Service Pack 3
注意因为这些版本是累积性的因此每个新的修补程序版本包含的所有修补程序和所有安全修补程序附带以前 SQL Server 2005 修补都程序版本。我们建议您考虑应用最新的修补程序版本包含此修补程序。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
960598SQL Server 2005 生成发布后发布 SQL Server 2005 Service Pack 3

SQL Server 2008 年的累积更新信息

累积更新 5 SQL Server 2008 年中第一次释放此问题的修复程序。有关如何获取 SQL Server 2008 年此累积更新包的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
969531累积更新包 5 SQL Server 2008 年
注意因为这些版本是累积性的因此每个新的修补程序版本包含的所有修补程序和所有安全修复程序以前 SQL Server 2008 中包含的修补都程序版本。我们建议您考虑应用最新的修补程序版本包含此修补程序。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
956909SQL Server 2008 生成 SQL Server 2008 发布之后发布的
状态
Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。
更多信息
此问题的修复程序可以迅速确定是否实际分配 BLOB 页使用 IAM 缓存。

有关哪些文件发生更改的详细信息,并应用累积更新包包含此 Microsoft 知识库文章中描述的修补程序的任何系统必备项有关的信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
967909累积更新包 3 为 SQL Server 2005 Service Pack 3
有关哪些文件发生更改的详细信息,并应用累积更新包包含此 Microsoft 知识库文章中描述的修补程序的任何系统必备项有关的信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
969531累积更新包 5 SQL Server 2008 年
参考
SQL Server 2005 Service Pack 3 后可用的生成的列表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
960598SQL Server 2005 生成发布后发布 SQL Server 2005 Service Pack 3
SQL Server 2008 后可用的生成的列表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
956909SQL Server 2008 生成 SQL Server 2008 发布之后发布的
对于 SQL Server 增量的服务模型的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
935897一个增量的服务模型是可从 SQL Server 团队提供报告的问题的修补程序
有关命名 SQL Server 更新架构的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
822499Microsoft SQL Server 软件更新程序包的新命名架构
有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824684用于描述 Microsoft 软件更新的标准术语的说明

警告:本文已自动翻译

属性

文章 ID:961049 - 上次审阅时间:05/18/2009 23:00:42 - 修订版本: 3.0

Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems, Microsoft SQL 2005 Server Workgroup, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Web, Microsoft SQL Server 2008 Workgroup

  • kbmt kbsurveynew kbhotfixrollup kbfix kbqfe kbexpertiseadvanced KB961049 KbMtzh
反馈
ement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">