2008-12-08 13 views
7

w komentarzu czytamWkładka luzem z lub bez indeksu

Podobnie jak marginesie, to czasami szybciej spadać indeksy tabeli i odtworzyć je po operacji wstawiania luzem.

Czy to prawda? W jakich okolicznościach?

Odpowiedz

7

Podobnie jak w przypadku Joela, powtórzę stwierdzenie, że tak, może to być prawda. Odkryłem, że kluczem do zidentyfikowania scenariusza, o którym wspomniał, jest rozmieszczenie danych i rozmiar indeksu (indeksów), które posiadasz w konkretnej tabeli.

W aplikacji, której używałem do obsługi zwykłego importu zbiorczego 1,8 miliona wierszy, z 4 indeksami w tabeli, 1 z 11 kolumnami i łącznie z 90 kolumnami w tabeli. Importowanie za pomocą indeksów zajęło ponad 20 godzin. Upuszczenie indeksów, wstawienie i ponowne utworzenie indeksów zajęło tylko 1 godzinę i 25 minut.

Może to być duża pomoc, ale wiele z nich sprowadza się do danych, indeksów i rozkładu wartości danych.

+0

Wydaje mi się, że w naszym przypadku duża część tego polegała na tym, że zawsze zaczynaliśmy od pustej tabeli, a dane masowe przychodziły w kolejności klastrów. Dlatego niewiele się dzieje. –

+0

Ach tak, to byłaby dobra część tego. Zawsze zaczynaliśmy od pustego stołu, ale dane wejściowe były wszędzie! –

6

Tak, to prawda. Gdy podczas wstawiania znajdują się indeksy na stole, serwer będzie musiał stale zamawiać/stronicować tabelę, aby indeksy były aktualne. Jeśli upuścisz indeksy, może po prostu dodać wiersze, nie martwiąc się o to, a następnie skompilować indeksy naraz, kiedy je ponownie utworzysz.


Wyjątkiem jest oczywiście sytuacja, gdy dane importu są już w kolejności indeksowej. Powinienem zauważyć, że pracuję teraz nad projektem, w którym zaobserwowano ten przeciwny skutek. Chcieliśmy zmniejszyć czas uruchamiania dużego importu (nightly dump z systemu mainframe). Próbowaliśmy usunąć indeksy, zaimportować dane i ponownie je utworzyć. To faktycznie znacznie wzrosła czas na zakończenie importu. Ale nie jest to typowe. Po prostu pokazuje, że zawsze powinieneś najpierw przetestować swój system.

+0

Czy wstawienie nowych danych do tabeli tymczasowej, a następnie zrobienie czegoś takiego jak INSERT INTO TABLE x (SELECT * FROM y) byłoby wykonalną alternatywą? W zależności od DB, może to być związane z pewną optymalizacją indeksów - lub może jestem odejść od znaku –

+0

Nie, ponieważ wtedy robisz dwie wstawki. Oczywiście twoja sytuacja może się różnić, ale ogólnie to nie pomoże. –

+0

Fajnie - to była tylko myśl. –

2

Jedną z rzeczy, którą należy wziąć pod uwagę przy upuszczaniu i odtwarzaniu indeksów, jest to, że powinno się to odbywać tylko w przypadku zautomatyzowanych procesów uruchamianych w okresach wolumenu użytkowania bazy danych. Podczas upuszczania indeksu nie można go używać do innych kwerend, które inni użytkownicy mogą jednocześnie kontrolować. Jeśli zrobisz to w godzinach produkcji, użytkownicy prawdopodobnie zaczną narzekać na przekroczenie limitu czasu.

Powiązane problemy