【Sql server: T-Sql 技术内幕 系列】之索引篇

本文系 T-Sql技术内幕系列读后感。

用过数据库的程序猿都知道,索引可以极大的优化sql语句的执行时间,但是您要问我,怎么减少的,我只能说:"抱歉,我也不太清楚。"

带着这个疑惑,我重读了技术内幕,分享一点书上的所得。

我们先来建2个表,然后塞几条数据。

create table Customers
(
CustomerID int,
Cite varchar(20)
)

insert into Customers(CustomerID,Cite)
values (1,'Shanghai')
insert into Customers(CustomerID,Cite)
values (2,'Beijing')

create table Orders
(
CustomerID int,
OrderID int
)

insert into Orders(CustomerID,OrderID)
values(1,11)
insert into Orders(CustomerID,OrderID)
values(1,12)
insert into Orders(CustomerID,OrderID)
values(2,13)

这2个表数据很简单:

A表有客户1,所在cite="Shanghai",客户2,所在Cite="Beijing"。

B表有客户1的OrderID=11,12两条订单数据,有客户2的OrderID=13的订单数据。

我们根据上面的数据写如下Sql语句,再看下执行计划。

select c.CustomerID,COUNT(o.OrderID) as numOrders
from Customers as C
    left join Orders as O
        on C.CustomerID=O.CustomerID
where C.Cite='Shanghai'
Group by C.CustomerID
having COUNT(o.OrderID)>=2

数据流的顺序如下图。

1.表扫描花费18%的开销,然后Sort花费63%的开销。

那我们在来看下,整个sql语句消耗多长时间。0.017s

我们给客户表和订单表建上聚集索引。

create clustered index pk_Customer on Customers(CustomerID)
create clustered index pk_Customer_Order on Orders(CustomerID,OrderID)

然后再执行上面的Sql语句,得到下面的执行计划。

 

通过上述操作,我们发现,总时间只用0.006s了。

对于这条Sql,增加索引为我们减少了(0.017-0.006)/0.006=183%

原来增加索引,可以减少内部数据排序的时间,从来减少开销。

最后让我们看下这个结论是否正确,让我们再次回到第一个执行计划上,把鼠标放在Sort上,看他的开销。

消耗时间0.11s

 

posted @ 2016-07-28 17:08  Sunny Zhu  阅读(1039)  评论(0编辑  收藏  举报