Oracle switch partitions

Oracle switch partitions
PO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 3 lata
  • Postów:211
0

Cześć,

Potrzebuje w Oracle przenieść zawartość jednej tabeli do drugiej, duże znaczenie ma tutaj wydajność.

W MS SQL robiłem to w ten sposób

Kopiuj
ALTER TABLE  dbo.[TABLE] SWITCH TO temp.[TABLE]

W Oracle wydaje się nieco bardziej skomplikowane, w dodatku chcę to zrobić w procedurze i widzę że polecenie alter jest zblokowane chociaż tutaj czytałem, że da się to zrobić przez dynamiczny SQL

Znalazłem taki fragment

Kopiuj
ALTER TABLE CALL
  EXCHANGE PARTITION call_partition WITH TABLE call_temp
  INCLUDING INDEXES
  WITHOUT VALIDATION;

Natomiast u mnie w Tabelach jeśli wejdę we właściwości i zakładkę "Partitions" to jest pusto, czy muszę dodać partycję?

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 dni
  • Postów:2370
0

Natomiast u mnie w Tabelach jeśli wejdę we właściwości i zakładkę "Partitions" to jest pusto, czy muszę dodać partycję?

Oznacza to, że Twoja tabela nie jest partycjonowana. W zależności od rodzaju systemu masz różne opcje przerobienia tabeli na partycjonowaną.
Sprawdź np. https://oracle-base.com/articles/misc/partitioning-an-existing-table

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

a nie możesz zmienić nazwy tabeli po prostu

Kopiuj
alter table
   table_name
rename to
   new_table_name;

z tego co czytałem to właśnie coś takiego robi mssqlowy SWITCH TO a jak potrzebujesz mieć "starą" tabelę pustą po tej operacji to ją stwórz.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 dni
  • Postów:2370
0

Możesz spróbować CTAS:

Kopiuj
create table foo2 as select * from foo f;

Jeśli tabela jest spora i masz możliwość puszczenia na kilku procesach:

Kopiuj
create table foo2 as select /*+ FULL(f) PARALLEL(f, ilosc_procesow) */ from foo f; 

Jeśli jest tabelą IOT (index organized):

Kopiuj
create table foo2 as select /*+ FULL(f) PARALLEL_INDEX(f, ilosc_procesow) */ from foo f; 
PO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 3 lata
  • Postów:211
0

Poszedłem drogą utworzenia partycji i wtedy exchange partition, ale nie rozumiem jednej rzeczy. Dlaczego jedna tabela ma być partycjonowana a druga nie :)

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

to może napisz co chcesz uzyskać.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
PO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 3 lata
  • Postów:211
0

Chcę zrobić procedurę która możliwie jak najszybciej przenosi całe dane z jednej tabeli do drugiej (struktura tabel identyczna)

Kopiuj
The procedure MOVE performs the following steps:
  - move from TARGET_TABLE to _EMP
  - move from _NEW to TARGET_TABLE
  - truncate _EMP table
edytowany 2x, ostatnio: porschelukas
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 dni
  • Postów:2370
0
porschelukas napisał(a):

Chcę zrobić procedurę która możliwie jak najszybciej przenosi całe dane z jednej tabeli do drugiej (struktura tabel identyczna)

Kopiuj
The procedure MOVE performs the following steps:
  - move from TARGET_TABLE to _EMP
  - move from _NEW to TARGET_TABLE
  - truncate _EMP table

To exchange partitions będzie najszybsze, z tego względu, że zamieniasz segment tabeli źródłowej z segmentem partycji, więc jest to zmiana metadanych.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.