Vou criar uma tabela com dois campos - ID
como BIGINT
e IPAddress
como ou varchar(45)
ou varbinary(16)
. A idéia é armazenar todos os endereços IP exclusivos e usar uma referência em ID
vez do real IP address
em outras tabelas.
Geralmente, eu vou criar um procedimento armazenado que está retornando o ID
dado IP address
ou (se o endereço não foi encontrado) insira o endereço e retorne o gerado ID
.
Espero ter muitos registros (não sei exatamente quantos), mas preciso que o procedimento armazenado acima seja executado o mais rápido possível. Então, eu estou querendo saber como armazenar o endereço IP real - no formato de texto ou bytes. Qual vai ser melhor?
Eu já escrevi SQL CLR
funções para transformar bytes de endereços IP em string e o inverso, portanto, a transformação não é um problema (trabalhando com ambos IPv4
e IPv6
).
Acho que preciso criar um índice para otimizar a pesquisa, mas não tenho certeza se devo incluir o IP address
campo no índice clusterizado ou criar um índice separado e com qual tipo a pesquisa será mais rápida?
IPv4
acho que eu converteria o endereço INT
e usaria o campo como chave de índice. Mas, como IPv6
preciso usar dois BIGINT
campos e prefiro armazenar o valor em um campo - me parece mais natural.