我正在使用 Oracle 10g 企业版。
我们的 Oracle 数据库中的一个表存储另一个文本列的 soundex 值表示。我们正在使用自定义 soundex 实现,其中 soundex 值比传统 soundex 算法(例如 Oracle 使用的算法)生成的要长。这真的是无关紧要的。
基本上我有一个 varchar2 列,它的值包含单个字符,后跟动态数量的数值(例如'A12345'、'S382771'等)。该表由另一列分区,但我想将分区索引添加到 soundex 列,因为它经常被搜索。当尝试使用 soundex 列的第一个字符添加范围分区索引时,效果很好:
create index IDX_NAMES_SOUNDEX on NAMES_SOUNDEX (soundex)
global partition by range (soundex) (
partition IDX_NAMES_SOUNDEX_PART_A values less than ('B'), -- 'A%'
partition IDX_NAMES_SOUNDEX_PART_B values less than ('C'), -- 'B%'
...
);
但是,为了更均匀地分配分区的大小,我想通过前两个字符定义一些分区,如下所示:
create index IDX_NAMES_SOUNDEX on NAMES_SOUNDEX (soundex)
global partition by range (soundex) (
partition IDX_NAMES_SOUNDEX_PART_A5 values less than ('A5'), -- 'A0% - A4%'
partition IDX_NAMES_SOUNDEX_PART_A values less than ('B'), -- 'A4% - A9%'
partition IDX_NAMES_SOUNDEX_PART_B values less than ('C'), -- 'B%'
...
);
我不确定如何使用 varchar2 列正确划分分区。我确信这是一个不太理想的选择,所以也许有人可以推荐一个更好的解决方案。这是我表中 soundex 数据的分布:
-----------------------------------
| SUBSTR(SOUNDEX,1,1) | COUNT |
-----------------------------------
| A | 6476349 |
| B | 854880 |
| D | 520676 |
| F | 1200045 |
| G | 280647 |
| H | 3048637 |
| J | 711031 |
| K | 1336522 |
| L | 348743 |
| M | 3259464 |
| N | 1510070 |
| Q | 276769 |
| R | 1263008 |
| S | 3396223 |
| V | 533844 |
| W | 555007 |
| Y | 348504 |
| Z | 1079179 |
-----------------------------------
如您所见,分布不是均匀分布的,这就是为什么我想使用前两个字符而不是第一个字符来定义范围分区。
建议?
谢谢!