Wat is Oracle Partitioned Table?
Partitioneren verdeelt een tabel, index of index-georganiseerde tabel in kleinere componenten. Elke component wordt een partitie genoemd (of subpartitie voor samengestelde gepartitioneerde objecten). Elke partitie heeft een unieke naam en kan optioneel individuele opslagkenmerken hebben:voorbeelden zijn onder meer compressie of worden opgeslagen in verschillende tabelruimten. Een goed ontworpen partitioneringsstrategie kan de toegang tot query's en updates verbeteren door de bewerking te beperken tot een enkele of subset partities.
Partitionering voor prestaties – Partities snoeien
Met de functie Oracle Partitioned Table kan de query-optimizer partities overslaan die niet vereist zijn door een bepaalde SQL-instructie. Afhankelijk van de SQL-instructie kan de optimizer partities en subpartities identificeren die moeten worden geopend, evenals partities die dat niet doen. Dit kan leiden tot substantiële verbeteringen in de prestaties van query's, omdat de optimizer zich richt op een specifieke subset van gegevens die verder kan worden verfijnd als er aanvullende predikaten bestaan.
De optimizer doet dit door gebruik te maken van de partitie-informatie die is opgeslagen in de datadictionary om de inhoud van een partitie te identificeren zonder de gegevens die het bevat op te vragen. Partitionering is een extra laag van de datadictionary tussen tabellen/indexen en tabelruimten
Beperking van gepartitioneerde tabel
In Oracle Database 11g kan een tabel maximaal 1048575 (1024K – 1) partities hebben. Met uitzondering van tabellen die kolommen van LONG of LONG RAW datatypes bevatten, kunnen alle tabellen worden gepartitioneerd (inclusief kolommen van het type CLOB of BLOB).
Type tabelpartities
Partitionering is beschikbaar in Oracle-database vanaf versie 8.0 en Oracle voegt bij elke release voortdurend meer en meer functies toe. De volgende tabel toont een samenvatting van de belangrijkste wijzigingen
De belangrijkste partitiestrategie die door Oracle wordt gegeven, is
(1)Bereik
(2)Lijst
(3) Hash
(4)Composite
Hoe de partitietabel te maken
Afhankelijk van het type partitie, is dit de manier om de partitietabel te maken
Bereikpartitionering
Oracle Partitioneer de gegevens op basis van opeenvolgende waardenbereiken van de partitiesleutel.
Het eindpunt van elke partitie wordt gespecificeerd met behulp van de volgende syntaxis:
VALUES LESS THAN (value-list)
Voorbeeld
CREATE TABLE EXP_RANGE (ID NUMBER(15) NOT NULL, CODE_ID NUMBER(15) NOT NULL, PERIOD_NAME VARCHAR2(15) NOT NULL, ACTUAL_FLAG VARCHAR2(1) NOT NULL, VERSION_ID NUMBER(15), LAST_UPDATE_DATE DATE NOT NULL, . . . . . . ) PARTITION BY RANGE (PERIOD_NAME) ( PARTITION PR1 VALUES LESS THAN ('JAN-2019'), PARTITION PR2 VALUES LESS THAN ('FEB-2019') . . . . . . );
Bereikpartitionering is handig voor het partitioneren van historische en transactiegegevens, aangezien de grenzen van de bereikpartitie de volgorde van partities in tabellen en indexen bepalen
Lijst partitionering
Bij deze methode wijst oracle specifieke rijen toe aan partities, op basis van een statische lijst met letterlijke waarden. De partitiesleutel voor het partitioneren van lijsten kan alleen gebaseerd zijn op een enkele kolom.
CREATE TABLE EXP_LIST (ID NUMBER NOT NULL, ORG_ID NUMBER, OPEN_FLAG VARCHAR2(4) NOT NULL, . . . . . . ) PARTITION BY LIST (open_flag) ( PARTITION PR1 VALUES ('YES'), PARTITION PR2 VALUES ('NO') );
Hash-partitionering
In dit orakel werd het hashing-algoritme gebruikt om de fysieke plaatsing van gegevens te bepalen. Hash-partitionering verdeelt de gegevens gelijkmatig over een vast aantal partities.
CREATE TABLE EXP_HASH (ID NUMBER NOT NULL, ORG_ID NUMBER, ORDERED_ITEM VARCHAR2(2000), OPEN_FLAG VARCHAR2(1) NOT NULL, . . . . . . ) PARTITION BY HASH (ID) PARTITIONS 10 . . . . . .; );
Samengestelde partities
In dit orakel wordt de combinatie van bereik, lijst en hash-partitionering gebruikt. Composite-partitioneringsmethoden zijn range-hash of range-list.
CREATE TABLE sales_details ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE , channel_id VARCHAR2(1) , promo_id NUMBER(6) , quantity_sold NUMBER(3) , amount_sold NUMBER(10,2) ) PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id) SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4) ( PARTITION sales_q1_2019 VALUES LESS THAN (TO_DATE('01-APR-2019','dd-MON-yyyy')) , PARTITION sales_q2_2019 VALUES LESS THAN (TO_DATE('01-JUL-2019','dd-MON-yyyy')) , PARTITION sales_q3_2019 VALUES LESS THAN (TO_DATE('01-OCT-2019','dd-MON-yyyy')) , PARTITION sales_q4_2019 VALUES LESS THAN (TO_DATE('01-JAN-2019','dd-MON-yyyy')) );
Hoe het bestaande object naar het gepartitioneerde object te verplaatsen
Er zijn veel manieren om deze prestatie te bereiken. Ik leg hier de simplistische methode uit
1.Maak een lege gepartitioneerde tabel met behulp van de gepartitioneerde clausule en met de parallelle optie. De tabelnaam moet een andere naam hebben dan de niet-gepartitioneerde tabel.
2.Vul gegevens voor de vereiste partitie uit de niet-gepartitioneerde tabel.
3. Overweeg het gebruik van de orakel-hint APPEND met een INSERT-instructie als een gemakkelijke codewijziging die goede prestaties levert. Als logboekregistratie is ingeschakeld en indexen aanwezig zijn, is de hint INSERT /*+ APPEND */ mogelijk niet effectief. Om de overhead van indexonderhoud te minimaliseren, verwijdert u indexen vóór de migratie en maakt u ze opnieuw zodra de gepartitioneerde tabel is gevuld.
4. Hernoem de gepartitioneerde tabel naar dezelfde als de originele tabel, of wijzig het synoniem.
5. Tabelindexen maken voor de gepartitioneerde tabel
Leest ook
Oracle Partition Index
Oracle Parallel Query
https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm