阅读(1178) (21)

数据库优化工程师必看 第一部分(索引、视图)

2017-06-08 18:16:22 更新

数据库优化工程师必看 第一部分(索引、视图)

防伪码:勤劳一日,可得一夜安眠;勤劳一生,可得幸福长眠

       在本章技术详解之前,先分享一个今天晚上和一个做IT的学弟的沟通总结:

我们从八点多聊到十点 ,他主要做Linux高级运维,大部分时间还是做数据库的一些工作, 按理说还是我的小师弟 。哈哈。 他说, 刚毕业从一家外资高新技术企业跳糟到一家国企,工资涨了小2000,现在税后也是8500。 但是,他非常后悔。我说以前的公司该是多么强大,让你宁可每个月少挣好几千也想回到以前的公司, 他说老表,工资不是衡量一个人价值的唯一标准, 给你举例说明你就知道这个公司有多厉害了 ,这家公司叫青牛(北京)技术有限公司,主要做融合网络的 最重要的是大多数的员工,自主的要求无偿加班,回忆起我以前刚毕业在那家软件公司上班的情景,总之效率特别高,例如经理下达一个命令到技术部,要求中午下班之前完成,六七个部门的员工帮我一起完成,而我现在在xx国企,想做个备份,不知道秘钥号码,问经理、测试工程师、问遍了,哎, 等我知道了秘钥号,本来上午十点可以做完的事情。 结果,下午两点才刚刚开始 ,如果给我一次重新选择的机会,我一定选择拥有强大战斗力和文化底蕴的公司,我在青牛仿佛看到了未来的第二个阿里巴巴集团。我其实总结一下 就是:眼光决定格局 选择决定未来 用我恩师的话说:公司文化的力量很大程度上决定他能走多远飞多高!

   现在是凌晨0:54分,我们正式开始索引和视图的详解,希望就像博客昵称“一盏烛光“那样,去帮助更多的人解决实际问题,谢谢各位的支持。我将持续更新更多原创技术文档。

实验案例一:创建数据库并使用索引查询学生考试成绩(多种表格在T-SQL查询语句 第二部分 此处略)

select Student.StudentName,Subject.SubjectName,Result.ExamDate,Result.StudentResult

from Subject,Student,Result  with(INDEX=aaa)  注:INDEX=aaa,即索引=索引名

where Result.SubjectId=Subject.SubjectId and Result.StudentNo=Student.StudentNo and Result.StudentResult between 80 and 90

注:INDEX=aaa,即索引=索引名。虽然可以指定SQL Server按哪个索引进行数据查询,但一般不需要人工指定,SQL Server将会根据所创建的索引,自动优化查询。其实,使用索引可加快数据检索速度,但为每个列都建立检索没有必要。因为检索自身也需要维护,并占用一定资源。

案例二:验证索引的作用

 

1、 首先创建一个数据量大的表,名称为“学生表”,分别有三列,学号,姓名和班级,如下图所示,学号为自动编号,班级为默认值“一班”。

2、 向表中插入大量数据,数据越多,验证索引的效果越好。

使用语句完成:While 1>0  Insert into 学生表(姓名)  values(‘杨文)

上面语句是一个死循环,除非强制结束,如果1大于0就会一直向表中插入姓名

如下图所示:

3、等待5分钟左右,打开表的属性,查看表的行数1030550,当前为如下图所示:

我们可以右击,选择前1000行,效果如下:

4、使用语句查询第900000行的数据,Select * from 学生表 Where 学号=900000

5、打开“sql server profiler ”工具进行跟踪,如下图所示:

打开“sql server profiler ”工具查看跟踪的信息,发现查询时间很长,cpu工作了359毫秒,reads:读了8630次,writes:写了9次,duration:总计花费649毫秒完成查询。

6、为了下面分析文件更准确,多执行几次Select * from 学生表 Where 学号=900000

然后把跟踪的结果保存在桌面上:

注:这里选择第一项 ,跟踪文件。然后保存至桌面,效果如下:

7、 打开“数据库引擎优化顾问”,添加跟踪文件,进行分析,发现索引建议,需要建立索引。

注意:选择benet数据库中的学生表,然后点击“开始分析”

索引类型为clusterd(聚集索引),索引列为“学号”。

8、 按照“数据库引擎优化顾问”的索引建议建立聚集索引,并且选择“唯一”

9、 再次执行Select * from 学生表Where 学号=900000

10、 打开sql server profiler查看跟踪的时间,发现查询时间大幅提升,说明索引可以提高查询速度。

发现总计时间为1毫秒,几乎忽略不计,以至于几乎不花时间立即查询

案例四:分别练习创建各种索引

首先我们先来了解一下索引的分类以及选择索引列的注意事项:

我们掌握了学术性的理论后,将进行详细的试验操作来进一步巩固:


1、 创建聚集索引

目前tstudent表中没有任何索引也没有主键

为tstudent表创建聚集索引

选中studentID,单击左上侧的主键按钮

为Tstuden表的studentID创建主键就同时创建了聚集索引

2、创建组合索引

为成绩表创建组合索引,因为一个学生不能为一门学科录入两次成绩,所以将成绩表中的studentID和subjectID创建组合索引

3、用命令创建聚集索引

创建一个表TS

create TABLE TS(

StudentID varchar(10)NOT NULL,

Sname varchar(10)DEFAULT NULL,

sex char(2)DEFAULT NULL,

cardID varchar(20)DEFAULT NULL,     注意:实际工作中建议从简从快,保证质量,这些语法可拓展练习

Birthday datetime DEFAULT NULL,

Email varchar(40)DEFAULT NULL,

Class varchar(20)DEFAULT NULL,

enterTime datetime DEFAULTNULL

)

Go

用命令创建聚集索引

create clustered index CL_studentID

on TS(studentID)

创建聚集索引不一定创建主键,如下图所示:

4、创建唯一索引

创建唯一性约束的时候就会创建唯一性索引,不能有重复值

为Tstudent表创建唯一非聚集索引

create unique nonclustered index U_cardID on TStudent(cardID)

5、创建非聚集索引---可以有重复值

Tstudent表的姓名列创建非聚集索引

使用命令查看表上的索引

Select from sys.sysindexes where id=(select object_id from sys.all_objects where

name='Tstudent')

Indid中1代表聚集索引

Indid中2代表唯一非聚集索引

Indidz中3代表非聚集索引

二、视图

在这里,一些举例试验就不再一一演示了,因为,在我看来,作为一名数据库管理员,必须要掌握数据库优化这项技能。

最好掌握一些基本的通用语法,虽说视图是个变量,随时更新变化,用起来很方便简洁,可直接在其基础上直接

执行:

例如

select * from 视图名

where 条件=xxx

很方便,但是视图毕竟有局限性,在性能和修改限制方面有待提高。


本文出自 “一盏烛光” 博客,转载请与作者联系!