热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mssqlserver数据库建索引

索引分类:从物理结构上可分为两种:聚集索引和非聚集索引(此外还有空间索引、筛选索引、XML索引)因为聚集索引是索引顺序与物理存储顺序一致,所以只能建一个。聚集索引就是把数据

 

索引分类:从物理结构上可分为两种:聚集索引和非聚集索引 (此外还有空间索引、筛选索引、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基础之索引  待阅读。

 


推荐阅读
author-avatar
手机用户2602918163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有