Mam stolik, który zawiera bardzo podstawowe informacje. Tylko tytuł i kilka pól daty. Jest jedno pole zwane komentarzami, które jest varchar (4000). Zazwyczaj pozostawiamy je puste, ale czasami wprowadzimy tutaj dużą ilość danych. Czy to naprawdę zły projekt? Czy jest to tylko trochę nieefektywne?
Zakładam, że utworzenie oddzielnej tabeli dla tej kolumny byłoby lepsze.
Uwaga: jest to serwer SQL 2008
SPARSE
a nie używającSPARSE
...Odpowiedzi:
Aby uzyskać bardziej przewidywalną wydajność (i aby uniknąć dużej zmienności wierszy na stronę), skłaniałbym się do przechowywania tych danych w powiązanej tabeli - szczególnie jeśli jest on zapełniany tylko przez niewielki procent czasu, a zwłaszcza jeśli jest on pobierany tylko w niektóre zapytania. Wiersze, w których ta wartość jest
NULL
, przyczyniają się do narzutu miejsca, ale jest to minimalne. Ważniejsze będzie to, w jaki sposób jedna strona może zmieścić tylko dwa wiersze, a następna strona może zmieścić 500 wierszy - może to naprawdę wpłynąć na statystyki i lepiej jest podzielić to, aby było przechowywane osobno i nie wpłynęło na wszystkie operacje na rdzeń stołu.źródło
Nieużywany zajmuje minimalną przestrzeń
Koszty ogólne są minimalne, a optymalizacja będzie przedwczesna.
Dopóki nie dowiesz się, że masz problem, po prostu trzymaj go w jednym stole. Łamiesz KISS, wprowadzając sprzężenia zewnętrzne i dodajesz narzut w zapytaniach o dane.
Zobacz /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 dłużej
źródło
Myślę, że osobna tabela byłaby lepsza dla poprawy gęstości strony i zmniejszenia fragmentacji, szczególnie jeśli nie zawsze wypełniasz to pole.
Wszystkie te puste strony i wskaźniki prowadzą do niskiej wydajności. Znormalizuj to pole, jeśli możesz.
źródło
To pytanie wygląda bardzo podobnie: czy dodatkowe puste kolumny znacząco wpływają na rozmiar tabeli sql?
Wygląda na to, że odpowiedź brzmi tak, zajmuje miejsce, ale istnieje algorytm kompresji dla kolumn z dużą ilością wartości null.
Jeśli chodzi o projekt, myślę, że powiązanie z nim zewnętrznego stołu byłoby czystszym projektem. Posiadanie kolumny z częstymi wartościami null utrudnia użytkownikom bazy danych, ponieważ mogą przypadkowo użyć wartości null, jeśli nie są ostrożni. Dlatego kod korzystający z bazy danych musiałby zawierać sprawdzanie błędów i stamtąd robi się brzydki.
źródło
SPARSE
, a nie tylko „kolumny z dużą ilością zerowych wartości”.Nic ci nie będzie - to już kolumna varchar, więc używa miejsca tylko wtedy, gdy zawiera dane. Jeśli masz wiele zerowalnych kolumn o stałym rozmiarze, takich jak int, możesz mieć problemy z wykorzystaniem miejsca.
Jeśli chodzi o umieszczenie go w innym stole, nie zawracałbym sobie głowy. Możesz także spojrzeć na użycie varchar (max) i opcji in / out of row. Znowu, prawdopodobnie przedwcześnie.
źródło