Я собираюсь создать таблицу с двумя полями - ID
как BIGINT
и IPAddress
как либо varchar(45)
или varbinary(16)
. Идея состоит в том, чтобы сохранить все уникальные IP-адреса и использовать ссылку ID
вместо фактической IP address
в других таблицах.
Как правило, я собираюсь создать хранимую процедуру, которая возвращает ID
заданный IP address
или (если адрес не был найден) вставить адрес и вернуть сгенерированный ID
.
Я ожидаю иметь много записей (я не могу точно сказать, сколько), но мне нужно, чтобы хранимая процедура, описанная выше, была выполнена как можно быстрее. Итак, мне интересно, как сохранить фактический IP-адрес - в текстовом или байтовом формате. Что будет лучше?
Я уже написал SQL CLR
функции для преобразования байтов IP-адреса в строку и наоборот, поэтому преобразование не является проблемой (работа с обоими IPv4
и IPv6
).
Я думаю, мне нужно создать индекс для оптимизации поиска, но я не уверен, стоит ли включать IP address
поле в кластеризованный индекс или создавать отдельный индекс и с каким типом поиск будет быстрее?
IPv4
я думаю, я бы преобразовал адрес INT
и использовал поле в качестве ключа индекса. Но для IPv6
меня нужно использовать два BIGINT
поля, и я предпочитаю хранить значение в одном поле - мне кажется более естественным.