Je vais créer une table avec deux champs - ID
comme BIGINT
et IPAddress
comme varchar(45)
ou varbinary(16)
. L'idée est de stocker toutes les adresses IP uniques et d'utiliser une référence à la ID
place de la réelle IP address
dans d'autres tableaux.
Généralement, je vais créer une procédure stockée qui renvoie le ID
pour donné IP address
ou (si l'adresse n'a pas été trouvée) insérer l'adresse et renvoyer le généré ID
.
Je m'attends à avoir de nombreux enregistrements (je ne peux pas dire exactement combien), mais j'ai besoin que la procédure stockée ci-dessus soit exécutée le plus rapidement possible. Donc, je me demande comment stocker l'adresse IP réelle - au format texte ou octets. Qu'est-ce qui va être mieux?
J'ai déjà écrit des SQL CLR
fonctions pour transformer les octets d'adresse IP en chaîne et inversement, donc la transformation n'est pas un problème (travailler avec les deux IPv4
et IPv6
).
Je suppose que je dois créer un index pour optimiser la recherche, mais je ne suis pas sûr de devoir inclure le IP address
champ à l'index clusterisé, ou de créer un index séparé et avec quel type la recherche sera plus rapide?
IPv4
je suppose que je convertirais l'adresse INT
et utiliserais le champ comme clé d'index. Mais car IPv6
j'ai besoin d'utiliser deux BIGINT
champs et je préfère stocker la valeur dans un champ - me semble plus naturel.