2010-01-26 15 views
8
begin transaction; 
create table person_id(person_id integer primary key); 
insert into person_id values(1); 
... snip ... 
insert into person_id values(50000); 
commit; 

Ten kod zajmuje około 0,9 sekundy na moim komputerze i tworzy plik db zajmujący 392 KB. Liczby te wynoszą 1,4 sekundy i 864K, jeśli zmienię drugą linię naKlucz podstawowy klastrowany vs nieklastrowany

create table person_id(person_id integer nonclustered primary key); 

Dlaczego tak się dzieje?

Odpowiedz

0

[Tylko jako idea]

Może gdy podasz wyraźnie wziąć całkowitą kolumn jako klucz klastra, to właśnie to robi. Ale kiedy powiesz mu, żeby nie używał twojej kolumny całkowitej, nadal tworzy indeks za kulisami, ale wybiera inny typ danych, aby to zrobić, przypuśćmy, dwa razy tyle. Następnie każdy z tych wpisów musi odwoływać się do rekordów w tabeli, a tu masz, rozmiar eksploduje.

2

W klastrowaniu klucz podstawowy zapisuje go w wierszach; oznacza to, że zajmuje mniej miejsca (ponieważ nie ma oddzielnych bloków indeksu). Zwykle jednak jego główną zaletą jest to, że skanowanie zakresów może generalnie uzyskiwać dostęp do wierszy znajdujących się w tym samym bloku, zmniejszając operacje we/wy, co staje się raczej ważne, gdy mamy duży zestaw danych (nie 50k int).

Myślę, że 50k ints to raczej sztuczny benchmark, a nie taki, na którym ci zależy w realnym świecie.

+0

Jeśli nie planujesz robić sprzężeń, ani skanów zasięgu i tylko dbał o wydajności insert - będzie tam lepszy sposób, aby utworzyć tabela niż pierwsze przykłady? –

+0

Jeśli zależy ci tylko na wydajności wkładki, nie używaj w ogóle indeksów (jeśli są obsługiwane) lub zapisuj dane w pliku tekstowym. Dołączanie do plików tekstowych jest dość szybkie. – MarkR

0

Wylosowałem instrukcje wstawiania i ponownie wykonałem zapytanie z wartościami od jednego do pół miliona. Co ciekawe, zarówno klastrowane, jak i nie klastrowane pliki db zajmują teraz dokładną ilość miejsca (do bajtu). Jednak wstawki na klastrowej db są jeszcze szybsze.

Dla mnie jest to sprzeczne z intuicją. Kiedy mówię do klastra bazy danych te wartości - mówię do bazy danych ... te wartości lepiej być w tej kolejności, kiedy wrócę, aby je uzyskać. Kiedy nie mam specyfikacji, zasadniczo mówię do db - look przyjmij te wartości i ułóż je tak, jak chcesz - cokolwiek ułatwia ci życie.

Teoretycznie ta dodatkowa swoboda nigdy nie powinna spowalniać zapytań. Może nie przyspieszać ich przez cały czas, ale nigdy nie zwalniaj ich. Myśli?

Powiązane problemy