Sql Server专题一:索引(中)

写在前面的废话: 索引这个知识点,我前前后后不知道看了多少边,网上的文章五花八门,搞的我晕头转向,搞的牛逼点的就是测试索引带来的好处,还搞一大堆的测试数据出来,有意思吗?MS自己不会测试吗?这样的测试有意思吗?这些测试我想知道为了证明什么……明显欺负我们这些不懂索引的屌丝。思来想去,自己动手丰衣足食!索引这东西就是个很抽象的东东,网上有很多跟索引一样抽象的文章,让我这屌丝实难看下去,更别说看懂了,看来看去,截至我写这片博客时,我仅仅知道索引分为聚集和非聚集索引……哈哈!无奈啊!下面我就从我的几个疑问开始,为自己解惑!正在更新修改中…… 下文有错误哟!

1、为什么引入索引

2、索引为什么分类

3、索引的结构是怎样构建的

4、索引的维护代价和正确使用 

   第一问?  为什么引入索引

   一个大数据表,查找其中一条数据,怎么找?废话,当然一条条的找!会累啊!怎么办,像我这样聪明的人就开始想了,把数据给规范下,或者排个序啥的,查找就简单了,可是,怎样排序呢?将表中数据全部排序?每次有新数据进来都将新数据插入排好序的地方,这是笨方法!在想别办法,我可以再搞一个‘’这样的东西,记录插入新数据的物理地址,这样在原有表的基础上,我新’的数据量就小很多,这个小‘表’就是索引,里面的数据对查找数据是相当有用的,理论上需要两个字段,第一:真实数据的物理地址;第二:主键(哪个真是数据的物理地址);这是个小表,随我们怎么操作,但是对于建立索引之前的数据怎么处理?没办法,一条条的找,找到再将关键性的两个字段插入索引就OK了!所以在对已有大数据的表建索引的时候,很费劲的!总结:为了快点找到所需数据!

  第二问?  索引为什么分类

   针对上文所说的笨方法,其实就是聚集索引,将数据排序,MS是按照很上档次的平衡二叉树算法排序的,排序之后,数据就很规范的聚在一起了,就叫聚集索引,同样数据同样算法排序结果一样,索引聚集索引只有一个!这样看来,就接地气的多,什么算法,不就排个序吗?西方人,就喜欢搞名词,也无非是跟爱迪生一样一个个的试,哪个对大数据排序最快,就用那个算法!都说这是笨方法,MS默认的索引就不是聚集索引,谁闲着没事把大数据排序啊!人都是聪明的,当然采用聪明的方法!非聚集索引就是了,就是上文小表的做法,不动大数据,在搞个小表记录必要信息即可,在小表上找到主键对应的物理地址就oK了,拿着物理地址,直接就找到真实数据了!这样的小表可以有多个,真实数据的主键虽然是唯一的,但是有很多字段也是唯一的只不过没被选中作为主键,这样的字段也可以与物理地址一起构建一个新表,所以非聚集索引可以有多个,由于没有排序真实数据,真实数据也就没有按照一定规则紧挨着,所以就叫做非聚集!总结:为了快点找数据,一个聪明人和笨蛋的想出来的不同方法!另外,表有两种组织方式,B树(Balance Tree)或者堆(Heap)!也知道为什么了吧!B树表因为表数据被搞过了。

  第三问?  索引的结构是怎样构建的    这个是重头戏

    解决第二问,问题紧接着就来了,逻辑上聚集索引和非聚集索引很简单,但在真实的数据库怎么做到呢?聚集索引的结果是个B树结构的数据表,但是实现的过程是怎会样呢?非聚集索引又是怎样呢?真正的聚集索引和非聚集索引这个东西究竟是啥?先不去管MS或者其他数据库开发者,怎么解决,自己想一想?

    先说,聚集索引,既然给大数据排序,首先有排序算法,这个好说(http://www.cnblogs.com/lwzz/archive/2011/07/27/2119021.html)公认的B树算法,但是这么多的数据,怎么才能听我的话,按照算法排好队呢,我又不是他爸,凭啥听我的?还有就是,人家排队的前提是,有多余空间才能移动吧!

http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html

http://www.cnblogs.com/knowledgesea/p/3672099.html#top

附上B算法总结:

B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;

所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

时间: 2024-07-29 08:39:22

Sql Server专题一:索引(中)的相关文章

SQL SERVER全面优化-------索引有多重要?

想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到哪写到哪!  前面很多篇不管CPU.内存.磁盘.语句等等等都提到了索引的重要,我想刚刚开始学数据库的在校学生都知道索引对语句性能的重要性.但他们可能不知道,对语句的重要性就是对系统的重要性! 抛出一个问题 :你相信一条语句就能让你的大系统挂掉么? 带着问题,首先还是贴出我的座驾 最近不太喜欢红色换了

SQL Server 非聚集索引的覆盖,连接,交叉和过滤 <第二篇>

在SQL Server中,非聚集索引其实可以看做是一个含有聚集索引的表,但相对实际的表来说,非聚集索引中所存储的表的列数要少得多,一般就是索引列,聚集键(或RID).非聚集索引仅仅包含源表中的非聚集索引的列和指向实际物理表的指针. 一.非聚集索引之INCLUDE 非聚集索引其实可以看做一个含有聚集索引的列表,当这个非聚集索引中包含了查询所需要的所有信息的时候,则就不再需要去查基本表,仅仅做非聚集索引就能够得到所需要的数据.INCLUDE实际上也能称为覆盖索引,但它不影响索引键的大小. 先来看下面

SQL Server 列存储索引强化

SQL Server 列存储索引强化 SQL Server 列存储索引强化... 1 1. 概述... 1 2.背景... 2 2.1 索引存储... 2 2.2 缓存和I/O.. 2 2.3 Batch处理方式... 2 3 聚集索引... 3 3.1 提高索引创建... 4 3.2 采样的支持... 4 3.3 BookMark的支持... 4 3.4 其他加强... 4 4 更新处理... 4 4.1 随机插入... 6 4.2 批量插入... 6 4.3 删除和更新... 6 4.4 对

T-SQL查询高级--理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤

写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章的内容需要索引的知识作为基础. 简介 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索引的表.但相比实际的表而言.非聚集索引中所存储的表的列数要窄很多,因为非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针. 并且,对于非聚集索引表来说,其中所存放的列是按照聚集索引来进行存放的

SQL server 数据库之“索引”详解

什么是索引?数据库中的索引与书籍中的目录类似,索引使SQL Server编排数据的内部方法,它为SQL Server提供一种方法来编排查询数据的路由. 索引页是数据中存储索引的数据页.索引页存放检索数据行的关键字页及该数据行的地址指针.通过使用索引,可以大大提高数据库的检索速度.改善数据库性能. 索引的分类1.唯一索引 唯一索引不允许两行具有相同的索引值.创建了唯一约束,将自动创建唯一索引.尽管唯一索引有助于找到信息,但是为了获得最佳性能,建议使用主键约束.2.主键索引 在数据库关系图中为表定义

添加条码生成和打印功能到SQL Server Reporting Services report 中

Barcode Professional for Reporting Services 是一款灵活和强大的.NET组件(.NET DLL 类库),它让您轻松地添加条码生成和打印功能到您的SQL Server Reporting Services report 中.支持几乎所有当前常用的条码:Code 39, Code 128, GS1-128, GS1 DataBar (RSS-14), EAN 13 & UPC, Postal (USPS, British Royal Mail, Austra

Sql Server 2005 去掉字段中的空格

SELECT replace(ltrim(rtrim(Realname)),' ','') AS Realname FROM UserInfo WHERE replace(ltrim(rtrim(Realname)),' ','') ='张飞' Sql Server 2005 去掉字段中的空格,布布扣,bubuko.com

SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用

原文:SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用 近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回报,分享一下关于SET STATISTICS IO和SET STATISTICS TIME这两条T_SQL命令,在查询优化性能中的作用. 首先我想说明一下这篇文章不是关于如何

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何在SQL Server存储过程中获取另一存储过程的执行结果记录集?如何在存储过程中检索动态SQL语句的执行结果?如何实现类似SELECT * FROM (EXEC procedure_name @parameters_var) AS datasource ... 的功能?procedure_