如何生成所需的数据库元数据在 SQL Server 中创建仅统计数据库的脚本

简介

在 Microsoft SQL Server 查询优化器使用以下类型的信息来确定最佳查询计划︰

  • 数据库元数据

  • 硬件环境

  • 数据库会话状态

通常情况下,必须模拟所有这些相同类型的信息,如果您想要重现测试系统上查询优化器的行为。

Microsoft 客户支持服务可能会要求您生成脚本的数据库元数据。Microsoft 客户支持服务使用此脚本的数据库元数据研究的优化问题。本文描述的步骤来生成统计信息的脚本。本文还介绍了如何查询优化器将使用的信息。

详细信息

如果您使用 SQL Server 2005 中,按照步骤生成脚本之前,请确保 SQL Server 管理 Studio 是 SQL 服务器 2005 Service Pack 2 版或更高版本。 如果您使用早期版本的 SQL Server 管理 Studio 在 SQL Server 2005 时,脚本向导不包含所有必需选项为此文章中的步骤才能正常工作。

整个数据库脚本

仅统计信息克隆数据库生成时,可能更容易和更可靠的方法来编写脚本而不是脚本编写单个对象的整个数据库。当脚本整个数据库时,您将得到以下好处︰

  • 可以避免缺重现该问题所需的依存对象的问题。

  • 您需要明显更少的步骤,选择所需的对象。

注意:如果数据库的元数据包含上千个对象生成的数据库的脚本,脚本进程占用了大量的 CPU 资源。 我们建议您在非高峰时间生成脚本。或者,您可以使用第二个选项生成单个对象的脚本。

编写脚本您查询所引用的每个数据库,请执行以下步骤︰

  1. 打开 SQL Server 管理 Studio。

  2. 对象资源管理器中展开数据库,然后找到要编写脚本的数据库。

  3. 用鼠标右键单击数据库,指向任务,然后单击生成脚本

  4. 在脚本向导中,请验证选择了正确的数据库。 单击以选中在所选数据库对象的所有脚本复选框,然后单击下一步

  5. 选择脚本选项对话框中,更改以下设置的默认值为下表中列出的值。

    脚本选项

    要选择值

    Ansi 填充

    继续编写脚本错误

    生成依赖对象的脚本

    包括系统约束名

    排序规则脚本

    创建数据库的脚本

    登录脚本

    脚本对象级权限

    编写统计信息脚本

    编写统计信息脚本和柱状图

    索引脚本

    触发器脚本

    注意:登录脚本脚本对象级别的权限选项可能不需要除非架构包含归登录dbo之外的对象。

  6. 单击下一步

  7. 单击脚本保存到文件选项,然后输入一个文件名。

  8. 单击完成

各个对象的脚本

您可以仅脚本各个对象所引用的特定的查询,而不是脚本编写完整的数据库。但是,除非使用具有架构绑定子句创建的所有数据库对象, sys.depends系统表中的相关性信息可能始终不准确。 此错误可能会导致以下问题之一︰

  • 脚本编写过程不编写脚本的依赖对象。

  • 脚本编写过程可能脚本中的正确顺序的对象。若要成功运行此脚本,您必须手动编辑生成的脚本。

因此,我们不建议编写脚本是单个对象,除非该数据库有大量对象和脚本将否则花很长时间。 如果必须使用单独的脚本对象,请执行以下步骤︰

  1. 在 SQL Server 管理 Studio 中,展开数据库,然后找到要编写脚本的数据库。

  2. 用鼠标右键单击数据库、 指向数据库脚本视为、 指向创建,然后单击文件

  3. 输入文件的名称,然后单击保存

    核心数据库容器将为其编写脚本。这个容器包括文件、 文件组、 数据库和属性。

  4. 用鼠标右键单击数据库,指向任务,然后单击生成脚本

  5. 请确保选择了正确的数据库,,然后单击下一步

  6. 选择脚本选项对话框中,更改以下设置的默认值为下表中列出的值。

    脚本选项

    要选择值

    Ansi 填充

    继续编写脚本错误

    包括系统约束名

    生成依赖对象的脚本

    排序规则脚本

    登录脚本

    脚本对象级权限

    编写统计信息脚本

    编写统计信息脚本和柱状图

    使用数据库脚本

    索引脚本

    触发器脚本

    注意:登录脚本脚本对象级别的权限选项可能不需要除非架构包含归登录dbo之外的对象。

  7. 选择对象类型对话框中,选择有问题的查询所引用的所有数据库对象类型。

    例如,如果查询只引用表,选择。 如果查询引用视图,请选择视图和表。 如果有问题的查询使用一个用户定义的函数,选择函数

  8. 当您选择查询所引用的对象类型时,单击下一步

  9. 对话框中会显示您在步骤 7 中选择每个数据库对象类型。 在每个对话框中,选择特定的表、 视图、 函数或其他数据库对象,,然后单击下一步

  10. 单击脚本保存到文件选项,然后指定您在步骤 3 中输入的文件名称相同。

  11. 单击完成以启动该脚本。

