2010-11-13 10 views
10

Jestem prawie pewien, że nie da się tego zrobić w Oracle, ale chciałbym, aby okazało się, że jest to niewłaściwe ...Czy dowolne bazy danych umożliwiają jednoczesne tworzenie wielu indeksów z tej samej tabeli?

Powiedz, że mam ogromną tabelę z wieloma kolumnami i chcę utworzyć indeksy kilkanaście kolumn. Korzystając z Oracle, odpalałem kilka następujących po sobie instrukcji i wychodziłem i gotowałem czajnik.

Każdy obiekt create index musi przeskanować każdy wiersz w tabeli, aby utworzyć indeks.

tj. 10 indeksów = 10 pełnych skanów.

Można by pomyśleć, że oczywistą optymalizacją byłoby jednorazowe zeskanowanie tabeli i jednoczesne indeksowanie 10 kolumn. Czy nie?

create indexes on mytable (
    ix_mytable_cola (cola), 
    ix_mytable_colb (colb), 
    ix_mytable_colc (colc) 
); 

Tak oczywiste, że musi istnieć doskonały powód, dla którego go nie ma.

Wszelkie pomysły?

Mogłem odpalać każdy create index jednocześnie w oddzielnych sesjach i mam nadzieję, że pamięć podręczna bufora bazy danych została zapisana w dniu, ale wydaje się być długim ujęciem.

EDIT

nie dostać ostateczną odpowiedź, więc to samo pytanie na Oracle-L:

http://www.freelists.org/post/oracle-l/Creating-multiple-indexes

Ogólny konsensus było to, że nie jest dostępny, ale będzie może być użyteczną funkcją. Najbardziej użyteczną odpowiedzią był David Aldridge, który zasugerował, że jeśli wszystkie instrukcje indeksu create zostałyby uruchomione w tym samym czasie, to Oracle "postąpiłby słusznie".

+0

Nie widziałem żadnej bazy danych, który obsługuje to. Może dlatego, że założyli, że indeksy zostaną utworzone z góry, gdzie nie byłoby to problemem, a nie, gdy tabela ma kilka GB danych ;-) –

+4

Nigdy nie korzystałem z Oracle, więc prawdopodobnie nie będzie to miało znaczenia. W każdym razie nie możesz utworzyć nowej pustej tabeli o tej samej strukturze i wymaganych indeksach, a następnie wypełnić ją z oryginału? To może, ale nie musi, zrobić to, o co prosisz, a to oczywiście podwoi zapotrzebowanie na dysk tymczasowo. Nadal może zadziałać :) – noodl

+1

Jeśli dobrze rozumiem, chciałbyś dynamicznie tworzyć indeksy, ale z jakiego powodu nie możesz wcześniej mieć indeksów? – Leonid

Odpowiedz

1

Odpowiedź brzmi: nie dla Oracle i zgodnie z moimi badaniami nie jest również dla DB2. Wątpię, by inni mieli tę funkcję.

4

Nie wierzę, że jest to możliwe w Oracle lub innym systemie DBMS. Jednak w Oracle można przyspieszyć tworzenie indeksu za pomocą opcji takich jak PARALLEL i NOLOGGING.

PARALLEL umożliwia równoległe przetwarzanie na N innych CPUS.

NOLOGGING nie pisze do dziennika powtórzenia (które może nie być dla Ciebie).

CREATE INDEX some_idx 
    ON a_table(col1, col2, col3) 
PARALLEL 3 
NOLOGGING; 
+0

Dzięki za odpowiedź - tak, wiele sposobów, aby przyspieszyć tworzenie indeksu, o którym wspomniałeś kilka osób. –

0

W tym przykładzie masz wiele indeksów jednokolumnowych, więc poniższe sugestie nie mają tutaj zastosowania. Ale chciałem to wskazać, ponieważ jest to przykład, jak zmniejszyć czas tworzenia indeksu w niektórych przypadkach.

Gdy wiersze tabeli są fizycznie sortowane w tej samej kolejności, co tworzony indeks, możesz określić opcję "NOSORT" w swojej instrukcji tworzenia indeksu. W ten sposób Oracle nie musi sortować wierszy podczas tworzenia indeksu (co jest zabójcze, gdy sortowanie rozleje się na dysk).

Jest to zazwyczaj przydatne, gdy tworzysz pustą tabelę (lub CTAS), wstawiaj wiersze w określonej kolejności (wymuszane przez zamówienie), a następnie bezpośrednio utwórz indeks, używając tej samej kolejności kolumn, co zamówienie złożone przez instrukcję.

Powiązane problemy