技术开发 频道

巧妙使用SQL SERVER索引 调优SQL语句

  查看消息输出的 IO 信息

  表'employee'。扫描计数1,逻辑读取2 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

  Q 这次逻辑读取是2次为什么呢 ?

  A.难道查询比表扫描还要慢,答案是对的,数据量小的时候,聚集索引的优势体现不出来。

  Q 为什么是2次逻辑读取

  A 现在查询的时候如聚集索引图,先查询索引页 ,查找到对应的键值后,扫描数据页,如果有包含索引,直接在索引页就可以提取到需要的数据。

  上面说了小数据量的时候聚集索引体现不出效果,下面我们继续填充数据测试 。

  填充测试数据到1000

  表扫描

  消息:

  表'employee'。扫描计数1,逻辑读取36 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

  聚集索引扫描

  消息:

  表'employee'。扫描计数1,逻辑读取2 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

  这个时候聚集索引的优势就先显示出来了 O(∩_∩)O

  下面在来讲讲transaction sql 语句 ,大家在网上看到的一些人说 In like left 不使用索引 ,我们动手来测试下看他们说的对不对 ?

  删除employee表的索引

DROP INDEX employee.Idx_emp_username

 

  打开IO信息

SET STATISTICS IO ON

SELECT * FROM employee WHERE employee.emp_username in ('刘10000')

3
 

  消息:

  表 'employee'。扫描计数 1,逻辑读取 371 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

--添加Idx_emp_username聚集索引

CREATE CLUSTERED INDEX Idx_emp_username
ON employee (emp_username);

SELECT * FROM employee WHERE employee.emp_username in ('刘10000');

3
 

0
相关文章