索引:

在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. VB.NET中使用Linq TO SQL添加数据后获得自增长列ID

    VB.NET中使用Linq TO SQL添加数据后获得自增长列ID: Dim tempOrdre As New Order With { .CustomerID = cmbCustomerName.S ...

  2. BaiduMap开发,获取公交站点信息。

    可能有些人会出现无法导入overlayutil的错误,这是因为BaiduMap里面的包把这部分删除掉了,并且官方没有给出说明,这个地方以前也是让我折腾了很久. 不知道现在有没有说明这个问题,如果需要这 ...

  3. Codeforces gym 100685 F. Flood bfs

    F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...

  4. delphi res 字符串资源

    delphi res 字符串资源 (2011/12/10 19:19:36) //res 字符串资源 //rc 文件:StringTablebegin0 "AAAA"1 " ...

  5. SlideLayout

    https://github.com/rey5137/SlideLayout

  6. android短信发送器源代码

    Activity类: import java.util.List;import android.app.Activity;import android.app.PendingIntent;import ...

  7. [AngularJS] Directive with Transcluded Elements

    Create a wrapWith directive using advanced transclusion techniques. transclude - compile the content ...

  8. iOS开发——UI篇&下拉弹出列表选择项效果

    下拉弹出列表选择项效果 右边菜单中的按键,点击弹出一个列表可选择,选择其中一个,响应相应的事件并把文字显示在右边的菜单上:弹出下拉效果使用LMDropdownView插件,可以用POD进行加载pod  ...

  9. Linux堆内存管理深入分析

    (上半部) 作者:走位@阿里聚安全 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较 ...

  10. dup和dup2函数

    下面两个函数都可用来复制一个现存的文件描述符: #include<unistd.h> int dup(int filedes); int dup2(int filedes,int file ...