SQL Server2005 表分区(第三章)

第三章

1、分区表与普通表(加索引)对比

2、分区表(加非聚集索引)与普通表(加索引)对比


--------------------------------华丽的分割线---------------------------------


1、分区表与普通表(加索引)对比

接第二章最后的补充例子,测试数据为10000条。表a依然是我们分了3个区的分区表,我们把普通表b的id字段设置成主键(同时设置了聚集索引),如图1所示:

SQL Server2005 表分区(第三章)


然后我们进行表a(分区表)和表b(添加索引表)的对比,代码如下:

set statistics io on
select * from a  where id=9999
select * from b  where id=9999
set statistics io off

/*
(1 行受影响)
表 ‘a‘。扫描计数 1,逻辑读取 44 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)
表 ‘b‘。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
*/

执行计划如图2所示:

SQL Server2005 表分区(第三章)图2

我们可以看到,有聚集索引的表b比分区表a查询开销要少。


--------------------------------华丽的分割线---------------------------------

2、分区表(加非聚集索引)与普通表(加索引)对比

(聚集索引:一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。

   非聚集索引:一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

首先我们应该知道的是分区表是不可以添加聚集索引的,因为聚集索引是要对表中数据确定物理顺序的,这与分区冲突。所以我们为分区表a设置主键(自动生成了非聚集索引)。

设置之后,如图3所示:

SQL Server2005 表分区(第三章)图3

执行代码如下:

set statistics io on
select * from a  where id=9999
select * from b  where id=9999
set statistics io off
/*

(1 行受影响)
表 ‘a‘。扫描计数 0,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)
表 ‘b‘。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

*/

执行计划如图4所示:

SQL Server2005 表分区(第三章)图4

我们看到,加了非聚集索引的分区表a新能提升了一些。



--------------------------------华丽的分割线---------------------------------


结论:表分区并不是最好的优化方案,要在适当的需求下、适当的环境中来使用表分区。

















SQL Server2005 表分区(第三章)

上一篇:linux crontabs 使用实例


下一篇:atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制