Wie soll ich Bereich einen Index mit einer varchar2 Spalte in Oracle partitionieren? Ist es eine schlechte Idee?

StackOverflow https://stackoverflow.com/questions/1283228

  •  16-09-2019
  •  | 
  •  

Frage

Ich bin mit Oracle 10g Enterprise Edition.

Eine Tabelle in unserer Oracle-Datenbank speichert die soundex Wert Darstellung einer anderen Textspalte. Wir verwenden eine benutzerdefinierte soundex Implementierung, bei der die soundex Werte sind länger als die traditionellen soundex Algorithmen erzeugt werden (wie die Oracle verwendet). Das ist wirklich nebensächlich.

Grundsätzlich habe ich eine varchar2 Spalte, die durch eine dynamische Anzahl von numerischen Werten (z.B. ‚A12345‘, ‚S382771‘, usw.), gefolgt Werte, die ein einzelnes Zeichen hat. Die Tabelle wird durch eine andere Spalte aufgeteilt, aber ich möchte einen partitionierten Index für die soundex Spalte hinzuzufügen, da es oft gesucht wird. Beim Versuch, einen Bereich partitionierten Index mit dem ersten Zeichen der soundex Spalte hinzuzufügen es super funktioniert:

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%'
    ...
);

Allerdings habe ich, um gleichmäßiger die Größe der Partitionen zu verteilen, möchte ich einige Partitionen durch die ersten beiden Zeichen definieren, 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 reichen, um Partition varchar2 Spalten verwenden. Ich bin sicher, dies ist eine weniger als ideale Wahl, vielleicht kann jemand eine bessere Lösung empfehlen. Hier ist eine Verteilung der soundex Daten in meiner Tabelle:

-----------------------------------
|  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, die Verteilung nicht gleichmäßig verteilt, weshalb ich Bereich Partitionen mit den ersten beiden Zeichen, anstatt nur das erste Zeichen definieren möchten.

Verbesserungsvorschläge?

Danke!

War es hilfreich?

Lösung

Was genau ist Ihre Frage?

Sie nicht wissen, wie Sie Ihre Tabelle in n gleiche Teile aufspalten Skew zu vermeiden?

Sie können das tun mit analytischer Funktion PERCENTILE_DISC ().

Hier ein SQL-PLUS Beispiel mit n = 100, ich gebe zu, dass es nicht sehr anspruchsvoll ist, aber es wird die Arbeit tun.

set pages 0
set lines 200

drop table random_strings;

create table random_strings 
as 
select upper(dbms_random.string('A', 12)) rndmstr
from dual 
connect by level < 1000;


spool parts

select 'select '||level||'/100,percentile_disc('||level||
       '/100) within group (order by RNDMSTR) from random_strings;' 
       sql_statement
from dual 
connect by level <= 100
/

spool off

Dies wird Ausgabe in Datei parts.lst:

select 1/100,percentile_disc(1/100) within group (order by RNDMSTR) from random_strings;                                                                                                                
select 2/100,percentile_disc(2/100) within group (order by RNDMSTR) from random_strings;                                                                                                                
select 3/100,percentile_disc(3/100) within group (order by RNDMSTR) from random_strings;                                                 
...
select 100/100,percentile_disc(100/100) within group (order by RNDMSTR) from random_strings;                                                 

Jetzt können Sie Skript parts.lst ausführen, um die Partitionswerte zu erhalten. Jede Partition wird 1% der Daten enthält anfänglich.

Script parts.lst folgende Ausgabe:

   ,01 AJUDRRSPGMNP
   ,02 AOMJZQPZASQZ
   ,03 AWDQXVGLLUSJ
   ,04 BIEPUHAEMELR
   .... 
   ,99 ZTMHDWTXUJAR
   1   ZYVJLNATVLOY

Andere Tipps

Ist die Tabelle wird von dem Partitionierungsschlüssel neben dem SOUNDEX Wert gesucht? Oder ist es nur von der SOUNDEX Spalte gesucht wird?

Wenn Sie versuchen, nur eine gleichmäßige Verteilung von Daten zwischen Partitionen zu erreichen, haben Sie darüber nachgedacht, Hash-Partitionen anstatten Bereich Partitionen? Vorausgesetzt Sie haben eine Leistung von 2 für die Anzahl der Partitionen wählen, das sollten Sie eine ziemlich gleichmäßige Verteilung von Daten zwischen Partitionen.

Sprich mit mir!  Können Sie mir sagen, was für die Partitionierung dieser Tabelle Ihr Grund? Es klingt wie es eine OLTP-Tabelle und muß nicht Partition sein. Wir wollen nicht nur partitionieren zu sagen, dass wir getrennt sind. Sagen Sie mir, was Sie durch Aufteilen dieser Tabelle zu erreichen versuchen, und ich kann Sie ein korrektes Partitionsschema wählen helfen. Partitionierung ist gleich nicht schnelle Abfragen. Es kann tatsächlich dazu führen, dass Anfragen in einigen Fällen langsamer sein.

Ich sehe einige Ihrer zusätzlichen Gedanken oben und ich glaube nicht, dass Sie Ihren Tisch partitionieren müssen. Wenn Ihre Abfragen auf ganze Partitionen tun Aggregate werden werden, dann können Sie partitionieren möchten. Wenn Sie Hunderte von Millionen von Datenzeilen haben werden können Sie partitionieren möchten mit DBA-Wartung zu helfen. Wenn Sie nur Sie Abfragen wollen schnell dann der Primärschlüsselindex laufen ausreicht. Bitte lassen Sie mich wissen,

Erstellen Sie einfach einen globalen Index auf Ihren gewünschten Spalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top