当该脚本已完成,将脚本文件发送给 Microsoft 技术支持工程师。 Microsoft 技术支持工程师还可能要求下列信息︰

  • 硬件配置,包括处理器和存在多少物理内存的数量

  • 当您运行查询时处于活动状态的设置选项

注意:您可能已经提供此信息通过发送一个 SQLDiag 报告或 SQL 事件探查器跟踪。您可能还使用另一种方法来提供此信息。

信息的使用方式

以下各表有助于解释查询优化程序如何使用此信息来选择查询计划。

元数据

约束

查询优化器通常使用约束来检测查询和基础架构之间的矛盾。例如,如果查询中有"位置栏 = 5"条款和"检查 (col < 5)"check 约束存在,查询优化器知道将匹配的任何行。

查询优化器作出相似类型的可空性有关的扣除额。例如,已知"所在列的 NULL"子句为 true 或 false,具体取决于列的为空性和该列是否来自外部表的外部联接。外键约束的存在将有助于确定基数,并相应的联接次序。查询优化器可以使用约束信息来消除联接或简化谓词。这些更改可能删除访问基表的要求。

统计信息

统计信息包括密度和显示的前导键的列的索引和统计分布的直方图。根据谓词的性质,查询优化器可以使用密度和 / 或直方图,可以估计谓词的基数。最新的统计数据都需要精确的基数估计值。基数估计值被用作运算符的成本估算中的输入。因此,您必须具有良好的基数的估计,以获得最佳查询计划。

表的大小 (行数和页)

查询优化器使用直方图和密度来计算给定的谓词为真或假的可能性。 最终的基数估计值计算概率乘以由子运算符返回的行数。表或索引中的页面数是估计 IO 成本的因素。 表的大小用来计算成本一次扫描,并估计将在索引查找过程中访问的页数时非常有用。

数据库选项

几个数据库选项可能会影响优化。AUTO_CREATE_STATISTICSAUTO_UPDATE_STATISTICS选项会影响查询优化器将创建新的统计数据或已过期的更新统计信息。参数化级别影响之前输入的查询传递给查询优化器输入的查询进行参数化方式。参数化可影响基数估计,还可以防止针对索引的视图和其他类型的优化匹配。DATE_CORRELATION_OPTIMIZATION设置会导致优化程序要搜索的列之间的关联。此设置影响基数和成本的估计。

环境

会话设置选项

ANSI_NULLS是否设置影响"NULL = NULL"表达式的计算结果为 true。外部联接的基数估计可能会更改取决于当前的设置。此外,还可以更改不明确的表达式。例如,"列 = NULL"表达式的计算结果以不同的方式取决于设置。但是,"col IS NULL"始终表达式的计算结果相同的方式。

硬件资源

排序和希运算符的成本取决于相对的 SQL Server 使用的内存量。例如,如果数据的大小大于高速缓存,查询优化器将知道必须始终进行后台数据到磁盘。但是,如果数据的大小是缓存相比要小得多,操作很可能会在内存中完成。如果服务器有多个处理器,如果未禁用并行使用"MAXDOP"提示或最大并行度配置选项,SQL Server 还将考虑不同的优化。

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

你对翻译质量的满意程度如何?

哪些因素影响了你的体验?

是否还有其他反馈?(可选)

谢谢您的反馈意见!

×