聚集索引与非聚集索引


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
1,Current Disk Queue Length:长度要小于等于 2*物理磁盘数,不然,说明有任务在等待,磁盘处于繁忙之中。

2,实施方案:
     1)内存:64位。
     2)磁盘:放在磁盘柜中
     3)日志文件放在另一磁盘上,日志文件与数据文件分开在不同的物理磁盘上。
     4)radio,radi5
     5) 对于大表,可进行分区,并放到多个磁盘上。 
3,索引,对数据进行了排序,为存储这种排序结构,选择用B-树来实现,在B-树的分支节点中存储着最小值,因为是有序的数据,这样在查找的时候就可用折半查找等方法来检索数据,比如通过非聚集索引查找数据,再通过指示的键值去表中检索数据,并不是一步就到聚集索引所在的行的,而是遍历B-树结构,找到指示的叶子节点,然后再取出相关数据。
4,Sql Server中所有的聚集索引都是唯一的,如果在建立时没有指定unique关键字, SqlServer会在需要时通过向记录插入一个唯一标识符在内部保证索引的唯一性,该某一标识符是一个4字节长的值,需要的时机指的是出现重复值时。
5,非聚集索引中的叶级别中有索引字段的值,同时还包含了一个引向表数据的书签,书签格式按表中有无聚集索引分为两种:1,Key值。聚集索引的字段值。  2,RID:文件号:页号:槽号。
从中可以看出,1)若表中有聚集索引,那么当聚集索引的值发生更改时,会影响到非聚集索引的值改变,非聚集索引依赖于聚集索引,故聚集索引的选择很重要,最好能够建立在很少更新的字段上。
                       2)通过非聚集索引查找数据,若数据还需要通过书签去查找,那么会有一部分开销,这就天生决定了非聚集索引的适用场合,即:非聚集索引适用在大表取少量数据时最有用,因为书签查找并不会造成很大的开销,并且,它特别适用于 select要求的字段,非聚集索引都包含的情况,即索引覆盖,这种情况下,性能有时会比聚集索引还要高效,因为非聚集索引引用的字段少的,占用的物理页数比表的页数少很多,故相应的检索就很快。但是在大范围取数据时,它的书签查找就会成为制约,此时,不如直接来个聚集扫描会更快一些,故 sqlserver的执行计划中会看到,本来有索引的地方不用,而使用了聚集索引扫描方式。
6,索引使用过程中的几种类型:
     1)覆盖索引: select 中的字段,非聚集索引中都包含。 
     2)索引交叉:应用了多个索引进行如where条件的过滤,然后进行合并。
     3)索引连接:一个用于过滤,从另一索引中取要求的字段,利用了索引空间小的特点,避免了书签查找表。
7,查看索引:sp_helpindex frmuser

8,索引使用状况统计:

Select  t.object_id, ix.name,user_updates, user_seeks,user_scans,t.name,ix.name,sc.name
    from sys.dm_db_index_usage_stats ius
    JOIN sys.tables t ON ius.object_id = t.object_id
    JOIN sys.indexes ix ON t.object_id = ix.object_id AND ix.index_id = ius.index_id
    JOIN sys.index_columns ixc ON t.object_id = ixc.object_id AND ix.index_id = ixc.index_id
    JOIN sys.columns sc ON t.object_id = sc.object_id AND ixc.column_id = sc.column_id
where t.name = 'bdorder'    --user_updates > 10 * (user_seeks+user_scans) 就是应drop的