Bei meiner Arbeit haben wir derzeit eine Tabelle mit 50 Millionen Zeilen, die einen Index für zwei Varbinary (16) Säulen, die ip_start und ip_end sind.SQL Server varbinary gruppierten Index-Lookups langsam für bestimmte Bereiche
PRIMARY KEY CLUSTERED
(
[ip_end] ASC,
[ip_start] ASC
)
Die ersten paar Zeilen in der Tabelle sind wie folgt aus:
ip_start ip_end id
0x00000000 0x00000000 0
0x00000001 0x000000FF 1
0x00000100 0x00FFFFFF 2
0x01000000 0x010000FF 3
Die Abfrage verwenden wir Übereinstimmungen zu finden ist:
SELECT TOP 1 id
FROM dbo.ip_ranges WITH (NOLOCK)
WHERE @lookup <= ip_end AND @lookup >= ip_start
Wenn ich eine IP-Lookup wie 0x00000002
es gibt id 1 sofort, aber wenn ich für einen Bereich zu suchen, die zwischen einem Bereich wie 0x000000000000001
es einige Sekunden dauert NULL zurück. Sollte SQL Server nicht verstehen, dass der varbinary-Index geordnet ist, und daher schnell zurückkehren, wenn keine Übereinstimmungen vorhanden sind?
Gibt es einen besseren Weg, dies mit der Erwartung, abzufragen, dass einige IP-Adressen zwischen den Bereichen oder einem besseren Weg zum Indizieren der Tabelle sein wird, so dass Fehlschläge nicht einen so großen Erfolg führen?