Я собираюсь создать таблицу с двумя полями - 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поля, и я предпочитаю хранить значение в одном поле - мне кажется более естественным.