Wskazówka APPEND – Co Właściwie Robi I Kiedy Z Niej Korzystać?
Wskazówka APPEND (hint APPEND) – jak może się przysłużyć, kiedy i czy w ogóle z niej korzystać? W których przypadkach sprawdzi się doskonalne, a w których będzie opóźniać instrukcje?
DROP TABLE T1 / DROP TABLE T2 / CREATE TABLE T1(id NUMBER, descr CHAR(2000)) / CREATE TABLE T2(id NUMBER, descr CHAR(2000)) / INSERT INTO T1 SELECT ROWNUM, 'A' FROM DUAL CONNECT BY ROWNUM <= 1000000 / COMMIT / /*Przygotowanie tabeli T2*/ INSERT INTO T2 SELECT * FROM T1 / /*Podziurawienie segmentu pamięci*/ DELETE FROM T2 WHERE MOD(id, 10) = 0 / COMMIT /
INSERT INTO T2 SELECT * FROM T1 /
Task completed in 39.402 seconds
INSERT /*+ APPEND */ INTO T2 SELECT * FROM T1 /
Task completed in 21.975 seconds
W powyższym przykładzie wykorzystanie hintu APPEND skróciło czas wstawiania prawie o połowę. Co właściwie się stało i czy zawsze będzie szybciej?
- Wskazówka APPEND nie jest lekiem na całe zło wolniejszego wstawiania rekordów do tabeli
- Wskazówka APPEND wymusza pomijanie buffer cache i wstawia dane bezpośrednio na dysk
- Wymusza wstawianie danych ponad high water mark, czyli nie szuka wolnych miejsc w pamięci, a bezwarunkowo wstawia dane w nowe bloki pamięci, co powoduje rozrost wykorzystanej pamięci
- W przypadku nie zakończenia transakcji, pomiędzy instrukcjami INSERT, a COMMIT niemożliwe jest odpytanie o zawartość tabeli, wstawianie, modyfikowanie ani usuwanie rekordów (ORA-12838)
- Konieczna przy kompresji BASIC, inaczej nowowstawiane rekordy nie będą kompresowane
- Przy małej puli danych do wstawienia, lepiej sprawdza się podejście konwencjonalne
- W przypadku wstawiania ogromu danych, lepiej sprawdzi się bezpośrednie wstawianie z wykorzystaniem wskazówki APPEND
Szymon
[…] tabeli w trybie FULL SCAN. Wiedząc to, z hintu FIRST_ROWS nie korzysta się razem ze wskazówkami APPEND i PARALLEL, bo te bazują właśnie na trybie dostępu […]