您的位置:首页 > 其它

索引与查询性能优化

2009-03-30 23:38 253 查看

索引与查询性能优化

引言

索引是有效使用数据库系统的基础,当数据表中的数据量很少时,通过扫描数据表所占用的所有分页来存取数据的性能或许还可以接受,但当表中的数据量极大时,就一定需要有索引的辅助才能有效地存取数据。一般来说索引建立的适当与否,是性能好坏的成功关键!

在没有建立索引时,SQL Server不知道表中到底有多少笔数据符合你所指定的查询条件,这个时候SQL Server只有一页接一页地扫描整个数据表,直到把所有的页都扫描完毕后才能把符合查询要求的数据找出来。倘若有可采用的索引,SQL Server就会只在索引级别浏览每个索引分页,然后抓出你所需要的少量数据分页即可。存取数据表内数以万计的数据分页与只存取少数索引分页两者间的差异,让索引变成了性能调校的最佳工具。

NOTE:当数据表中没有合用的索引时,哪怕你只是要找表中的一条记录,SQL Server也会扫描整个数据表的所有分页!如果说扫描整个数据表的所有分页还不足于让你担心,那么配合锁一定会让你感到恐惧!我们知道查询数据的时候,SQL Server会对扫描的资源加共享锁S,而删除、更新、插入时是对资源加排它锁X,它们是互斥的,这意味着在查询时采用表扫描将占用很长的时间,此时的删除和更新只有被阻塞,最终导致删除和更新的超时!如果查询时SQL Server对整个数据表加共享S锁,那么插入也将被阻塞,最终导致所有的发布超时! 从另一方面来讲如果有进程在插入、删除、更新数据时,所有对该表扫描的查询都将被阻塞,最终导致查询缓慢或者查询超时!可以说表扫描是一切性能问题恶梦的开始!

了解SQL Server索引在物理上是如何排放数据的,以及这些索引是如何帮助你加快对数据表中数据的存取的是一个非常重要的议题。本文将讨论什么是聚集索引,什么是非聚集索引,它们在存储和查询时有什么差异;同时介绍和索引相关的填充因子、索引维护计划、统计、覆盖索引、索引视图以及索引提示等。

查看分页大小

索引按照数据排列方式的不同可分为聚集索引和非聚集索引两大种。为了更好地理解下面的内容,在具体介绍这些索引之前,让我们先来了解如何查看数据表本身、聚集索引、非聚集索引各自占用的分页数。

先介绍一下一个分页占多少存储空间。SQL Server 以一页(8KB连续的存储空间)作为最小的存储单元,因为一条记录不能跨页存储,所以SQL Server会规定一条记录的总长度不能超过8192个字节。(也就是8192/1024 = 8KB),因为NTEXT、Image、Binary大容量字段存储在其它的分页里,它们通过指针连接到某一条记录,所以NTEXT、Image、Binary字段在记录中仅占16个字节的指针大小,也就是说只占8192个字节中的16个字节,这也就是为什么SQL Server规定一条记录的长度不能超过一页(8KB),而记录中某一个NTEXT的字段却能存储很多数据的原因。了解了下面将要介绍的存储结构后,我们将会明白为什么不能在NTEXT类型的字段上建立索引。

了解了一个分页占用连续的8KB存储空间后,我们接下来了解如何查看数据表本身、聚集索引、非聚集索引各占用的分页数。

每一个数据库里都有一个sysindexes系统数据表,通过它就能看到数据表本身已占用的分页数,聚集索引已占用的分页数,以及非聚集索引已占用的分页数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: