SQL SERVER 性能优化三: 索引对数据库的影响

时间:2022-03-16 00:39:43

1、主键选取

2、聚集索引必须建立在主键上吗?

聚集索引是将索引列数据进行排序后放入B树;

聚集索引可以不建立在主键上,主键的作用是唯一标识符,只是一般将聚集索引设置在主键上。

3、聚集索引可以有重复值吗

可以,但是会耗费更多内存,推荐聚集索引所在列使用唯一键。

4、强制走索引

查询不走索引时,可在查询语句后添加WITH (INDEX(QueryAA_Index)) ,强制执行索引。

(1)下面给出查询语句实例和逻辑读取次数

--数据表为BasicMsg20170331,且在AA字段上有非聚集索引
SELECT * FROM BasicMsg20170331  WHERE  AA=7867695
--Table 'BasicMsg20170331'. Scan count 1, logical reads 4881, physical reads 0, read-ahead reads 4888, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SELECT * FROM BasicMsg20170331 WITH (INDEX(QueryAA_Index))  WHERE  AA=7867695 -- AND RecvTime<=89600000 

  --Table 'BasicMsg20170331'. Scan count 1, logical reads 1774, physical reads 10, read-ahead reads 20, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0

从上结果可以看出,当添加了强制执行索引时,逻辑读变少了很多,但是物理读取增加了10次。

PS:物理读是内容不在内存中,要去硬盘中读入内存,会 增加IO开销
逻辑读内容在内存中,不需要读硬盘 ,无IO开销