Mam zamiar stworzyć tabelę z dwoma polami - ID
jako BIGINT
i IPAddress
jako albo varchar(45)
albo varbinary(16)
. Chodzi o to, aby przechowywać wszystkie unikalne adresy IP i ID
zamiast tego używać referencji IP address
w innych tabelach.
Zasadniczo zamierzam utworzyć procedurę składowaną, która zwraca wartość ID
dla podanego IP address
lub (jeśli adres nie został znaleziony) wstawić adres i zwrócić wygenerowany ID
.
Oczekuję, że będę mieć wiele rekordów (nie mogę dokładnie powiedzieć, ile), ale potrzebuję, aby powyższa procedura przechowywana została wykonana tak szybko, jak to możliwe. Zastanawiam się więc, jak przechowywać rzeczywisty adres IP - w formacie tekstowym lub bajtowym. Które będzie lepsze?
Napisałem już SQL CLR
funkcje do przekształcania bajtów adresu IP na ciąg znaków i odwrotnie, więc transformacja nie stanowi problemu (praca z oboma IPv4
i IPv6
).
Myślę, że muszę utworzyć indeks, aby zoptymalizować wyszukiwanie, ale nie jestem pewien, czy powinienem dołączyć IP address
pole do indeksu klastrowanego, czy utworzyć osobny indeks i przy jakim typie wyszukiwanie będzie szybsze?
IPv4
, chyba zmieniłbym adres INT
i używał pola jako klucza indeksu. Ale ponieważ IPv6
muszę użyć dwóch BIGINT
pól i wolę przechowywać wartość w jednym polu - wydaje mi się to bardziej naturalne.