事件未被优化的原因

本主题列出事件未被优化的一般原因以及数据库引擎优化顾问如何选择针对其执行优化事件的正确数据库。

事件未被优化的一般原因

假设已正确地标识最初针对其执行事件的数据库(参考以下部分),则事件未被优化的原因有:

  • 它们引用的表未被选中进行优化。

  • 它们引用的表过小,少于 10 页。

注意注意

若要查看 Microsoft SQL Server 2000 表的页数,请使用 sysindexes 系统表的 dpages 列。若要查看 Microsoft SQL Server 2005 及更高版本中表的页数,请使用 sys.dm_db_partition_stats 目录视图的 used_page_count 列。

  • 数据库引擎优化顾问在用户指定的时间内没有完成对查询的优化。

  • 它们引用的表具有的索引已接近最大索引数,并且已选中保持现有索引数选项。这种情况下,无法对这些表再创建更多索引。

  • 许多数据操作语言 (DML) 语句(INSERT、UPDATE 和 DELETE)是针对事件的基础表执行的。添加更多的索引或索引视图会导致这些基础表的性能下降。

  • 已指定下列优化选项:

    • 最大列数受到限制。

    • 指定用于存储的磁盘空间太小,或者数据库中已存在许多索引和索引视图,指定的空间不足以进行优化。

      注意注意

      您可以使用数据库引擎优化顾问图形用户界面 (GUI) 中的“高级优化选项”对话框,或者通过在使用 dta 命令行实用工具时指定 -B 参数的值,来根据优化建议指定磁盘空间限制。

数据库引擎优化顾问如何确定正确的数据库来优化事件

根据所使用的优化工作负荷文件的类型以及在优化工作负荷时指定的选项,数据库引擎优化顾问可选择正确的数据库以针对该数据库执行优化事件,如下所示:

对于 SQL 脚本 (.sql) 优化工作负荷文件

  • 如果使用下列参数之一指定数据库名称:

    • dta 命令行实用工具的 -d 参数

    • XML 输入文件中的 DatabaseToConnect 元素

    这些选项将把默认数据库设置为开始优化会话时数据库引擎优化顾问首先连接到的数据库。在进行初始数据库连接之后,数据库引擎优化顾问将使用脚本中的每个 USE database_name 语句来为后续语句更改数据库上下文。

  • 如果没有显式指定初始数据库连接来进行优化会话,数据库引擎优化顾问将使用为您在优化发生的服务器上指定的登录名定义的默认数据库。在进行初始数据库连接之后,数据库引擎优化顾问将为后续语句更改数据库上下文,就像在显式指定了初始连接的情况下那样。数据库引擎优化顾问将使用 USE database_name 语句来确定数据库上下文。

对于跟踪 (.trc) 优化工作负荷文件

当使用跟踪文件时,数据库引擎优化顾问将为在跟踪中指定的每个服务器进程 ID (SPID) 选择数据库以针对该数据库执行事件。如果没有在跟踪中指定 SPID,则数据库引擎优化顾问将假定该跟踪中包含的所有事件均使用同一个 SPID。数据库引擎优化顾问将为每个 SPID 选择数据库,如下所示:

  1. DatabaseName 存在于跟踪中。

    如果跟踪文件中存在 DatabaseName 字段,数据库引擎优化顾问将使用该字段来确定数据库以针对该数据库分析事件。忽略所有其他信息。如果不存在 DatabaseName 字段,数据库引擎优化顾问将转到步骤 2。

  2. DatabaseID 存在于跟踪中,但 DatabaseName 不存在。

如果跟踪文件中存在 DatabaseID 字段,数据库引擎优化顾问将使用该字段来确定数据库以针对该数据库分析事件。DatabaseID 字段将被映射到数据库名称。但数据库引擎优化顾问不会验证自收集跟踪以来是否更改了 DatabaseID 字段。如果不能确定当前是否存在 DatabaseIDDatabaseName 的映射,请从跟踪工作负荷文件中删除 DatabaseID 字段。忽略所有其他信息。如果 DatabaseName 字段和 DatabaseID 字段均不存在,数据库引擎优化顾问将转到步骤 3。

  1. DatabaseNameDatabaseID都未存在于跟踪中。

    如果跟踪中既不存在 DatabaseName 也不存在 DatabaseID,数据库引擎优化顾问将像对 SQL 脚本优化工作负荷文件那样,确定数据库以针对该数据库执行事件。此过程在上一节“对于 SQL 脚本 (.sql) 优化工作负荷文件”中进行了介绍。

请参阅

概念