Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zmniejszyć tabelę temp w Oracle?

O mój Boże! Spójrz na rozmiar mojego tymczasowego obszaru tabel! Lub... jak zmniejszyć tymczasowe obszary tabel w Oracle.

Tak, uruchomiłem zapytanie, aby zobaczyć, jak duży jest mój tymczasowy obszar tabel:

SQL> SELECT tablespace_name, file_name, bytes
2  FROM dba_temp_files WHERE tablespace_name like 'TEMP%';

TABLESPACE_NAME   FILE_NAME                                 BYTES
----------------- -------------------------------- --------------
TEMP              /the/full/path/to/temp01.dbf     13,917,200,000
 

Pierwsze pytanie, które musisz zadać, dotyczy tego, dlaczego tymczasowa przestrzeń tabel jest tak duża. Być może znasz odpowiedź na to pytanie. Może to być spowodowane dużym zapytaniem, które po prostu uruchomiłeś z rodzajem, który był błędem (zrobiłem to więcej niż raz). Może to być spowodowane inną wyjątkową okolicznością. Jeśli tak jest, wszystko, co musisz zrobić, aby oczyścić, to zmniejszyć przestrzeń tymczasowej tabeli i przejść do życia.

Ale co, jeśli nie wiesz? Zanim zdecydujesz się zmniejszyć, być może będziesz musiał zbadać przyczyny dużej przestrzeni tabel. Jeśli zdarza się to regularnie, możliwe, że Twoja baza danych potrzebuje tylko tyle miejsca.

Dynamiczny widok wydajności

V$TEMPSEG_USAGE
 

może być bardzo przydatny w ustaleniu przyczyny.

Może po prostu nie obchodzi cię przyczyna i po prostu musisz ją zmniejszyć. To twój trzeci dzień w pracy. Dane w bazie danych to tylko dane 200MiBif, a tymczasowa przestrzeń tabel to 13GiB - Po prostu zmniejsz i przejdź dalej. Jeśli znów się powiększy, przyjrzymy się przyczynie. W międzyczasie brakuje mi miejsca na tym woluminie dysku i potrzebuję tylko miejsca z powrotem.

Przyjrzyjmy się zmniejszeniu. Będzie to trochę zależeć od używanej wersji Oracle i od tego, jak skonfigurowano tymczasowy obszar tabel.
Oracle zrobi wszystko, co w Twojej mocy, abyś nie popełnił żadnych potwornych błędów, więc po prostu wypróbujemy polecenia, a jeśli nie pracy będziemy zmniejszać się w nowy sposób.

Najpierw spróbujmy zmniejszyć plik danych. Jeśli uda nam się to zrobić, odzyskamy przestrzeń i możemy się martwić, dlaczego jutro urosła.

SQL>
SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M; 
alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M
*   
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
 

W zależności od komunikatu o błędzie możesz spróbować tego z różnymi rozmiarami, które są mniejsze niż bieżąca witryna pliku. Odniosłem z tym ograniczony sukces. Oracle zmniejszy plik tylko wtedy, gdy tymczasowy obszar tabel znajduje się na początku pliku i jeśli jest mniejszy niż określony rozmiar. Jakaś stara dokumentacja Oracle (poprawili to) mówi, że możesz wydać polecenie, a komunikat o błędzie powie ci, do jakiego rozmiaru możesz się zmniejszyć. Kiedy zacząłem pracować jako DBA, nie było to prawdą. Trzeba było tylko zgadnąć i ponownie uruchomić polecenie kilka razy i sprawdzić, czy zadziałało.

W porządku. To nie zadziałało. Co powiesz na to.

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
 

Jeśli masz 11g (może też 10g), to jest to! Jeśli to działa, możesz wrócić do poprzedniego polecenia i spróbować jeszcze raz.

Ale co, jeśli to się nie powiedzie. Jeśli tymczasowy obszar tabel jest domyślnym tymczasowym, który został skonfigurowany podczas instalacji bazy danych, może być konieczne wykonanie dużo więcej pracy. W tym momencie zwykle ponownie oceniam, czy naprawdę potrzebuję tej przestrzeni z powrotem. W końcu miejsce na dysku kosztuje tylko X, XX USD za GiB. Zwykle nie chcę wprowadzać takich zmian w godzinach produkcji. To oznacza pracę w 2AMAGAIN! (Nie żebym naprawdę sprzeciwiał się pracy o 2 w nocy - po prostu... Cóż, ja też lubię spać. A moja żona lubi mieć mnie w domu o 2 w nocy... a nie włóczyć się po śródmiejskich ulicach o 4 w nocy, próbując przypomnieć sobie, gdzie zaparkowałem samochód 3 godziny wcześniej. Słyszałem o tej „telepracy”. Po prostu martwię się, że zdążę w połowie i wtedy moja łączność z Internetem zawiedzie – potem muszę spieszyć się do centrum, żeby to naprawić, zanim ludzie przyjdą rano, żeby skorzystać bazy danych).

Ok... Wracając do poważnych rzeczy... Jeśli tymczasowy obszar tabel, który chcesz zmniejszyć, jest domyślnym tymczasowym obszarem tabel, musisz najpierw utworzyć nowy tymczasowy obszar tabel, ustawić go jako domyślny tymczasowy obszar tabel, a następnie upuścić stary domyślny tymczasowy obszar tabel i odtworzyć go to. Następnie upuść drugą utworzoną tabelę tymczasową.

SQL> CREATE TEMPORARY TABLESPACE temp2 2 TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE 3 AUTOEXTEND ON NEXT 1M MAXSIZE unlimited 4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; Tablespace created. SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2; Database altered. SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES; Tablespace dropped. SQL> CREATE TEMPORARY TABLESPACE temp 2 TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE 3 AUTOEXTEND ON NEXT 128M MAXSIZE unlimited 4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; Tablespace created. SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp; Database altered. SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES; Tablespace dropped.

Mam nadzieję, że jedna z tych rzeczy pomoże!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić listę wszystkich tabel w schemacie w Oracle SQL?

  2. Jaka jest podwójna tabela w Oracle?

  3. Oracle 11g w systemie Mac OS X

  4. Pisanie w ExcelSheet przy użyciu pakietu UTL_FILE w Oracle

  5. Nazwa kolumny SQL taka sama jak nazwa zmiennej PL/SQL — Jak to zrobić w instrukcji SELECT?