• 【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

  • 相关阅读:
    Python学习日记(一)——初识Python
    读《乌合之众》
    用WPF做了几个小游戏
    《HeadFirst设计模式》读后感——对学习设计模式的一些想法
    设计模式C#实现(九)——工厂方法模式和简单工厂
    设计模式C#实现(八)——原型模式
    设计模式C#实现(七)——生成器模式
    设计模式C#实现(六)——单例模式
    《小强升职记》读后感和思维导图
    《魔鬼搭讪学》《魔鬼约会学》读后感
  • 原文地址:https://www.cnblogs.com/SunnyZhu/p/5715497.html
Copyright © 2020-2023  润新知