第三章
1、分区表与普通表(加索引)对比
2、分区表(加非聚集索引)与普通表(加索引)对比
--------------------------------华丽的分割线---------------------------------
1、分区表与普通表(加索引)对比
接第二章最后的补充例子,测试数据为10000条。表a依然是我们分了3个区的分区表,我们把普通表b的id字段设置成主键(同时设置了聚集索引),如图1所示:
然后我们进行表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所示:
图2
我们可以看到,有聚集索引的表b比分区表a查询开销要少。
--------------------------------华丽的分割线---------------------------------
2、分区表(加非聚集索引)与普通表(加索引)对比
(聚集索引:一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
非聚集索引:一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。)
首先我们应该知道的是分区表是不可以添加聚集索引的,因为聚集索引是要对表中数据确定物理顺序的,这与分区冲突。所以我们为分区表a设置主键(自动生成了非聚集索引)。
设置之后,如图3所示:
图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所示:
图4
我们看到,加了非聚集索引的分区表a新能提升了一些。
--------------------------------华丽的分割线---------------------------------
结论:表分区并不是最好的优化方案,要在适当的需求下、适当的环境中来使用表分区。