2010-11-11

Przebudowa indeksów Firebird

W trakcie dodawania nowych danych oraz modyfikowania istniejących danych w bazie danych, wewnętrzne struktury służące do przechowywania indeksów, mogą nie być zbudowane w sposób optymalny. Aby zapewnić optymalny dostęp do danych, należy od czasu do czasu przebudować indeksy.

Jednym ze sposobów na przebudowę indeksów jest wykonanie kopii bezpieczeństwa bazy danych (backup), a następnie odbudowanie całej bazy na podstawie tej kopii (recreate). W przypadku wielkich baz danych takie postępowanie może być nie do przyjęcia — głównie z powodu długiego czasu potrzebnego na odbudowanie bazy danych.

Na szczęście nie trzeba odtwarzać bazy danych, aby przebudować indeksy. Wystarczy dezaktywować indeksy poleceniem ALTER INDEX xxxxx INACTIVE, a następnie ponownie je aktywować poleceniem ALTER INDEX xxxxx ACTIVE.

Niestety, powyższy sposób nie umożliwia przebudowania indeksów kluczy głównych (PRIMARY KEY) oraz indeksów dla kluczy obcych (FOREIGN KEY). Takich indeksów nie można dezaktywować. W Firebird jest na to sposób: można wykonać polecenie ALTER INDEX xxxxx ACTIVE bez uprzedniego dezaktywowania indeksu. Mimo, że aktywowanie aktywnego indeksu może wydawać się dziwne, serwer Firebird w takim przypadku również przebuduje indeks. Można tę cechę Firebird wykorzystać do przebudowy wszystkich indeksów, również indeksów kluczy głównych i kluczy obcych.

Listę wszystkich indeksów z bazy danych można uzyskać wykonując polecenie:
SELECT
   'ALTER INDEX '
   || Trim(RDB$INDEX_NAME)
   || ' ACTIVE;'
 FROM
   RDB$INDICES
 WHERE
   RDB$RELATION_NAME NOT STARTING WITH 'RDB$';

2 komentarze:

  1. Witam,
    czy mogę prosić o podpowiedz w jaki sposób automatycznie odbudować istniejące indeksy? stosując ALTER INDEX xxxx ACTIVE musze każdy indeks wymieniać z nazwy, co przy dużej ilości jest mega uciążliwe

    OdpowiedzUsuń
    Odpowiedzi
    1. Hmm... To było tyle lat temu... Lubię Firebird, ale — niestety — nie zajmuję się nim już od dość dawna.

      Jeszcze dawniej popełniłem taki artykuł: https://firebird-pl.blogspot.com/2010/11/automatyczna-optymalizacja-indeksow.html. Witryna internetowa, którą wspomniałem w tym artykule, też już od dawna nie istnieje. W swoim archiwum znalazłem tę procedurę, o której pisałem w tym artykule. Można ją pobrać z https://drive.google.com/file/d/1HbC798_wjLcGUKixfzK2AVnlpyESQtB2/view?usp=sharing.

      Tę procedurę testowałem w Firebird 2.5. Przypuszczam, że w nowszych wersjach Firebird też będzie działać.

      Możliwe, że w nowszych wersjach Firebird dałoby się to zrobić lepiej.

      Usuń