您的位置:首页 > 数据库 > SQL

SQL Server调优系列进阶篇(如何维护数据库索引)

2015-01-16 00:00 435 查看

前言

上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看。
本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常维护以及一些注意事项等。
闲言少叙,进入本篇的主题。


技术准备

数据库版本为SQL Server2012,前几篇文章用的是SQL Server2008RT,内容区别不大,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks。
相信了解SQL Server的朋友,对这两个库都不会太陌生。

一、创建索引
当我们要开始对表进行索引的创建的时候,首先明确的是,一张表内只能创建一个聚集索引,最多可以创建最多249个非聚集索引(SQL Server2005),在SQL Server2008以后聚集索引数提升至999个,上一篇文章我们知道对于聚集索引项一般要创建上,而非聚集索引项要根据日常的T-SQL语句进行选择。
关于索引的选择是一个很考验调优能力的事情,大部分的情况下优质的索引新建全靠经验而论,有兴趣的可以点击查阅我前面的一系列关于分析查询计划的文章,掌握住里面的精髓才能有的放矢。
当然,小白级别的也可以参照如下方法尝试进行创建:
由于SQL Server有着自己的一套调优技巧,所以在我们每次运行的T-SQL语句应该怎样优化,SQL Server是了如指掌的,所以它会将缺失的索引项进行记录,用于提示使用者,尝试去建立这些索引。
主要记录在以下几个DMV中

[code= actionscript3; gutter: true">sys.dm_db_missing_index_details

sys.dm_db_missing_index_groups

sys.dm_db_missing_index_group_stats

sys.dm_db_missing_index_columns(index_handle)

sys.dm_db_missing_index_details

关于这些个DMV的使用,来举一个例子:

--新建表,建立主键,形成聚集索引
CREATE TABLE BigTable
(
[KEY] INT,
DATA INT,
PAD CHAR(200),
CONSTRAINT [PK1] PRIMARY KEY ([KEY])
)
GO
--批量插入测试数据250000行
SET NOCOUNT ON
DECLARE @i INT
BEGIN TRAN
SET @i=0
WHILE @i<250000
BEGIN
INSERT BigTable VALUES(@i,@i,NULL)
SET @i=@i+1
IF @i%1000=0
BEGIN
COMMIT TRAN
BEGIN TRAN
END
END
COMMIT TRAN
GO

利用这个测试脚本,我们新建了一张测试表,并且插入了一些测试数据,运行一个查询

SELECT [KEY],[DATA]
FROM BigTable
WHERE DATA<1000
GO




在这个简单的查询脚本中,SQL Server已经提示了我们需要创建的索引项。我们可以右键,直接生成创建脚本






SQL Server已经提示我们要创建的索引项内容了,穿件一个非聚集索引在列DATA上,并且INCLUDE列KEY,并且经创建完这个索引后的提升值都给计算出来了。
以上这种方式,在我们调优的时候是经常使用的,在我们拿到需要优化的语句后,直接执行就可以看到一部分需要调整的信息了。
但是,大部分的T-SQL语句不允许我们进行这样的优化流程,甚至有时候是已经存在的系统。所以,我们下手的方式只能绕道了,幸好SQL Server为我们记录下了这些缺失索引项的信息,就存在我上面提到的几个DMV中。我们来查看下:

SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 2




所以,大部分情况下,通过查看以上语句基本能确认到需要创建的索引项有哪些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: