Muszę przechowywać tablicę bitów dla każdego rekordu tabeli, obsługując następujące operacje:
Testowanie, czy bit jest ustawiony, i ustawianie bitu (za pomocą SQL)
Zapytanie i ustawienie wartości za pomocą ADO 2.8 (nie ADO.NET)
Indeksowanie (w celu skorzystania z funkcji „indeksu obejmującego”)
Maksymalna liczba bitów przechowywanych w tej tablicy jest stała, ale może przekraczać 32 . Oznacza to, że prosta kolumna int nie zawsze działa.
Z tego, co widziałem do tej pory, moje opcje to:
- Użyj kilku kolumn int
- Użyj biginta (działa, dopóki liczba bitów wynosi <= 64)
- Użyj binarnego
- ?
Pierwsza opcja działałaby, ale wymaga sporo refaktoryzacji w kodzie, który uzyskuje dostęp do danych. Druga opcja to tylko tymczasowa ulga, a do tej pory nie jestem pewien, czy ADO działa tak dobrze z bigintem . Nie mam doświadczenia z binarnymi i nie znam innych opcji.
Jaki typ danych wybierzesz, biorąc pod uwagę wymagania?
Jeśli wszystko, co musisz zapisać, to umiarkowana liczba wartości prawda / fałsz, możesz użyć
bit
typu danych.Wewnętrznie SQL Server przechowuje
bit
kolumny spakowane w bajtowe „porcje”. Tak więc dla maksymalnie 8bit
kolumn w tabeli SQL przechowuje to jako spakowany 1 bajt; 9-16bit
kolumn w 2 bajtach i tak dalej.Nie brzmi to tak, jakbyś zbliżał się do limitu kolumny, więc wydaje się to dość proste. Oczywiście utrzymywanie ich w dobrym stanie pozwala na nazwanie kolumn w celu zapewnienia czytelności i uzyskanie wszystkich możliwości indeksowania, jakie normalnie byś zrobił (jeśli flagi są wysoce selektywne, przefiltrowane indeksy mogą być przydatne, jeśli możesz kierować reklamy na 2008+).
Samodzielne pakowanie bitów znacznie bardziej skomplikuje indeksowanie (prawdopodobnie
bit
kolumny obliczane i indeksowane do reprezentowania każdej pozycji maski ... ale wtedy masz gorsze wyniki niż używaniebit
bezpośrednio).źródło