Quantcast
Channel: CodeSection,代码区,SQL Server(mssql)数据库 技术分享 - CodeSec
Viewing all articles
Browse latest Browse all 3160

SQLSERVER――索引的重要性 sql SQLServer 数据库索引

$
0
0

SQLSERVER——索引的重要性。我想刚刚开始学数据库的在校学生都知道索引对语句性能的重要性。但他们可能不知道,对语句的重要性就是对系统的重要性!

开篇小测验

下面这样一个小SQL 你该怎么样添加最优索引

两个表上现在只有聚集索引

bigproduct 表上已经有聚集索引 ProductID

bigtransactionhistory 表上已经有聚集索引 TransactionID

select p.productnumber,p.reorderpoint,th.Quantity

from bigproduct as p

join bigtransactionhistory as th on th.productid=p.productid and th.TransactionDate > p.SellStartDate

where p.name in ('LL Crankarm1000','ML Crankarm1000') and th.TransactionDate > '2010-01-01'

你是否一眼就能看出来呢?

答案将在文章中逐步揭晓~~~

简单粗暴的添加索引

看过我前面文章的看官们一定会发现我很喜欢用“简单粗暴”这个词,一是因为词汇量小文笔也差,真心用不出高大上的词儿! 再一个,你们不喜欢简单粗暴么~~干货最重要,不是么?

首先我们看一下没有优化前的执行计划


SQLSERVER――索引的重要性 sql SQLServer 数据库索引

clustered index scan 这其实就是表扫描,不是table scan 只是因为表上有聚集索引

可以看出这个查询俩表都使用了表扫描!

where 条件添加索引

首先大多数人都知道 where 条件中的字段需要添加索引! 我们添加一下看看效果创建

在 bigproduct 表上创建 name 列索引 ,在bigtransactionhistory表上创建 TransactionDate 列索引。

再次执行语句看一下效果!


SQLSERVER――索引的重要性 sql SQLServer 数据库索引

添加where索引以后可以看到以下几个现象

bigproduct 从原来的clustered index scan 变成 index seek

另外多出来个KEY Lookup(clustered)

bigproduct 上添加的索引起了作用,逻辑读bigproduct 由 601 变成 10。

bigtransactionhistory 没啥变化啊 还是clustered index scan

解释一下出现的现象 : 首先一点bigproduct 边添加的where 条件索引,起到了作用,执行的时候不是全表扫描了,逻辑读有明显的下降,出现的 KEY Lookup 是因为选择(select)的列,在索引中没有,而需要通过聚集索引再查找一次,再找一次也意味着多一部分开销!

那么同样添加了where 条件索引的bigtransactionhistory 表为什么没起作用呢? 那是因为SQL优化器在选择计划的时候认为,不使用TransactionDate 列索引查找效率会更好!

Viewing all articles
Browse latest Browse all 3160

Trending Articles