SQLServer 聚集索引优化方案

一、主键与聚集索引并不是一对一匹配的

一般情况下我们都认为,聚集索引和主键是相互匹配的,因为只要你在sqlServer表中定义了一个主键,那么sqlServer会为这个主键自动添加聚集索引.但是,如果你先在表中基于任意一列建立聚集索引,然后再选择另一列作为主键,这时,这个sqlServer将会基于这个主键建立一个唯一非聚集索引.

二、聚集索引会被应用到每个查询

一个sqlServer表内,最多只能有一个聚集索引,并且表中数据行存储的位置由聚集索引来决定.表中非聚集索引与数据行的映射,是通过聚集索引来定位的.当聚集索引执行插入操作时,数据表中的行要进行移动,同时该表中所有非聚集索引要重新排列,这是非常消耗资源并且影响sqlServer响应速度的.

所以sqlServer表中的聚集索引一定要避免新添加数据时执行插入操作,保证表中新添加的数据是从索引的尾部追加的.这样做可以保证聚集索引相对静态,对非聚集索引的影响也会减小.

创建聚集索引时,要选择那些数据会不断增加的字段,最好的例子就是bbs发帖表中,帖子发布时间,这个字段中的数据是随时间增长的,理论上讲是不会重复的,最适合建立聚集索引.

如果你的聚集索引真的做到了不断增加,那么它的填充因子就应该是100%,这个数值越高,每个8KB大小的索引页记录的行数就越多,进行相同的扫描时IO、内存和cpu资源就用的越少,换句话说就是查询效率更高.

三、聚集索引的数据类型位宽将影响查询效率

聚集索引列的数据类型位宽越小,查询效率越高,并且由于非聚集索引是依靠聚集索引来影射sqlServer表中数据行的,聚集索引的位宽必将影响表中所有非聚集索引的大小.通常适合作为聚集索引的类型包括:

Smallint,int,bigint,datetimeUNIQUEIDENTIFIER.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...