Ich verwende Oracle 10g Enterprise Edition.Wie sollte ich in Oracle eine Partition mit einer varchar2-Spalte partitionieren? Ist das eine schlechte Idee?
Eine Tabelle in unserer Oracle-Datenbank speichert die Soundex-Wertdarstellung einer anderen Textspalte. Wir verwenden eine angepasste Soundex-Implementierung, bei der die Soundex-Werte länger sind als die von herkömmlichen Soundex-Algorithmen (wie die von Oracle verwendeten). Das ist wirklich nebensächlich.
Grundsätzlich habe ich eine varchar2 Spalte, die Werte mit einem einzelnen Zeichen gefolgt von einer dynamischen Anzahl von numerischen Werten (z. B. 'A12345', 'S382771', etc) enthält. Die Tabelle ist durch eine andere Spalte partitioniert, aber ich möchte der soundex-Spalte einen partitionierten Index hinzufügen, da dieser häufig durchsucht wird. Beim Versuch, eine bereichspartitionierte Index mit dem ersten Zeichen der soundex Spalte hinzuzufügen funktionierte es toll:
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%'
...
);
jedoch in I, um gleichmäßiger die Größe der Partitionen zu verteilen, wurde ich von der einige Partitionen definieren möchten ersten beiden Zeichen, etwa so:
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%'
...
);
ich bin nicht sicher, wie man richtig Partition mit varchar2 Spalten reichen. Ich bin sicher, dass dies eine weniger als ideale Wahl ist, vielleicht kann jemand eine bessere Lösung empfehlen. Hier ist eine Verteilung der soundex Daten in meinem Tisch:
-----------------------------------
| 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 |
-----------------------------------
Wie Sie sehen können, ist die Verteilung nicht gleichmäßig verteilt, weshalb ich Bereich Partitionen mit den ersten beiden Zeichen, anstatt nur das erste Zeichen definieren möchten .
Vorschläge?
Danke!
+1 Ich bin sicherlich ein Oracle-Anfänger. Ich wusste nichts über percentile_disc ... vielen, vielen Dank für den Tipp, es hat mir Kopfschmerzen und Frustration erspart, die versuchen, die Datenverteilung herauszufinden. Um die erste Zeile Ihrer Antwort zu beantworten, denke ich, was ich frage ist: Ist mein Ansatz zum Indexieren der Tabelle, die ich beschrieben, geeignet? –
Sie fragen Bereiche ab, so dass Hash Partioing nicht hilft, weil nach dem Hashing die Nähe verloren geht. Ihr Ansatz zur Partitionierung ist also angemessen. Sie können PARTITION ... WERTE WENIGER ALS (MAXWERT)) für die letzte Partition verwenden, um Werte wie 'ZZZYY233' zu speichern. – tuinstoel