索引:

在sqlserver中,存储的单位最小是页,页是不可再分的
B树:初衷是减少对磁盘的扫描次数,如果一个表或者索引没有使用B树(对于没有聚集索引的表是使用 Heap 堆进行存储的),那么查找一个数据,需要在整个表包含的数据库页中进行全盘扫描,这大大增加了IO负担
打包sqlserver使用B树进行存储,只仅仅需要将B树根节点存入内存,经过几次查找后找到存放所需的数据在子页包含的节点的页,这样避免了进行全盘扫描,从而提高了性能

如果表中没有任何索引,则以堆进行存放,

可以通过在其上加上 聚集索引(以B树存放)来展现对IO的减少

例如:

--开启IO数量
SET STATISTICS IO ON
SELECT * FROM student --给表建立聚集索引
--
CREATE INDEX test_index ON student(id)
SET STATISTICS IO ON
SELECT * FROM student WHERE id =

--开启Io
SET STATISTICS IO ON

--开启cpu时间
SET STATISTICS TIME ON

聚集:在sqlserver中:聚集的作用是将一列或是多列的物理顺序改变为和逻辑顺序相一致

聚集索引改变的是其所在表的物理存储顺序,所以每个表只能有一个聚集索引

在sqlserver中:聚集索引的存储是以B树存储,B树的叶子直接存储聚集索引的数据
非聚集索引:并不改变其所在表的物理结构,而是额外生成一个聚集索引的B树结构,但叶子节点是对于其所在表的引用,
这个引用分为两种:如果其所在表没有聚集索引,则引用行号,如果其所在表已经有了聚集索引,则引用聚集索引的页

非聚集索引需要额额外的空间进行存储,按照被索引列进行聚集索引,并在B树的叶子节点包含指向非聚集索引所在表的指针

与聚集索引不同的是:B树的叶子节点存的是指向堆或聚集索引的指针

非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针。

如果表的物理结构发生改变,比如加上或者删除聚集索引,则所有非聚集索引都需要重建,这个对于性能的损耗是相当大的,所以最好先建立聚集索引,再建立对应的非聚集索引

大多数情况下:聚集索引的速度比非聚集索引都稍微快点,因为聚集索引的B树叶子节点直接存储数据,而非聚集索引还需要额外通过叶子节点的指针找到数据

还有:对于大量连续数据查找,非聚集索引性能十分不好,因为非聚集索引需要在非聚集索引的B树中找到每一行的指针,再去其所在表找数据,性能大打折扣,还不如不加非聚集索引

因此大多数情况下,聚集索引的速度都快于非聚集索引,但聚集索引只有一个,则一定要选择好使用哪个或者哪些列作为聚集索引

索引的使用:
索引的使用不需要显式使用,建立索引后查询分析器会自动找出最短路径使用索引

但是随着数据量的增长,产生了索引碎片,很多存储的数据进行了不适当的夸页,会造成碎片(跨页,碎片,填充因子) 这时候需要重新建立索引以加快性能

可以通过DMV语句查询其索引情况

SELECT index_type_desc,alloc_unit_type_desc,avg_fragmentation_in_percent,fragment_count,avg_fragment_size_in_pages,page_count,record_count,avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID('Yip_20160322'),OBJECT_ID('student'),NULL,NULL,'Sampled')

当碎片量超过40%的时候(查看该列:avg_fragmentation_in_percent)往往需要重建索引,这样可以减少IO

可以这样重建索引:
ALTER INDEX idx_student_Id ON Student REBUILD

和更新表的统计信息

UPDATE STATISTICS Student

使用索引后的代价:

1 当表建立索引后,就以B树来存储数据,所以当对其进行更新插入删除时,就需要页在物理上的移动以调整B树,因此,会带来性能下降,
2 对于非聚集索引,当更新表后,非聚集索引也需要更新,相当于多更新了N(N=非聚集索引数量)个表,因此也下降了性能

3 通常可以将非聚集索引全部放在另外一个独立硬盘上,这样可以分散IO,这样可以使查询并行

sqlsever 关于索引的更多相关文章

  1. MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...

  2. ASP.NET + SqlSever 大数据解决方案 PK HADOOP

    半个月前看到博客园有人说.NET不行那篇文章,我只想说你们有时间去抱怨不如多写些实在的东西.  1.SQLSERVER优点和缺点? 优点:支持索引.事务.安全性以及容错性高 缺点:数据量达到100万以 ...

  3. 基于Python的数据分析:数据库索引效率探究

    索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长.有得有失.我希望做一些研究测试,搞清楚索引对于我们使用数 ...

  4. mssql sqlserver 索引专题

    摘要: 下文将详细讲述sql server 索引的相关知识,如下所示: 实验环境: sql server 2008 R2 sqlserver索引简介: mssql sqlsever 索引分类简介 ms ...

  5. SqlSever锁及存储过程优化

    SqlSever锁及存储过程优化 SQL server的所有活动都会产生锁.锁定的单元越小,就越能提高并发处理能力,但是管理锁的开销越大.如何找到平衡点,使并发性和性能都可接受是SQL Server的 ...

  6. SQLSever视图和存储过程

    一.视图(View) 1. 为什么要学习视图? 在没有视图之前,我们都是写各种各样的SQL语句,有点,非常灵活.后面我们学习应用程序开发的时候,通过C#发送过来的SQL语句 到达数据库的时候,会执行什 ...

  7. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  8. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  9. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

随机推荐

  1. Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题

    前一段时间,在瞎看看 Node.js,便研究通过 Node.js 实现知乎模拟登陆.相信,有很多网站有登陆权限设置,如若用户未登陆,将会跳转至首页提醒用户登陆,无法浏览部分页面. 如若是 b/s 架构 ...

  2. ALV的报表对用户定义格式的控制(ALV I_SAVE)

    很多ALV的报表都需要手动的进行设置格式以使数据看上去更有意义和条理,如果每次进来都重新操作一遍是很烦人的,所以SAP有提供了一个保存格式的功能,保存格式可以是 '缺省设置' 和 '特定用户' 两种 ...

  3. 记录一下跟Python有关的几个拓展名

    .py python文本源码文件,也可以用python.exe直接运行 .pyw 也是python的文本源码文件,但是默认由pythonw.exe打开,而且不显示命令行窗口,带GUI的python代码 ...

  4. POJ 3522 Slim Span 最小差值生成树

    Slim Span Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3522 Description Gi ...

  5. JUnit---Java单元测试必备工具

      在我们每天业务代码都写不完,为什么还要写测试代码呢,项目完成之后我再测不行吗? 看起来像是增加了代码量,但是它恰恰帮你减少了后期测试排错的时间,每个team,每个人都是有Bug指标的,首先,每次你 ...

  6. Blueprint编译过程

    Blueprint 编译概述 一.术语 Blueprint,像C++语言一下的,在游戏中使用前须要编译.当你在BP编辑器中,点击编译button时候.BP资源開始把属性和图例过程转换为一个类对象处理. ...

  7. enum 在c中的使用

    假设一个变量你须要几种可能存在的值,那么就能够被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也能够说是可能的值一一例举出来.  举个样例来说明一吧,为了让大家更明确一点,比方一个 ...

  8. fl,flash,mx包的区别

    在ActionScript项目中还真是不能使用mx包中的UI组件.           Adobe官方论坛上有一个帖子讲述了这个问题,大致意思是说:你要使用mx包中像Button这样的UI组件都是从U ...

  9. 使用 T4 文本模板生成设计时代码

      使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...

  10. linux下xargs命令用法详解

    原文:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...