索引分析

本文探讨了索引在提高数据查询效率中的重要性,强调了正确分析和维护索引的必要性。通过SQL Server的SHOWPLAN_ALL和STATISTICS IO命令,可以分析索引性能,了解查询计划和资源使用情况,以确保索引的有效性并优化数据库性能。

     索引是提高数据查询的有效的方法,但是也是最难全面掌握的技术,恰当的索引可以千倍提高效率,无效的索引浪费数据库空间,甚至降低查询的性能。在建立索引后要根据实际查询需求,对索引进行分析,判断其是否能够有效提高数据的查询性能。索引在创建之后,由于数据的增加、删除、更新等操作使得索引数据变得支离破碎,因此为了提高系统的性能,必须对索引进行维护。

       1、分析索引

         SQL Server 提供分析索引和查询性能的方法,这介绍最常用的SHOWPLAN_ALL和STATISTICS IO两种命令。

(1)SHOWPLAN_ALL命令,示全部查询计划,即在查询过程中连接表所采用的每个步骤,以及选择哪个索引,从而达到帮助用户分析有哪些索引被系统采用目的。

       SHOWPLAN_ALL的基本语法如下

             SET SHOWPLAN_ALL {ON|OFF}

      SET SHOWPLAN_ALL的设置是在执行或运行时设置,而不是在分析时设置。当 SET SHOWPLAN_ALL 为 ON 时,SQL Server 返回每个语句的执行信息但不执行语句,而且 Transact-SQL 语句将不执行。将该选项设置为 ON 后,将返回有关所有后续 Transact-SQL 语句的信息,直到将该选项设置为 OFF 为止。例如,如果在 SET SHOWPLAN_ALL 为 ON 时执行 CREATE TABLE 语句,则 SQL Server 从涉及同一个表的后续 SELECT 语句返回错误信息;指定的表不存在。因此,对该表的后续引用将失败。当 SET SHOWPLAN_ALL 为 OFF 时,SQL Server 执行语句但不生成报表。

【例】

USE pubs
GO
SET SHOWPLAN_ALL ON
GO
-- First query.
SELECT au_id 
FROM authors 
WHERE au_id = '409-56-7008'
GO
-- Second query.
SELECT city
FROM authors
WHERE city LIKE 'San%'
GO
SET SHOWPLAN_ALL OFF
GO

列名

 描述
StmtText对于不是 PLAN_ROW 类型的行,该列包含 Transact-SQL 语句的文本。对于 PLAN_ROW 类型的行,该列包含对操作的描述。该列包含物理运算符,也可以选择包含逻辑运算符。该列还可以跟有由物理运算符决定的描述。有关更多信息,请参见逻辑运算符和物理运算符。
StmtId当前批处理中的语句数。
NodeId当前查询内的节点 ID。
Parent上一级步骤的节点 ID。
PhysicalOp节点的物理实现算法。仅限于 PLAN_ROWS 类型的行。
LogicalOp该节点表示的关系代数运算符。仅限于 PLAN_ROWS 类型的行。
Argument提供有关所执行操作的辅助信息。该列的内容取决于物理运算符。
DefinedValues包含该运算符所引入值的用逗号分隔的列表。这些值可以是出现在当前查询(例如,在 SELECT 列表或 WHERE 子句中)内的计算表达式,或者是由查询处理器为处理该查询而引入的内部值。以后在该查询内的任何其它地方都可以引用这些定义的值。仅限于 PLAN_ROWS 类型的行。
EstimateRows由该运算符输出的预计行数。仅限于 PLAN_ROWS 类型的行。
EstimateIO该运算符的预计 I/O 成本。仅限于 PLAN_ROWS 类型的行。
EstimateCPU该运算符的预计 CPU 成本。仅限于 PLAN_ROWS 类型的行。
AvgRowSize正通过该运算符传递的行的预计平均行大小(以字节为单位)。
TotalSubtreeCost该操作和所有下一级操作的预计(累积)成本。
OutputList包含当前操作所计划的列的用逗号分隔的列表。
Warnings包含与当前操作相关的警告信息的用逗号分隔的列表。警告信息可以在列的列表中包含字符串"NO STATS:()"。该警告信息表示查询优化器曾尝试根据该列的统计做决策,但没有可用的统计。因此,查询优化器不得不进行推测,这可能已导致选择低效的查询计划。有关创建或更新列统计(这些统计有助于查询优化器选择更高效的查询计划)的更多信息,请参见 UPDATE STATISTICS。该列可以选择包含字符串"MISSING JOIN PREDICATE",这表示正在进行的联接(与表有关)未使用联接谓词。意外地除去联接谓词可能导致查询的时间比预期长得多,并返回巨大的结果集。如果出现该警告,请验证是否有意除去了联接谓词。
Type节点类型。对于每个查询的父节点,这是 Transact-SQL 语句类型(如 SELECT、INSERT、EXECUTE 等)。对于表示执行计划的子节点,这是 PLAN_ROW 类型。
Parallel0 = 运算符没有以并行方式运行。
1 = 运算符正在以并行方式运行。
EstimateExecutions该运算符预计在当前查询运行期间将执行的次数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值