Mam zamiar stworzyć tabelę z dwoma polami - IDjako BIGINTi IPAddressjako albo varchar(45)albo varbinary(16). Chodzi o to, aby przechowywać wszystkie unikalne adresy IP i IDzamiast tego używać referencji IP addressw innych tabelach.
Zasadniczo zamierzam utworzyć procedurę składowaną, która zwraca wartość IDdla podanego IP addresslub (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 CLRfunkcje do przekształcania bajtów adresu IP na ciąg znaków i odwrotnie, więc transformacja nie stanowi problemu (praca z oboma IPv4i IPv6).
Myślę, że muszę utworzyć indeks, aby zoptymalizować wyszukiwanie, ale nie jestem pewien, czy powinienem dołączyć IP addresspole do indeksu klastrowanego, czy utworzyć osobny indeks i przy jakim typie wyszukiwanie będzie szybsze?
IPv4, chyba zmieniłbym adres INTi używał pola jako klucza indeksu. Ale ponieważ IPv6muszę użyć dwóch BIGINTpól i wolę przechowywać wartość w jednym polu - wydaje mi się to bardziej naturalne.