zoukankan      html  css  js  c++  java
  • 索引的使用说明

    索引的使用说明

    题外话:
         昨天比较郁闷,维护一客户的数据库系统时候,发现系统处理数据就出现假死。
    开始因为是软件问题,拷得乱忙一下午还没有拷定,后来一直弄到晚上7点,突然想起索引问题。
    后来就使用了一命令:
    dbcc dbreindex('TableName','',80)

    即可实现。比较郁闷和晕,自己犯这样的错误。
         这错误,正好是我想写这帖的原因,希望能为大家解决一些实际问题吧。

    正题:
    为什么要建立合适的索引,重要的目的就是提高查询效率。
    这里简单说一下索引的两种类型:
    帮助的说明
    聚集
    聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。数据行本身构成聚集索引的最低级别。
    只有当表包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,则其数据行按堆集方式存储。
    非聚集
    非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。
    在非聚集索引内,从索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。

    来的例子说明最能体现建立索引的好处。

     
    --测试表DTest (无索引)
    SELECT IDENTITY(int,1,1AS [id],B.[id] AS TKey,B.[Name] AS [TName] INTO DTest 
    FROM Master..syscolumns AS A ,Master..sysobjects AS B
    --测试表TTest (建立索引)
    SELECT IDENTITY(int,1,1AS [id],B.[id] AS TKey,B.[Name] AS [TName] INTO TTest 
    FROM Master..syscolumns AS A ,Master..sysobjects AS B

    在我的测试中,DTest,TTest表有500多万条记录,可以满足测试要求。

    操作如图:
    1、设置表TTest的字段ID为主键。
     

    2、对表TTest中的列TName建立一个非聚集索引
     

    3、测试查询语句的效率。
    在查询分析器中输入:
    SELECT * FROM  DTest WHERE TName='sp_ActiveDirectory_Obj'

    按键盘Ctrl+L,显示预计的执行计划,可以查看执行效率。
     

    预计的成本是31.8.

    再在查询分析器中输入:
    SELECT * FROM  TTest WHERE TName='sp_ActiveDirectory_Obj'

    按键盘Ctrl+L,显示预计的执行计划,可以查看执行效率。
     
    预计的成本是28.5 .
    从这图可以看出,使用索引后,查询效率差不多提高了10的百分点。

    下面我们再看实际查询的结果用时:
    没有索引时候,用时:26秒。

     



    对列Tname加索引,用时:0秒。

    呵呵,明显看出效率的提高。

    这里写几点注意:
    1、将更新尽可能多的行的查询写入单个语句内,而不要使用多个查询更新相同的行。仅使用一个语句,就可以利用优化的索引维护。
    2、对聚集索引使用整型键。另外,在唯一列、非空列或 IDENTITY 列上创建聚集索引可以获得性能收益
    3、在查询经常用到的所有列上创建非聚集索引。这可以最大程度地利用隐蔽查询
    4、重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片。如我开始提到的使用

     
    dbcc dbreindex('TableName','',80)

    来重构索引。

    在实际的应用中,会发现很多问题,得具体问题具体分析,这里只是简单一个例子说明使用索引的好处。

    (完)


  • 相关阅读:
    Kotlin协程第一个示例剖析及Kotlin线程使用技巧
    大数据JavaWeb之java基础巩固----Junit&反射&注解
    Kotlin协程重要概念详解【纯理论】
    Kotlin反射在属性上的应用实战
    Kotlin反射操纵构造方法与伴生对象
    个人任务day4
    典型用户和用户场景
    个人任务Day3
    个人任务2
    个人任务1
  • 原文地址:https://www.cnblogs.com/wghao/p/806088.html
Copyright © 2011-2022 走看看