查询优化器在 Microsoft SQL Server 2005 或 Microsoft SQL Server 2008 中使用下列类型的信息来确定的最佳查询计划:
通常,您必须模拟这些所有相同类型的信息,如果您要重新生成查询优化器在测试系统上的行为。
Microsoft 客户支持服务可能会要求您生成的数据库元数据的脚本。Microsoft 客户支持服务使用此脚本的数据库元数据来调查优化程序的问题。本文介绍生成统计信息脚本步骤。本文还介绍如何查询优化器使用该信息。
如果在前您执行该步骤以生成脚本,请确保使用 SQL Server 2005 SQL Server 管理 Studio 是 SQL Server 2005 Service Pack 2 版或更高版本。 如果您使用 SQL Server 管理 Studio 的早期版本中 SQL Server 2005,脚本向导将不会包含所有所需选项的这篇文章中的步骤才能正常工作。
脚本整个数据库
当您生成仅用于统计的克隆数据库时,可能更容易、 更可靠,编写脚本的脚本编写单个对象而不是整个数据库。整个数据库的脚本时您会收到以下好处:
- 避免丢失重现该问题所必需的依赖对象的问题。
- 您需要明显较少的步骤,选择所需的对象。
注意如果您生成一个数据库的脚本,并为数据库元数据包含上千个对象脚本进程会占用大量 CPU 资源。 我们建议您在非高峰时间生成脚本。或使用第二个选项可以生成单独的对象脚本。
编写每个数据库都由您的查询引用的脚本,请按照下列步骤操作:
- 打开 SQL Server 管理 Studio。
- 在 对象资源管理器 中,展开 数据库,文件夹,然后定位要编写脚本的数据库。
- 用鼠标右键单击数据库,指向 任务,然后再单击 生成脚本。
- 脚本向导中验证选择了正确的数据库。 单击以选中 在所选数据库对象的所有脚本 复选框,然后单击 下一步。
- 选择脚本选项 对话框中更改默认值下列设置为在下表中列出的值。
收起该表格展开该表格
| 脚本选项 | 若要选择的值 |
|---|
| Ansi 边距 | 则返回 true |
| 继续出现错误时脚本 | 则返回 true |
| 生成依赖对象的脚本 | 则返回 true |
| 包括系统约束名称 | 则返回 true |
| 排序规则脚本 | 则返回 true |
| 脚本数据库创建 | 则返回 true |
| 脚本登录 | 则返回 true |
| 脚本对象级权限 | 则返回 true |
| 脚本统计 | 脚本统计和柱状图 |
| 脚本索引 | 则返回 true |
| 触发器脚本 | 则返回 true |
注意脚本登录 选项和 脚本对象级权限 选项可能不需要除非架构包含由登录名不是 dbo 拥有的对象。 - 单击 下一步。
- 单击 脚本文件 选项,然后输入文件名称。
- 单击 完成。
脚本的单个对象
您可以仅脚本各个对象的引用的一个特定查询,而不是脚本编写完整的数据库。但是,除非使用 WITH SCHEMABINDING 子句创建所有数据库对象,
sys.depends 系统表中的相关性信息可能总是无法准确。 此错误可能会导致以下问题之一:
- 该脚本进程脚本的相关对象。
- 在脚本编写过程可能脚本中顺序不正确的对象。若要成功运行该脚本,您必须手动编辑生成的脚本。
因此,我们不建议脚本单个的对象,除非该数据库有大量对象和脚本将否则太长。 如果必须使用脚本的单个对象,请按照下列步骤操作:
- 在 SQL Server 管理 Studio,展开 数据库,文件夹,然后定位要编写脚本的数据库。
- 用鼠标右键单击数据库,指向 脚本的数据库为、 指向 要 CREATE,然后再单击 文件。
- 请输入一个文件名,然后单击 保存。
核心数据库容器会编写脚本。此容器包含文件、 文件组、 数据库,和属性。 - 用鼠标右键单击数据库,指向 任务,然后再单击 生成脚本。
- 请确保已选中了正确的数据库,然后单击 下一步。
- 选择脚本选项 对话框中更改默认值下列设置为在下表中列出的值。
收起该表格展开该表格
| 脚本选项 | 若要选择的值 |
|---|
| Ansi 边距 | 则返回 true |
| 继续出现错误时脚本 | 则返回 true |
| 包括系统约束名称 | 则返回 true |
| 生成依赖对象的脚本 | 则返回 true |
| 排序规则脚本 | 则返回 true |
| 脚本登录 | 则返回 true |
| 脚本对象级权限 | 则返回 true |
| 脚本统计 | 脚本统计和柱状图 |
| 脚本使用数据库 | 则返回 true |
| 脚本索引 | 则返回 true |
| 触发器脚本 | 则返回 true |
注意脚本登录 选项和 脚本对象级权限 选项可能不需要除非架构包含由登录名不是 dbo 拥有的对象。 - 选择对象类型 对话框中选择有问题的查询引用的所有数据库对象类型。
例如对于如果查询只引用表,选择 表。 如果查询引用的视图,选择 视图和目录。 如果有问题的查询使用用户定义的函数,选择 函数。 - 在选择查询所引用的所有对象类型单击 下一步。
- 为您在步骤 7 中选择的每个数据库对象类型出现一个对话框。 在每个对话框框中选择特定的表、 视图、 函数,或其他数据库对象,然后单击 下一步。
- 单击 脚本文件 选项,然后指定您在步骤 3 中输入的文件名称相同。
- 单击 完成 以启动该脚本。
当该脚本已完成后,将脚本文件发送到 Microsoft 支持工程师。 Microsoft 支持工程师还可能会请求以下信息:
- 其中包括处理器和 $ 存在多少物理内存数量的硬件配置
- 当您运行查询时处于活动状态的 SET 选项
注意您可能已经提供此信息通过发送 SQLDiag 报告或 SQL 事件探查器跟踪。您可能会另外使用另一种方法提供此信息。
该信息的使用方式
下表帮助说明如何查询优化器使用此信息来选择查询计划。
元数据
收起该表格展开该表格
| 约束 | 查询优化器经常使用来检测在查询和基础架构之间的冲突的约束。例如查询有一个"WHERE col = 5"子句和一个"CHECK (col < 5)"check 约束存在,则查询优化器知道将匹配的任何行。
查询优化器将扣除额为空性有关的相似类型。例如对于"WHERE col IS NULL"子句是已知为真或假,具体取决于列的为空性和列是否是从一个外部联接的外部表中。FOREIGN KEY 约束的存在可用于确定基数和适当的联接顺序。查询优化器可用于消除联接或简化谓词的约束信息。这些更改可能会删除在访问基表的要求。 |
| 统计信息 | 统计信息包含密度和直方图,显示前导列的索引和统计信息的键的分布。根据谓词性质查询优化器可能会使用密度和 / 或直方图中,可以估计谓词的基数。新的统计信息所需的准确的基数估计值。基数估计使用作为估计成本的运算符的输入。因此,您必须具有良好的基数估计值以获得最佳的查询计划。 |
| 表的大小 (行数和页面) | 查询优化器使用直方图和密度计算给定的谓词为真或假的概率。 最终的基数估计概率乘以由子运算符返回的行数计算。 在表或索引中的页数是估计 IO 成本的一个因素。 表的大小用来计算一个扫描的成本,它非常有用的当您估计一个索引搜索期间被访问的页数。 |
| 数据库选项 | 多个数据库选项可能会影响优化。AUTO_CREATE_STATISTICS 和 AUTO_UPDATE_STATISTICS 选项会影响查询优化器将创建新的统计信息或已过期的更新统计信息。参数化功能 级别会影响之前输入的查询传递给查询优化器输入的查询参数化方式。参数化功能可能影响基数估计,还可阻止与索引的视图和其他类型的优化匹配。DATE_CORRELATION_OPTIMIZATION 设置可以使优化器来搜索的列之间的关联。此设置将影响基数和成本的估计。 |
环境
收起该表格展开该表格
| 会话的 SET 选项 | ANSI_NULLS 是否设置会影响该"NULL = NULL"表达式的计算结果为 true。为外部联接的基数估计可能会更改,具体取决于当前的设置。此外,不明确的表达式可能也会更改。例如对于在"列 = NULL"表达式的计算结果以不同的方式基于设置。然而,在"col IS NULL"表达式的计算结果始终相同的方式。 |
| 硬件资源 | 排序和哈希的运算符的成本取决于相对 SQL Server 可用的内存量。例如对于比高速缓存大的数据的大小是否查询优化器知道数据始终必须进行后台处理到磁盘。但是,远远小于高速缓存的数据的大小是否很可能在内存中来完成该操作。如果服务器有多个处理器,如果通过使用"MAXDOP"提示或 最大并行度 配置选项不禁用并行度 SQL Server 还将视为不同的优化。 |
| SQL Server 股票保持单位 (SKU) | 某些功能仅启用 SQL Server 2005 年或 SQL Server 2008 年的特定版本。例如对于匹配对索引视图的查询仅出现在 SQL Server 2005 企业版中。同样,规划指南与匹配仅限于 SQL Server 2000 标准版和 SQL Server 2005 企业版。 |
文章编号: 914288 - 最后修改: 2009年4月7日 - 修订: 3.0
这篇文章中的信息适用于:
- Microsoft SQL Server 2005 Developer Edition
- Microsoft SQL 2005 Server Enterprise
- Microsoft SQL Server 2005 Enterprise X64 Edition
- Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
- Microsoft SQL Server 2005 Standard Edition
- Microsoft SQL Server 2005 Standard X64 Edition
- Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
- 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 kbexpertiseinter kbexpertiseadvanced kbsql2005engine kbhowto kbinfo KB914288 KbMtzh |
机器翻译注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:
914288
(http://support.microsoft.com/kb/914288/en-us/
)
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。