索引:

在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. django控制admin的model显示列表

    class goods(models.Model):    name = models.CharField(max_length=300)    price = models.IntegerField ...

  2. C++成员变量、构造函数的初始化顺序

    一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...

  3. 用C#调用蓝牙编程

    2013-04-22 09:41:06 什么是蓝牙? 现在只能手机这么发达,蓝牙对我们来说肯定不陌生.我来介绍一下官方概念: 蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术.能在包括移动电 ...

  4. java 方法调用绑定--《java编程思想》学习笔记

    将一个方法调用同一个方法主体关联起来,就是绑定. 绑定分两种 :前期绑定 和 后期绑定 . 绑定------------- | -----前期绑定-------编译期绑定 { static , fin ...

  5. 使用Unity制作游戏关卡的教程(三)

    转自:http://gamerboom.com/archives/75593 作者:Matthias Zarzecki 本文是“使用Unity制作<The Fork Of Truth>的关 ...

  6. head first c&lt;11&gt;初探网络编程上

    server连接网络四部曲. 为了与外界沟通,c程序用数据流读写字节.比較经常使用的数据流有标准输入.标准输出.文件等. 假设想写一个与网络通信的程序.就须要一种新的数据流----------套接字. ...

  7. iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)

    1.画三角形  运行结果如下 1.1具体实现步骤 1.1.1首先新建一个project,然后自定义一个view 1.2代码 #import "htingShapeView.h" @ ...

  8. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  9. Java语言与C++语言的差异总结

    Java的设计者曾说过,设计这门语言的灵感主要来自于C++. 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史.所以在Java语言学习过程中,将其与C++语言对比是 ...

  10. You Need This One Skill to Succeed in IT--reference

    The ability to program in five languages, including one machine-level? Not it. Project management sk ...