SQL Server查询性能优化――覆盖索引(二)(一)

2014-11-24 15:51:25 · 作者: · 浏览: 2

  在 SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论。
  本文将具体讲一下使用不同索引对查询性能的影响。
  下面通过实例,来查看不同的索引结构,如聚集索引、非聚集索引、组合索引等来查看相同的SQL语句查询的不同性能
例一:没有任何索引的查询访问
  1.表的碎片情况:
\

  2.SQL查询语句与查询执行计划成本
--要求返回IO统计,也就是数据页访问的数量
SET STATISTICS IO ON
--没有任何索引情况下的数据页访问数量
SELECT [WBOOK_NO]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[QTY_1]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT]

FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1 between 50 and 500
--表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数1,逻辑读取1568 次,物理读取54 次,预读1568 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读 0 次。
SET STATISTICS IO OFF
\
例二:通过聚集索引查询访问
  1.聚集索引的碎片情况:
\

  2.SQL查询语句与查询执行计划成本  
--要求返回IO统计,也就是数据分页访问的数量
SET STATISTICS IO ON
---通过聚集索引查询访问的数据页数量
create clustered index idx_WBK_PDE_LIST_ORG_HISTROY on [WBK_PDE_LIST_ORG_HISTROY](QTY_1)
SELECT [WBOOK_NO]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[QTY_1]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT]
FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1 between 50 and 500
--表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数1,逻辑读取351 次,物理读取4 次,预读345 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
SET STATISTICS IO OFF
---
drop index [WBK_PDE_LIST_ORG_HISTROY].idx_WBK_PDE_LIST_ORG_HISTROY
---
\
例三:强制通过非聚集索引查询访问
  1.非聚集索引的碎片情况:
\

  2.SQL查询语句与查询执行计划成本
--要求返回IO统计,也就是数据页访问的数目
SET STATISTICS IO ON
--强制通过非聚集索引查询访问的数据页数量,用错索引比不用索引更糟糕
create index idx_WBK_PDE_LIST_ORG_HISTROY on [WBK_PDE_LIST_ORG_HISTROY](WBOOK_NO)
SELECT [WBOOK_NO]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[QTY_1]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT]

FROM [WBK_PDE_LIST_ORG_HISTROY] with (index(idx_WBK_PDE_LIST_ORG_HISTROY)) where qty_1 between 50 and 500
--表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数1,逻辑读取61065 次,物理读取864 次,预读727 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
SET STATISTICS IO OFF
---
drop index [WBK_PDE_LIST_ORG_HISTROY].idx_WBK_PDE_LIST_ORG_HISTROY
\
例四:通过字段顺序不适用的覆盖索引查询访问
  1.非聚集索引的碎片情况:
\

  2.SQL查询语句与查询执行计划成本
--要求返回IO统计,也就是数据页访问的数量
SET STATISTICS IO ON
--通过字段顺序不适用的覆盖索引查询访问的数据页数量
create index idx_WBK_PDE_LIST_ORG_HISTROY on [WBK_PDE_LIST_ORG_HISTROY]([WBOOK_NO]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[QTY_1]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT])
SELECT [WBOOK_NO]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[QTY_1]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT]

FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1 between 50 and 500
--表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数1,逻辑读取687 次,物理读取9 次,预读683 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
SET STATISTICS IO OFF
---
drop index [WBK_PDE_LIST_ORG_HISTROY].idx_WBK_PDE_LIST_ORG_HISTROY
\
例五:通过覆盖索引查询访问

  1.非聚集索引的碎片情况:
\

  2.SQL查询语句与查询执行计划成本
--要求返回IO统计,也就是数据页访问的数量
SET STATISTICS IO ON
--通过覆盖索引查询访问的数据页数量
create index idx_WBK_PDE_LIST_ORG_HISTROY on [WBK_PDE_LIST_ORG_HISTROY]([QTY_1]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[WBOOK_NO]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT])
SELECT [WBOOK_NO]
,[COP_G_NO]
,[G_NO]
,[CODE_T]
,[QTY_1]
,[UNIT_1]
,[TRADE_TOTAL]
,[GROSS_WT]

FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1 between 50 and 500
--表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数1,逻辑读取178 次,物理读取5 次,预读175 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
SET STATISTICS IO OFF
---
drop index [WBK_PDE_LIST_ORG_HISTROY].idx_WBK_