分区索引

来源:互联网 发布:顶尖数据恢复软件破解 编辑:程序博客网 时间:2024/05/20 10:56

在分区表上可以创建局部或全局索引,并且有多种分区方案可选,例如范围分区、散列分区、列表分区以及混合分区方案。
create table sales_fact_part
partition by range(year)
(
 partition p_1997 values less than (1998),
 partition p_1997 values less than (1999),
 partition p_1997 values less than (2000),
 partition p_1997 values less than (2001),
 partition p_1997 values less than (maxvalue)
) as select * from sales_fact;
1、局部索引
局部分区索引使用local关键字来建立,其分区边界与表分区边界的相同。简单来说,与每个表分区相联结的有一个索引分区。因为维护操作可以在独立分区进行,表的可用性更好。对索引分区的维护操作仅需要锁定相应的表分区而不是整张表。
如果局部索引包含分区键列并且如果sql语句申明了分区键列上的谓语,执行计划就仅需要访问一个或很少的索引分区。这个额概念通常被成为分区消除。如果执行计划在最小的分区中进行搜索,性能就会得到提升。
通俗点说局部索引也是个分区索引,只不过局部索引的分区边界与表的分区边界相同。
create index sales_fact_part_n1 on sales_fact_part(product,year) local;
2、全局索引
全局索引通过GLOBAL来创建。在全局索引中,索引的分区边界与表的分区边界不一定要匹配,并且表和索引的分区键也可以不一样。
下面在Year列上创建了一个全局索引sales_fact_part_n1,尽管分区列是一样的,表和索引的分区边界是不同的。接下来的select语句声明了谓语year=1998来访问表,执行计划显示访问了索引分区1和表分区2。在表和索引级上都进行了分区剪裁。
对全局索引的任何维护都将需要获得对表的较高层级的锁,从而降低了应用的可用性。相反,对于局部索引的维护可以只在分区级上完成,只会影响相应的表分区。在这个例子中,重建索引sales_fact_part_n1将会导致需要排他模式的表级锁,导致应用停机。
create index sales_fact_n1 on sales_fact_part(year)
global partition by range(year)
(
 partition p_1998 values less than(1999),
 partition p_1998 values less than(2001),
 partition p_1998 values less than(maxvalue) 
);
select * from sales_fact_part where product='xtend Memory' and year=1998;


综上:查询带索引数据时,先去索引表查找索引,然后再去数据表查数据,如果查找索引耗费太多时间,那么整体性能也不会太好。所以,索引的使用要根据实际情况来看。

原创粉丝点击