

# 使用 Database Engine Tuning Advisor 分析 Amazon RDS for SQL Server 数据库实例上的数据库工作负载
<a name="Appendix.SQLServer.CommonDBATasks.Workload"></a>

Database Engine Tuning Advisor 是 Microsoft 提供的客户端应用程序，用于分析数据库工作负载，并根据您运行的查询种类对 Microsoft SQL Server 数据库提供最佳索引集建议。像 SQL Server Management Studio 一样，在连接到运行 SQL Server 的 Amazon RDS 数据库实例的客户端计算机上运行 Tuning Advisor。客户端计算机可以是在您自有网络内部运行的本地计算机，也可以是在您的 Amazon RDS 数据库实例所在区域中运行的 Amazon EC2 Windows 实例。

本部分介绍如何捕获工作负载供 Tuning Advisor 分析。对于捕获工作负载，这是一个首选过程，因为 Amazon RDS 限制了主机对 SQL Server 实例的访问。有关更多信息，请参阅 Microsoft 文档中的 [Database Engine Tuning Advisor](https://docs.microsoft.com/en-us/sql/relational-databases/performance/database-engine-tuning-advisor)。

要使用 Tuning Advisor，必须为其提供所谓的工作负载。工作负载是一系列 Transact - SQL 语句，它们是针对您要优化的一个或多个数据库上运行的。在优化数据库时，Database Engine Tuning Advisor 会以工作负载输入的形式使用跟踪文件、跟踪表、Transact - SQL 脚本或 XML 文件。在使用 Amazon RDS 时，工作负载可能是客户端计算机上的文件，也可能是客户端计算机可访问的 Amazon RDS for SQL Server 数据库上的数据库表。该文件或表必须包含对您要优化的数据库进行查询的命令，并且这些命令必须是适合重新执行的格式。

为了让 Tuning Advisor 实现最大的效率，工作负载应尽可能真实。您可以通过对数据库实例执行跟踪来生成工作负载文件或表。运行跟踪时，可以在数据库实例上模拟负载，也可以用正常负载运行应用程序。

跟踪方式有两种：客户端跟踪和服务器端跟踪。客户端跟踪的设置比较容易，并且可以在 SQL Server Profiler 中实时观察捕获到的跟踪事件。服务器端跟踪的设置比较复杂，并需要编写一些 Transact - SQL 脚本。此外，因为跟踪会写入 Amazon RDS 数据库实例上的文件中，所以跟踪会占用存储空间。请务必跟踪正在运行的服务器端跟踪所占用的存储空间大小，这点非常重要，因为数据库实例可能会进入存储已满状态，从而会在存储空间不足时不再可用。

对于客户端跟踪，在 SQL Server Profiler 捕获到足量的跟踪数据后，您可以通过以下方式生成工作负载文件：将跟踪保存到本地计算机上的文件中，或保存到客户端计算机可用的数据库实例上的数据库表中。使用客户端跟踪的主要缺点是，在高负载情况下，跟踪可能无法捕获到所有查询。这可能会降低 Database Engine Tuning Advisor 执行的分析的有效性。如果您需要在高负载下运行跟踪并要确保可捕获到跟踪会话期间的所有查询，则应使用服务器端跟踪。

对于服务器端跟踪，您必须将数据库实例上的跟踪文件存储到合适的工作负载文件，您也可以在完成跟踪后将跟踪保存到数据库实例上的表中。您可以使用 SQL Server Profiler 将跟踪保存到本地计算机上的文件，或从数据库实例的跟踪表中读取 Tuning Advisor。

# 在 SQL Server 数据库实例上运行客户端跟踪
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.ClientSide"></a>

 **在 SQL Server 数据库实例上运行客户端跟踪** 

1. 启动 SQL Server Profiler。此工具安装在 SQL Server 实例文件夹的“性能工具”文件夹内。要启动客户端跟踪，您必须加载或定义一个跟踪定义模板。

1. 在 SQL Server Profiler 的“File (文件)”菜单中，选择 **New Trace (新跟踪)**。在 **Connect to Server** 对话框中，输入要运行跟踪的数据库的数据库实例终端节点、端口、主用户名和密码。

1. 在 **Trace Properties** 对话框中，输入跟踪名称并选择跟踪定义模板。应用程序附带有默认模板 TSQL\$1Replay。您可以通过编辑此模板来定义跟踪。在 **Trace Properties** 对话框的 **Events Selection** 选项卡下编辑事件和事件信息。

   有关跟踪定义模板及使用 SQL Server Profiler 指定客户端跟踪的详细信息，请参阅 Microsoft 文档中的 [Database Engine Tuning Advisor](https://docs.microsoft.com/en-us/sql/relational-databases/performance/database-engine-tuning-advisor)。

1. 启动客户端跟踪并实时查看在数据库实例上运行的 SQL 查询。

1. 完成跟踪后，在 **File (文件)** 菜单中选择 **Stop Trace (停止跟踪)**。在数据库实例上将结果另存为文件或跟踪表。

# 在 SQL Server 数据库实例上运行服务器端跟踪
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.ServerSide"></a>

通过编写脚本创建服务器端跟踪这一过程可能较为复杂，且已超出本文档的讨论范围。本部分包含一些您可以用作示例的示例脚本。与客户端跟踪一样，服务器端跟踪的目的是，创建可通过 Database Engine Tuning Advisor 打开的工作负载文件或跟踪表。

下面显示的是一个简化的示例脚本，用于启动服务器端跟踪并将详细信息捕获到工作负载文件。跟踪最初会将信息保存到 D:\$1RDSDBDATA\$1Log 目录中的 RDSTrace.trc 文件，且会每 100 MB 转换一个跟踪文件，这样，后续的跟踪文件命会依次命名为 RDSTrace\$11.trc、RDSTrace\$12.trc 等。

```
DECLARE @file_name NVARCHAR(245) = 'D:\RDSDBDATA\Log\RDSTrace';
DECLARE @max_file_size BIGINT = 100;
DECLARE @on BIT = 1
DECLARE @rc INT
DECLARE @traceid INT

EXEC @rc = sp_trace_create @traceid OUTPUT, 2, @file_name, @max_file_size
IF (@rc = 0) BEGIN
   EXEC sp_trace_setevent @traceid, 10, 1, @on
   EXEC sp_trace_setevent @traceid, 10, 2, @on
   EXEC sp_trace_setevent @traceid, 10, 3, @on
 . . .
   EXEC sp_trace_setfilter @traceid, 10, 0, 7, N'SQL Profiler'
   EXEC sp_trace_setstatus @traceid, 1
   END
```

以下示例是停止跟踪的脚本。请注意，以前的脚本所创建的跟踪会继续运行，直到您显式地停止跟踪或磁盘空间不足以运行此进程为止。

```
DECLARE @traceid INT
SELECT @traceid = traceid FROM ::fn_trace_getinfo(default) 
WHERE property = 5 AND value = 1 AND traceid <> 1 

IF @traceid IS NOT NULL BEGIN
   EXEC sp_trace_setstatus @traceid, 0
   EXEC sp_trace_setstatus @traceid, 2
END
```

您可以将服务器端跟踪结果保存到数据库表，然后借助 fn\$1trace\$1gettable 函数，将数据库表用作 Tuning Advisor 的工作负载。以下命令会将 D:\$1rdsdbdata\$1Log 目录（包括 RDSTrace\$11.trc 等所有滚动更新文件）中名为 RDSTrace.trc 的所有文件的结果加载到当前数据库中名为 RDSTrace 的表中。

```
SELECT * INTO RDSTrace
FROM fn_trace_gettable('D:\rdsdbdata\Log\RDSTrace.trc', default);
```

要将特定滚动更新文件保存到表中，例如 RDSTrace\$11.trc 文件，请为 fn\$1trace\$1gettable 指定滚动更新文件的名称和替换值 1，以代替默认值这一最后的参数。

```
SELECT * INTO RDSTrace_1
FROM fn_trace_gettable('D:\rdsdbdata\Log\RDSTrace_1.trc', 1);
```

# 使用跟踪运行 Tuning Advisor
<a name="Appendix.SQLServer.CommonDBATasks.TuningAdvisor.Running"></a>

创建跟踪后，无论是作为本地文件还是数据库表，都可以针对数据库实例运行 Tuning Advisor。借助 Amazon RDS 使用 Tuning Advisor 的进程与使用远程独立 SQL Server 实例的进程相同。您可以在客户端计算机上使用 Tuning Advisor UI，或者使用命令行 Dta.exe 实用程序。在这两种情况下，您都必须使用数据库实例的终端节点连接 Amazon RDS 数据库实例，并在使用 Tuning Advisor 时提供主用户名和主用户密码。

以下代码示例演示了针对 Amazon RDS 数据库实例（使用终端节点 **dta.cnazcmklsdei.us-east-1.rds.amazonaws.com**）使用 dta.exe 命令行实用程序的方法。此示例包含主用户名 **admin** 和主用户密码 **test**，要优化的示例数据库名为 **C:\$1RDSTrace.trc**。此外，示例命令行代码会指定名为 **RDSTrace1** 的跟踪会话，并指定输出文件到本地计算机，其中名为 **RDSTrace.sql** 的本地计算机适用于 SQL 输出脚本，名为 **RDSTrace.txt** 的本地计算机适用于结果文件，名为 **RDSTrace.xml** 的本地计算机适用于分析的 XML 文件。此外，还有一个在名为 **RDSTraceErrors** 的 RDSDTA 数据库上指定的错误表。

```
dta -S dta.cnazcmklsdei.us-east-1.rds.amazonaws.com -U admin -P test -D RDSDTA -if C:\RDSTrace.trc -s RDSTrace1 -of C:\ RDSTrace.sql -or C:\ RDSTrace.txt -ox C:\ RDSTrace.xml -e RDSDTA.dbo.RDSTraceErrors 
```

下面是相同的示例命令行代码，只有一点不同：即输入工作负载是 **RDSTrace** 数据库上名为 **RDSDTA** 的远程 Amazon RDS 实例上的一个表。

```
dta -S dta.cnazcmklsdei.us-east-1.rds.amazonaws.com -U admin -P test -D RDSDTA -it RDSDTA.dbo.RDSTrace -s RDSTrace1 -of C:\ RDSTrace.sql -or C:\ RDSTrace.txt -ox C:\ RDSTrace.xml -e RDSDTA.dbo.RDSTraceErrors
```

有关 dta 实用工具命令行参数的完整列表，请参阅 Microsoft 文档中的 [dta 实用工具](https://docs.microsoft.com/en-us/sql/tools/dta/dta-utility)。