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