Ich werde eine Tabelle mit zwei Feldern erstellen - ID
als BIGINT
und IPAddress
als entweder varchar(45)
oder varbinary(16)
. Die Idee ist, alle eindeutigen IP-Adressen zu speichern und ID
stattdessen eine Referenz zu verwenden, die IP address
in anderen Tabellen tatsächlich ist .
Im Allgemeinen werde ich eine gespeicherte Prozedur erstellen, die die ID
angegebene zurückgibt IP address
oder (falls die Adresse nicht gefunden wurde) die Adresse einfügt und die generierte zurückgibt ID
.
Ich erwarte viele Datensätze (ich kann nicht genau sagen, wie viele), aber ich muss die oben gespeicherte Prozedur so schnell wie möglich ausführen. Ich frage mich also, wie ich die tatsächliche IP-Adresse speichern soll - im Text- oder Byte-Format. Welches wird besser?
Ich habe bereits SQL CLR
Funktionen zum Transformieren von IP-Adressbytes in Zeichenfolgen und umgekehrt geschrieben, sodass die Transformation kein Problem darstellt (Arbeiten mit beiden IPv4
und IPv6
).
Ich denke, ich muss einen Index erstellen, um die Suche zu optimieren, aber ich bin nicht sicher, ob ich das IP address
Feld in den Clustered-Index aufnehmen oder einen separaten Index erstellen soll und mit welchem Typ die Suche schneller sein wird.
IPv4
wäre, würde ich die Adresse in konvertieren INT
und das Feld als Indexschlüssel verwenden. Aber denn IPv6
ich muss zwei BIGINT
Felder verwenden und ich bevorzuge es, den Wert in einem Feld zu speichern - scheint mir natürlicher.