sql >> Databasteknik >  >> RDS >> Oracle

Oracle partitionerat bord

Vad är Oracle Partitioned Table?

Partitionering delar upp en tabell, ett index eller en indexorganiserad tabell i mindre komponenter. Varje komponent kallas en partition (eller underpartition för sammansatta partitionerade objekt). Varje partition har ett unikt namn och kan valfritt ha individuella lagringsegenskaper:exempel inkluderar komprimering eller lagras i olika tabellutrymmen. En väl utformad partitioneringsstrategi kan förbättra åtkomst till frågor och uppdateringar genom att begränsa operationen till en enda eller underuppsättning av partitioner.

Partitionering för prestanda – Partitionsbeskärning

Oracles partitionerade tabellfunktion gör det möjligt för frågeoptimeraren att hoppa över partitioner som inte krävs av en viss SQL-sats. Beroende på SQL-satsen kan optimeraren identifiera partitioner och underpartitioner som behöver nås, såväl som de som inte gör det. Detta kan resultera i avsevärda förbättringar av frågeprestanda, eftersom optimeraren fokuserar på en specifik delmängd av data som kan förfinas ytterligare om ytterligare predikat finns.

Optimeraren gör detta genom att använda partitionsinformationen som lagras i dataordbok för att identifiera innehållet i en partition utan att fråga efter data som den innehåller. Partitionering är ett extra lager i datalexikonet mellan tabeller/index och tabellutrymmen

Begränsning av partitionerad tabell

I Oracle Database 11g kan en tabell ha maximalt 1048575 (1024K – 1) partitioner. Med det enda undantaget för tabeller som innehåller kolumner med LONG eller LONG RAW datatyper, kan alla tabeller partitioneras (inklusive kolumner av typen CLOB eller BLOB).

Typ av tabellpartitioner

Partitionering är tillgänglig i Oracle-databasen från version 8.0 och oracle lägger kontinuerligt till fler och fler funktioner för varje utgåva. Följande tabell visar en sammanfattning av de viktigaste ändringarna

Den huvudsakliga partitionsstrategin som ges av Oracle är
(1)Range
(2)List
(3) Hash
(4)Composite

Hur man skapar partitionstabellen

Beroende på typer av partition, här är sättet att skapa partitionstabellen

Räckviddspartitionering

Oracle Partitionera data baserat på på varandra följande värdeintervall för partitionsnyckeln.
Varje partitions slutpunkt anges med följande syntax:

VALUES LESS THAN (value-list)

Exempel

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

Områdespartitionering är användbart för att partitionera historiska data och transaktionsdata, eftersom gränserna för områdespartitionen definierar partitionsordningen i tabeller och index

Listapartitionering

I den här metoden mappar Oracle specifika rader till partitioner, baserat på en statisk lista med bokstavliga värden. Partitionsnyckeln för listpartitionering kan bara baseras på en enda kolumn.

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

I detta orakel använde hashalgoritmen för att bestämma den fysiska placeringen av data. Hash-partitionering kommer att fördela data jämnt över ett fast antal partitioner.

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

Kompositpartitionering

I det här oraklet används kombinationen av range, list och hash partitioning.composite partitioneringsmetoder är range-hash eller 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'))
  );

Hur man flyttar det befintliga objektet till det partitionerade objektet

Det finns många sätt att uppnå denna bedrift. Jag förklarar här den förenklade metoden
1.Skapa en tom partitionerad tabell med hjälp av den partitionerade klausulen och med parallellalternativet. Tabellnamnet måste ha ett annat namn än den icke-partitionerade tabellen.
2. Fyll i data för den obligatoriska partitionen från den icke-partitionerade tabellen.
3. Överväg att använda orakeltipset APPEND med en INSERT-sats som en enkel kodändring som ger bra prestanda. Om loggning är aktiverad och index finns, kanske tipset INSERT /*+ APPEND */ inte är effektivt. För att minimera omkostnader för indexunderhåll, släpp index före migrering och återskapa dem när den partitionerade tabellen har fyllts i.
4. Byt namn på den partitionerade tabellen till samma som den ursprungliga tabellen, eller ändra synonymen.
5. Bygg tabellindex för den partitionerade tabellen

Läser också
Oracle Partition Index
Oracle Parallel Query
https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm


  1. PostgreSQL-funktion för senast infogade ID

  2. ROLLBACK händelseutlösare i postgresql

  3. Row Goals, del 3:Anti Joins

  4. Ta bort från två tabeller i en fråga