sql >> Databáze >  >> RDS >> Oracle

Dělená tabulka Oracle

Co je Oracle Partitioned Table?

Rozdělení rozděluje tabulku, index nebo tabulku uspořádanou podle indexu na menší komponenty. Každá komponenta se nazývá oddíl (nebo pododdíl pro složené rozdělené objekty). Každý oddíl má jedinečný název a volitelně může mít individuální charakteristiky úložiště:příklady zahrnují kompresi nebo uložení v různých tabulkových prostorech. Dobře navržená strategie dělení může zlepšit přístup k dotazům a aktualizace omezením operace na jeden oddíl nebo podmnožinu oddílů.

Rozdělení pro výkon – Prořezávání oddílů

Funkce Oracle Partitioned Table umožňuje optimalizátoru dotazů přeskočit oddíly, které nejsou vyžadovány konkrétním příkazem SQL. V závislosti na příkazu SQL může optimalizátor identifikovat oddíly a pododdíly, ke kterým je třeba přistupovat, i ty, které tomu tak nejsou. To může vést k podstatnému zlepšení výkonu dotazů, protože optimalizátor se zaměřuje na konkrétní podmnožinu dat, která lze dále zpřesnit, pokud existují další predikáty.

Optimalizátor to provádí pomocí informací o oddílech uložených v datový slovník k identifikaci obsahu oddílu bez dotazování na data, která obsahuje. Rozdělení je další vrstva datového slovníku mezi tabulkami/indexy a tabulkovými prostory

Omezení dělené tabulky

V Oracle Database 11g může mít tabulka maximálně 1048575 (1024K – 1) oddílů. S jedinou výjimkou tabulek obsahujících sloupce datových typů LONG nebo LONG RAW lze všechny tabulky rozdělit (včetně sloupců typu CLOB nebo BLOB).

Typ oddílů tabulky

Rozdělení je k dispozici v databázi Oracle od verze 8.0 a Oracle neustále přidává další a další funkce s každým vydáním. Následující tabulka ukazuje souhrn hlavních změn

Hlavní strategie rozdělení od společnosti Oracle jsou
(1)Range
(2)List
(3) Hash
(4)Composite

Jak vytvořit tabulku oddílů

V závislosti na typech Partition , zde je způsob, jak vytvořit tabulku Partition

Rozdělení podle rozsahu

Oracle Partition data na základě po sobě jdoucích rozsahů hodnot klíče oddílu.
Koncový bod každého oddílu je určen pomocí následující syntaxe:

HODNOTY MENŠÍ NEŽ (seznam hodnot)

Příklad

VYTVOŘTE TABULKU EXP_RANGE (ID ČÍSLO(15) NENÍ NULL, CODE_ID ČÍSLO(15) NENÍ NULL, PERIOD_NAME VARCHAR2(15) NENÍ NULL, ACTUAL_FLAG VARCHAR2(1) NENÍ NULL, VERSION_ID ČÍSLO(15), POSLEDNÍ AKTUALIZACE_NULL . . . . . . . . . . . . . . . . . . . . . . . . . ) ROZDĚLENÍ PODLE ROZSAHU ( OBDOBÍ_NÁZEV) ( HODNOTY ODDĚLENÍ PR1 MENŠÍ NEŽ ('LEDEN-2019'), HODNOTY ODDĚLENÍ PR2 MENŠÍ NEŽ (' ÚNOR-2019') . . . . . ); 

Rozdělení na oddíly je užitečné pro rozdělení historických a transakčních dat, protože hranice rozdělení rozsahu definují pořadí rozdělení v tabulkách a indexech

Rozdělení seznamu

V této metodě oracle mapuje konkrétní řádky na oddíly na základě statického seznamu doslovných hodnot. Klíč oddílu pro rozdělení seznamu může být založen pouze na jednom sloupci.

CREATE TABLE EXP_LIST (ID NUMBER NENÍ NULL, ORG_ID NUMBER, OPEN_FLAG VARCHAR2(4) NOT NULL, . . . . . ) ROZDĚLENÍ PODLE SEZNAMU (open_flag) ( HODNOTY PR1 ODDĚLENÍ ('ANO'), (HODNOTY ODDĚLENÍ PR2 'NE') );

Hash Partitioning

V tomto orákulu se k rozhodnutí o fyzickém umístění dat použil hashovací algoritmus. Hash partitioning bude distribuovat data rovnoměrně přes pevný počet partitions.

CREATE TABLE EXP_HASH (ID NUMBER NENÍ NULL, ORG_ID NUMBER, ORDERED_ITEM VARCHAR2(2000), OPEN_FLAG VARCHAR2(1) NOT NULL, . . . . . ) ROZDĚLENÍ PODLE HASH (ID) ODDĚLENÍ 10 . . . . .; );

Kompozitní rozdělení

V tomto orákulu byla použita kombinace range, list a hash partitioning.složené metody rozdělení jsou range-hash nebo range-list.

CREATE TABLE sales_details ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE , channel_id VARCHAR2(1) , promo_id NUMBER(6) , množstevní_prodané NUMBER(3) , prodané množství NUMBER(10,2) ) PARTITION BY RANGE ) SUBPARTITION BY HASH (cust_id) SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4) ( PARTITION sales_q1_2019 VALUES MENS THAN (TO_DATE('01-APR-2019','dd-MON-yyyyy 2VALUE sales') 2q. MÉNĚ NEŽ (DO_DATE('01-JUL-2019','dd-MON-yyyy')) , PARTITION sales_q3_2019 VALUES LESS THAN (DO_DATE('01-OCT-2019','dd-MON-yyyy')) , PARTICE sales_q4_2019 HODNOTY MENŠÍ NEŽ (DO_DATE('01-JAN-2019','dd-MON-yyyy')) );

Jak přesunout existující objekt do rozděleného objektu

Existuje mnoho způsobů, jak tohoto výkonu dosáhnout. Vysvětluji zde zjednodušující metodu
1. Vytvořte prázdnou dělenou tabulku pomocí klauzule dělené a s možností paralelní. Název tabulky musí mít jiný název než nerozdělená tabulka.
2.Naplňte data pro požadovaný oddíl z nerozdělené tabulky.
3. Zvažte použití nápovědy APPEND oracle s příkazem INSERT jako snadnou změnu kódu, která poskytuje dobrý výkon. Pokud je povoleno protokolování a jsou přítomny indexy, nemusí být nápověda INSERT /*+ APPEND */ účinná. Chcete-li minimalizovat režii údržby indexu, zrušte před migrací indexy a znovu je vytvořte, jakmile bude rozdělená tabulka naplněna.
4. Přejmenujte rozdělenou tabulku na stejnou jako původní tabulku nebo změňte synonymum.
5. Vytvořte indexy tabulky pro dělenou tabulku

Také čte
Oracle Partition Index
Oracle Parallel Query
https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm


  1. Rozdělení podle rozpočtu

  2. Jak mohu zkrátit datum a čas na serveru SQL Server?

  3. MariaDB ROW_COUNT() Vysvětleno

  4. Jak mohu exportovat schéma databáze v PostgreSQL?