zoukankan      html  css  js  c++  java
  • ms sqlserver数据库建索引

    索引分类:从物理结构上可分为两种:聚集索引和非聚集索引 (此外还有空间索引、筛选索引、XML索引)

    因为聚集索引是索引顺序与物理存储顺序一致,所以只能建一个。

    • 聚集索引就是把数据按主键顺序存储;
    • 因为一张表中的数据只能有一个物理顺序,所以一张表只能有一个主键/聚集索引。

    非聚集索引可以建1或者N个。

    并不是所有字段上都可以建索引,有的字段类型如text、image、nvarchar(max)等是不可以建索引的。

    sql语句有多个条件用and连接时,多个字段都有索引的话,顺序很重要。

    索引是存在磁盘的文件,一个表上如果有100个列,但是不能建太多索引,因为进行插入,修改,删除时都需要对索引文件进行修改,会影响增删改的效率,所以要平衡索引的个数。

    索引的数据结构长什么样子呢?

    文章:SQL Server 索引(一)数据结构和存储结构

    讲了索引概念和结构。

    在SQL Server数据库中,索引的存储是以B+树(注意和二叉树的区别)结构来存储的,又称索引树,其节点类型为如下两种:

    • 索引节点;
    • 叶子节点

    索引节点按照层级关系,有时又可以分为根节点和中间节点,其本质是一样的,都只包含下一层节点的入口值和入口指针;

    叶子节点就不同了,它包含数据,这个数据可能是表中真实的数据行,也有可能是索引列值和行书签,前者对应于聚集索引,后者对应于非聚集索引。

    通过DBCC IND命令来查看索引的情况

    DBCC IND ([PCT], [DBO.Employee], -1)

    具体例子可以到上文的博客处查看。

    非聚集索引的include理解,这个索引的数据结构息息相关。

    • 索引覆盖和非聚集索引的根节点和中间节点一样,都是索引页,都只包含下一层的入口指针和入口值。
    • 索引覆盖的叶节点却稍有不同,多了一列DepartmentCode,此列即为索引覆盖列,而且此列只在叶节点出现,如果查询时,只需返回键值列和索引覆盖列,则只需索引查找,肯本无需访问数据页,不仅提高了性能,而且节省占用空间。

    本次优化记录:

    1,把多个and order_State<>2 and order_State<>-1and order_State<>-10and order_State<>-20等修改成,and order_State not in(-20,-10,-1,2)查询速度快了很多。

    2,在DateTime字段上建了索引,又提高了几秒。

    下面的表格阐述了什么时候应该用非簇聚索引,什么时候用簇聚索引:

    动作描述 使用聚集索引 使用非聚集索引
    列经常被分组排序
    返回某范围内的数据 不应
    一个或极少不同值 不应 不应
    小数目的不同值 不应
    大数目的不同值 不应
    频繁更新的列 不应
    外键列
    主键列
    频繁修改索引列 不应

    把流水表修改成一个单表,增加字段数,尝试优化。

    文章:SQL Server基础之索引  待阅读。

  • 相关阅读:
    Pandas学习整理与实践
    数据描述性统计整理
    关于购置硬盘的相关注意点
    福大软工 · 最终作业
    福大软工 · 第十二次作业
    Beta冲刺 (7/7)
    Beta冲刺 (6/7)
    深度剖析Vue中父给子、子给父、兄弟之间传值!
    mysql 增删改插
    前端必学TypeScript之第一弹,st基础类型!
  • 原文地址:https://www.cnblogs.com/Tpf386/p/8110407.html
Copyright © 2011-2022 走看看