我使用的是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 |
-----------------------------------如您所见,分布不均匀分布,这就是为什么我想使用前两个字符而不是第一个字符来定义范围分区。
建议?
谢谢!