2009-06-25 12 views

Odpowiedz

27

Nie ma znaczenia - ale czy DateTime naprawdę gwarantuje wyjątkowość? Unikałbym wstawiania indeksu klastrowanego tylko do DateTime - zamiast tego używałbym IDENTYFIKACJI INT IDENTITY lub BIGINT i umieściłem regularny indeks nieklastrowy na DateTime (ponieważ to naprawdę nie gwarantuje, że jest unikatowe ......)

Marc

PS: Like klucz podstawowy, ogólny konsensus co powinno być skupione kluczem jest:

  • wyjątkowy (w przeciwnym razie SQL Server będzie "uniquify" go przez dodanie 4- unikalny bajt)
  • jako wąskie możliwie
  • statycznej (nigdy się nie zmieniają)
  • kiedykolwiek rosnącej

kolumny (ów), które składają się na klastrowego klucza (w tym uniqueifier 4-bajtowy) są dodawane do KAŻDY WEJŚCIE W KAŻDYM indeksie nieklastrowym - więc chcesz zachować te szczupłe, jak to możliwe.

PS 2: klucze do klastrowania są dodawane do każdego indeksu nieklastrowego, ponieważ jest to sposób, w jaki program SQL Server pobierze całe wiersze po znalezieniu wartości wyszukiwania w indeksie nieklastrowanym. Jest to "lokalizacja" wiersza w bazie danych, że tak powiem. Dlatego powinien być unikalny i wąski.

+0

Więc indeks klastrowany musi być unikatowy? – Eyvind

+4

Jeśli jest to * NIE * unikatowe, SQL Server automagicznie doda czterobajtowy "unikatnik" - jeśli to możliwe, staraj się tego unikać! –

+1

Dzięki, nie wiedziałem tego. Tak więc, biorąc pod uwagę, że dana tabela ma PK będący unikalnym identyfikatorem, czy lepiej byłoby utworzyć indeks klastrowany w polu datetime ORAZ PK? – Eyvind

5

Przeczytaj ten http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx

Jeżeli odczytuje się często na podstawie pola datetime, dobrym wyborem jest kompozytem klucz nieaktualne i tożsamość - w tej kolejności (data, tożsamości).

+3

Nie mogę podkreślić, jak pomocne może być, aby Twój DateTime był pierwszym polem w złożonym kluczu klastrowym. Może nie zazębiać się z doskonałym modelem, który zawsze ma tożsamość int, ale gdy ciągle wyszukujesz, powiedzmy, wpisy w dzienniku w ciągu ostatniej godziny, problem polega na tym, że DateTime jest częścią klucza podstawowego. Zwłaszcza jeśli Twoje pole DateTime jest mniej niż w 95% selektywne (co oznacza wiele nieunikalnych wartości), to sposób, w jaki zamierzasz trafić do indeksu i uzyskać oczekiwaną wydajność. – AndyClaw

Powiązane problemy