本文介绍如何使用数据库元数据生成统计信息脚本,以便在 SQL Server 中创建仅统计信息数据库。
原始产品版本: SQL Server 2014、SQL Server 2012、SQL Server 2008
原始 KB 数: 914288
简介
DBCC CLONEDATABASE 是生成数据库仅架构克隆以调查性能问题的首选方法。 仅当无法使用时,才使用 DBCC CLONEDATABASE
本文中的过程。
Microsoft SQL Server 中的查询优化器使用以下类型的信息来确定最佳查询计划:
- 数据库元数据
- 硬件环境
- 数据库会话状态
通常,必须模拟所有这些相同的信息类型,以重现测试系统上查询优化器的行为。
Microsoft客户支持服务可能会要求你生成数据库元数据的脚本来调查查询优化器问题。 本文介绍生成统计信息脚本的步骤,还介绍了查询优化器如何使用信息。
注意
此数据中保存的密钥可能包含 PII 信息。 例如,如果表包含具有 统计信息的电话号码 列,则每个步骤的高键值将位于生成的统计信息脚本中。
编写整个数据库的脚本
生成仅限统计信息的克隆数据库时,编写整个数据库的脚本可能更简单、更可靠,而不是编写单个对象的脚本。 编写整个数据库的脚本时,将获得以下优势:
- 避免出现重现问题所需的缺少依赖对象的问题。
- 只需执行更少的步骤即可选择所需的对象。
请注意,如果为数据库生成脚本,并且数据库的元数据包含数千个对象,则脚本进程会消耗大量的 CPU 资源。 建议在非高峰时段生成脚本,也可以使用第二个选项 “编写单个对象 脚本”来生成单个对象的脚本。
若要编写查询引用的每个数据库的脚本,请执行以下步骤:
打开 SQL Server Management Studio。
在对象资源管理器中,展开“数据库”,然后找到要编写脚本的数据库。
右键单击数据库,指向 “任务”,然后选择“ 生成脚本”。
在脚本向导中,验证是否选择了正确的数据库。 单击以选择脚本 整个数据库和所有数据库对象,然后选择“ 下一步”。
在 “选择脚本选项 ”对话框中,选择“ 高级 ”按钮,将以下设置从默认值更改为下表中列出的值。
脚本选项 要选择的值 Ansi 填充 True 出错时继续编写脚本 True 为依赖对象生成脚本 True 包括系统约束名称 True 脚本排序规则 True 脚本登录名 True 脚本对象级别权限 True 脚本统计信息 脚本统计信息和直方图 脚本索引 True 脚本触发器 True 注意
请注意,除非架构包含由 dbo 以外的登录名拥有的对象,否则可能不需要“脚本登录名”选项和“脚本对象级别权限”选项。
选择“确定”以保存更改,然后关闭“高级脚本选项”页。
选择“ 保存到文件 ”,然后选择“ 单个文件 ”选项。
查看所选内容,然后选择“ 下一步”。
选择“完成”。
编写单个对象的脚本
只能编写特定查询引用的单个对象脚本,而不是编写完整数据库的脚本。 但是,除非使用 WITH SCHEMABINDING
子句创建了所有数据库对象,否则系统表中的 sys.depends
依赖项信息可能并不总是准确的。 这种不准确可能会导致以下问题之一:
脚本过程不会编写依赖对象脚本。
脚本过程可能会按不正确的顺序编写对象脚本。 若要成功运行脚本,必须手动编辑生成的脚本。
因此,建议不要编写单个对象的脚本,除非数据库具有许多对象,否则脚本编写将花费太长的时间。 如果必须使用脚本单个对象,请执行以下步骤:
在 SQL Server Management Studio 中,展开 “数据库”,然后找到要编写脚本的数据库。
右键单击数据库,指向“脚本数据库为”,然后指向“创建目标”,然后选择“文件”。
输入文件名,然后选择“ 保存”。
核心数据库容器将编写脚本。 此容器包括文件、文件组、数据库和属性。
右键单击数据库,指向 “任务”,然后选择“ 生成脚本”。
确保选择了正确的数据库,然后选择“ 下一步”。
在 “选择对象类型 ”对话框中,选择 特定数据库对象,然后选择有问题的查询引用的所有数据库对象类型。
例如,如果查询仅引用表,请选择“ 表”。 如果查询引用视图,请选择“ 视图和表”。 如果有问题的查询使用用户定义的函数,请选择 “函数”。
选择查询引用的所有对象类型后,请选择“ 下一步”。
在“设置脚本选项”对话框中,选择“高级”按钮,并将以下设置从默认值更改为“高级脚本选项”页上下表中列出的值。
脚本选项 要选择的值 Ansi Padding True 出错时继续编写脚本 True 包括系统约束名称 True 为依赖对象生成脚本 True 脚本排序规则 True 脚本登录名 True 脚本对象级别权限 True 脚本统计信息 脚本统计信息和直方图 编写 USE DATABASE 脚本 True 脚本索引 True 脚本触发器 True 注意
请注意,除非架构包含由 dbo 以外的登录名拥有的对象,否则可能不需要脚本登录名和脚本对象级别权限选项。
选择“确定”以保存并关闭“高级脚本选项”页。
在步骤 7 中选择的每个数据库对象类型将显示一个对话框。
在每个对话框中,选择特定的表、视图、函数或其他数据库对象,然后选择“ 下一步”。
选择“ 脚本到文件 ”选项,然后指定在步骤 3 中输入的同一文件名。
选择“完成”以启动脚本。
脚本编写完成后,将脚本文件发送到Microsoft 支持部门工程师。 Microsoft 支持部门工程师可能还会请求以下信息:
硬件配置,包括处理器数以及存在多少物理内存。
运行查询时处于活动状态的 SET 选项。
请注意,你可能已通过发送 SQLDiag 报表或 SQL 探查器跟踪来提供此信息。 你可能还使用了另一种方法来提供此信息。
如何使用信息
下表有助于说明查询优化器如何使用此信息来选择查询计划。
Metadata
选项 | 解释 |
---|---|
约束 | 查询优化器经常使用约束来检测查询与基础架构之间的矛盾。 例如,如果查询包含 WHERE col = 5 子句,并且 CHECK (col < 5) 基础表上存在约束,则查询优化器知道不会匹配任何行。 查询优化器对可为空性进行类似类型的推导。 例如,根据列的可为 null 性以及列是否来自外部联接的外部表, WHERE col IS NULL 该子句已知为 true 或 false。 FOREIGN KEY 约束的存在有助于确定基数和适当的联接顺序。 查询优化器可以使用约束信息来消除联接或简化谓词。 这些更改可能会删除访问基表的要求。 |
统计信息 | 统计信息信息包含密度和直方图,显示索引和统计信息键前导列的分布情况。 根据谓词的性质,查询优化器可以使用密度、直方图或两者来估计谓词的基数。 准确的基数估计需要最新的统计信息。 基数估计用作估算运算符成本的输入。 因此,必须有良好的基数估计才能获得最佳查询计划。 |
表大小(行数和页数) | 查询优化器使用直方图和密度来计算给定谓词为 true 或 false 的概率。 最终基数估计是通过将子运算符返回的行数乘以概率来计算的。 表或索引中的页数是估算 IO 成本的一个因素。 表大小用于计算扫描成本,在估计在索引查找期间访问的页数时非常有用。 |
数据库选项 | 多个数据库选项可能会影响优化。 AUTO_UPDATE_STATISTICS 和AUTO_CREATE_STATISTICS 选项会影响查询优化器是否会创建新的统计信息或更新过期的统计信息。 参数化级别会影响在将输入查询传递给查询优化器之前如何参数化输入查询。 参数化可能会影响基数估计,还可以防止与索引视图和其他类型的优化进行匹配。 该 DATE_CORRELATION_OPTIMIZATION 设置会导致优化器搜索列之间的关联。 此设置会影响基数和成本估算。 |
环境
选项 | 解释 |
---|---|
会话 SET 选项 | 该 ANSI_NULLS 设置会影响表达式的计算结果是否 NULL = NULL 为 true。 外部联接的基数估计可能会根据当前设置而更改。 此外,不明确的表达式也可能更改。 例如,表达式 col = NULL 根据设置以不同的方式计算。 但是,表达式 col IS NULL 始终以相同的方式计算。 |
硬件资源 | 排序和哈希运算符的成本取决于 SQL Server 可用的相对内存量。 例如,如果数据的大小大于缓存,则查询优化器知道数据必须始终后台处理到磁盘。 但是,如果数据的大小比缓存小得多,则操作很可能在内存中完成。 如果服务器有多个处理器,并且未使用 MAXDOP 提示或最大并行度配置选项禁用并行度,则 SQL Server 还会考虑不同的优化。 |