ORACLE和SQL SERVER都可以建立与表分区不一样的索引分区。
ORACLE:要检索所有的数据,我们一般应该建立 全局索引分区(全局索引并不是一般人认为的只存在一个地方,实际上也是可以分区),但:
使用全局索引,索引键值必须和分区键值相同,这就是所谓的前缀索引。Oracle不支持非前缀的全局分区索引,如果需要建立非前缀分区索引,索引必须建成本地索引。
还有引用别人的说法:
假设有一个使用DATE列分区的大表。我们经常使用一个VARCHAR2列(VCOL)进行查询,但这个列并不是表的分区键值。
有两种可能的方法来访问VCOL列的数据,一是建立基于VCOL列的本地非前缀索引,
| |
------- -------
| | (10 more | |
Values: A.. Z.. partitions here) A.. Z..
另一种是建立基于VCOL列的全局索引,
| |
------- -------
| | (10 more | |
Values: A.. D.. partitions here) T.. Z..
可以看出,如果能够保证VCOL列值的唯一性,全局索引将会是最好的选择。如果VCOL列值不唯一,就需要在本地非前缀索引的并行查询和全局索引顺序查询以及高昂的维护代价之间做出选择。
(摘自:http://blog.itpub.net/14284241/viewspace-520876)
但建立本地索引分区,我实验过了,ORACLE有时候就是不走这些索引,非要全表扫描,即使你指定索引也不行!因为在这个表小分区内,特别是在多并行度下,它认为还不如全表扫描快!
SQL SERVER:和ORACLE相反,SQL可以指定和分区键不同的字段索引,即ORACLE说的非前缀全局索引。而且可以指定存放位置。SQL可以在分区函数上定义分区的键(只能一个),然后可以定义其他的字段索引。
SQL SERVER,所谓的分区,就是建立一个聚集索引,并指定索引字段和分区方案;你指定后,其他非聚集索引就可以随意指定其他分区方案了。你也可以建立2个聚集索引,一个是按分区键进行的聚集索引,一个是在分区内的聚集索引(但建立此聚集索引时,还是需要引用和外层一样的分区方案和分区字段,实际就是分区内的聚集索引)。
以上是个人愚见,仅供自己参考。