当前位置: 代码迷 >> Sql Server >> 关于目录的一些疑问
  详细解决方案

关于目录的一些疑问

热度:30   发布时间:2016-04-27 10:42:54.0
关于索引的一些疑问?
1.为什么索引有助于更快的获取信息,它的工作原理是什么?
2.为什么不推荐使用唯一索引,而是建议使用主键约束或唯一约束?
3.为什么聚集索引比非聚集索引有更快的访问速度?
4.create index 是显示的创建非聚集索引吗?
5.create nonclustred index 创建的是也非聚集索引吗?

希望大家回答的时候,尽可能的说的通俗点

------解决方案--------------------
工作原理参考:
http://blog.sina.com.cn/s/blog_3d2d79aa0100a0ut.html
------解决方案--------------------
1.工作原理为 就好比是目录一样,你查字典的时候是先在目录里查到要看的页数,然后在找到页数查到
所要资料.肯定不会一页一页去找吧,目录好比索引
2.
3.聚集索引为物理存储顺序,也就是说,字典是按a-b-c-...这样排序,如果你要找a开头的字段只要饭到a
大概这里的位子就可以找到所要字段咯
4.默认是非聚集索引
5.非聚集索引
------解决方案--------------------
2 为了获得最佳性能.主键索引主要是针对主键这一列。。而为一索引是对整条数据进行操作。。要慢很多。。
------解决方案--------------------
引用楼主 LoginOut 的帖子:
1.为什么索引有助于更快的获取信息,它的工作原理是什么?
2.为什么不推荐使用唯一索引,而是建议使用主键约束或唯一约束?
3.为什么聚集索引比非聚集索引有更快的访问速度?
4.create index 是显示的创建非聚集索引吗?
5.create nonclustred index 创建的是也非聚集索引吗?

希望大家回答的时候,尽可能的说的通俗点

------解决方案--------------------
探讨
工作原理可以这样理解吗?

SQL code
sno sname
103 陆君
105 匡明
107 王丽
108 曾华
109 王芳
101 李军



如果我查询sno=101,那么就是全表查询,查到第6行就查到了101
现在我为sno创建一个索引

SQL code
索引sno 指针地址
101 6
103 1
105 2
107 3
108 4
109 5



我还是查询101,那么第一行就是
可…

------解决方案--------------------
索引的功能有点像书的目录吧,不用1业页去查,插目录找内容即可
------解决方案--------------------
1.为什么索引有助于更快的获取信息,它的工作原理是什么? 
索引数据独立存储,按索引规则或算法存储数据
2.为什么不推荐使用唯一索引,而是建议使用主键约束或唯一约束? 
唯一索引可以存在NULL值
3.为什么聚集索引比非聚集索引有更快的访问速度? 
聚集索引:按物理地址存储数据
非聚集索引:链式存储
4.create index 是显示的创建非聚集索引吗? 
不一定
5.create nonclustred index 创建的是也非聚集索引吗? 
不太清楚?


------解决方案--------------------
聚集索引:物理存储按照索引排序

  非聚集索引:物理存储不按照索引排序

优势与缺点

聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快

聚集索引的区别

  聚集索引:物理存储按照索引排序

  非聚集索引:物理存储不按照索引排序

优势与缺点

聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快

索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。如下图:


聚集索引

一、索引块与数据块的区别

大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录在磁盘上占用1000 字节的话,我们对其中10字节的一个字段建立索引,那么该记录对应的索引块的大小只有10字节。我们知道,SQL Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块,然后根据索引块上的指针逐一找到结果数据块,这样IO访问量要少的多。

二、索引优化技术

是不是有索引就一定检索的快呢?答案是否。有些时候用索引还不如不用索引快。比如说我们要检索上述表中的所有记录,如果不用索引,需要访问8000条 ×1000 字节/8K字节=1000个页面,如果使用索引的话,首先检索索引,访问8000条×10字节/8K字节=10个页面得到索引检索结果,再根据索引检索结果去对应数据页面,由于是检索所有数据,所以需要再访问8000条×1000字节/8K字节=1000个页面将全部数据读取出来,一共访问了1010个页面,这显然不如不用索引快。

SQL Server内部有一套完整的数据检索优化技术,在上述情况下,SQL Server的查询计划(Search Plan)会自动使用表扫描的方式检索数据而不会使用任何索引。那么SQL Server是怎么知道什么时候用索引,什么时候不用索引的呢?SQL Server除了日常维护数据信息外,还维护着数据统计信息,下图是数据库属性页面的一个截图:
------解决方案--------------------

聚簇索引与非聚簇索引的本质区别到底是什么?什么时候用聚簇索引,什么时候用非聚簇索引?

这是一个很复杂的问题,很难用三言两语说清楚。我在这里从SQL Server索引优化查询的角度简单谈谈(如果对这方面感兴趣的话,可以读一读微软出版的《Microsoft SQL Server 2000数据库编程》第3单元的数据结构引论以及第6、13、14单元)。
从图中我们可以看到,SQL Server自动维护统计信息,这些统计信息包括数据密度信息以及数据分布信息,这些信息帮助SQL Server决定如何制定查询计划以及查询是是否使用索引以及使用什么样的索引(这里就不再解释它们到底如何帮助SQL Server建立查询计划的了)。我们还是来做个实验。建立一张表:tabTest(ID, unqValue,intValue),其中ID是整形自动编号主索引,unqValue是uniqueidentifier类型,在上面建立普通索引,intValue 是整形,不建立索引。之所以挂上一个没有索引的intValue字段,就是防止SQL Server使用索引覆盖查询优化技术,这样实验就起不到作用了。向表中录入10000条随机记录,代码如下:
  相关解决方案