数据库引擎优化顾问依赖于查询优化器来分析工作负荷并提出优化建议。 在生产服务器上执行此分析会增加服务器负载,并且可能会在优化会话期间损害服务器性能。 除了生产服务器之外,还可以使用测试服务器减少在优化会话期间对服务器负载的影响。
数据库引擎优化顾问如何使用测试服务器
使用测试服务器的传统方法是将生产服务器中的所有数据复制到测试服务器,优化测试服务器,然后在生产服务器上实施建议。 此过程消除了对生产服务器的性能影响,但并不是最佳解决方案。 例如,将大量数据从生产环境复制到测试服务器可能会消耗大量时间和资源。 此外,测试服务器的硬件往往不如用于生产服务器的硬件那样强大。 优化过程依赖于查询优化器,其生成的建议部分基于基础硬件。 如果测试和生产服务器硬件不相同,数据库引擎优化顾问建议质量会降低。
为了避免这些问题,数据库引擎优化顾问通过将大部分优化负载卸载到测试服务器上来优化生产服务器上的数据库。 它通过使用生产服务器硬件配置信息执行此作,而不会实际将数据从生产服务器复制到测试服务器。 数据库引擎优化顾问不会将实际数据从生产服务器复制到测试服务器。 它仅复制元数据和必要的统计信息。
以下步骤概述了在测试服务器上优化生产数据库的过程:
确保想要使用测试服务器的用户存在于这两个服务器上。
在开始之前,请确保想要使用测试服务器优化生产服务器上的数据库的用户存在于这两个服务器上。 这要求在测试服务器上创建用户及其登录名。 如果你是两台计算机上的 sysadmin 固定服务器角色的成员,则不需要此步骤。
优化测试服务器上的工作负荷。
若要优化测试服务器上的工作负荷,必须将 XML 输入文件与 dta 命令行实用工具一起使用。 在 XML 输入文件中,除了指定 TuningOptions 父元素下其他子元素的值外,还使用 TestServer 子元素指定测试服务器的名称。
在优化过程中,数据库引擎优化顾问会在测试服务器上创建 shell 数据库。 若要创建此 shell 数据库并对其进行优化,数据库引擎优化顾问会针对以下项调用生产服务器:
数据库引擎优化顾问将元数据从生产数据库导入测试服务器 shell 数据库。 此元数据包括空表、索引、视图、存储过程、触发器等。 这使工作负荷查询能够针对测试服务器 shell 数据库执行。
数据库引擎优化顾问从生产服务器导入统计信息,以便查询优化器可以准确优化测试服务器上的查询。
数据库引擎优化顾问导入硬件参数,指定生产服务器中的处理器数和可用内存,以便为查询优化器提供生成查询计划所需的信息。
数据库引擎优化顾问完成优化测试服务器 shell 数据库后,会生成优化建议。
将从优化测试服务器收到的建议应用于生产服务器。
下图显示了测试服务器和生产服务器方案:
注释
数据库引擎优化顾问图形用户界面(GUI)不支持测试服务器优化功能。
示例:
首先,请确保想要执行优化的用户同时存在于测试和生产服务器上。
将用户信息复制到测试服务器后,可以在数据库引擎优化顾问 XML 输入文件中定义测试服务器优化会话。 以下示例 XML 输入文件演示如何指定测试服务器以使用数据库引擎优化顾问优化数据库。
在此示例中,MyDatabaseName 上正在调优 MyServerName 数据库。 Transact-SQL 脚本 MyWorkloadScript.sql 用作任务负载。 此工作负荷包含在 MyDatabaseName 上执行的事件。 对作为优化过程的一部分发生的此数据库的大多数查询优化器调用由驻留在 MyTestServerName上的 shell 数据库处理。 shell 数据库由元数据和统计信息组成。 此过程会导致将调优开销卸载到测试服务器。 当数据库引擎优化顾问使用此 XML 输入文件生成其优化建议时,它应仅考虑索引(<FeatureSet>IDX</FeatureSet>),不进行分区,并且不需要保留任何现有的物理设计结构 MyDatabaseName。
<?xml version="1.0" encoding="utf-16" ?>
<DTAXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://schemas.microsoft.com/sqlserver/2004/07/dta">
<DTAInput>
<Server>
<Name>MyServerName</Name>
<Database>
<Name>MyDatabaseName</Name>
</Database>
</Server>
<Workload>
<File>MyWorkloadScript.sql</File>
</Workload>
<TuningOptions>
<TestServer>MyTestServerName</TestServer>
<FeatureSet>IDX</FeatureSet>
<Partitioning>NONE</Partitioning>
<KeepExisting>NONE</KeepExisting>
</TuningOptions>
</DTAInput>
</DTAXML>