私の仕事では、現在、ip_startとip_endの2つのVarbinary(16)列にインデックスを持つ5,000万行のテーブルがあります。SQL Server varbinaryクラスタリングされたインデックスルックアップが特定の範囲で遅い
PRIMARY KEY CLUSTERED
(
[ip_end] ASC,
[ip_start] ASC
)
テーブル内の最初の数行は、このようなものです:
ip_start ip_end id
0x00000000 0x00000000 0
0x00000001 0x000000FF 1
0x00000100 0x00FFFFFF 2
0x01000000 0x010000FF 3
我々は一致を検索するために使用するクエリは次のとおりです。
SELECT TOP 1 id
FROM dbo.ip_ranges WITH (NOLOCK)
WHERE @lookup <= ip_end AND @lookup >= ip_start
私はそれを返す0x00000002
ようなIPを検索する場合id 1を即座に返しますが、0x000000000000001
のような範囲の範囲を検索すると、NULLを返すのに数秒かかります。 SQL Serverはvarbinaryインデックスが注文されていることを理解してはならないため、一致するものがない場合はすぐに返されますか?
いくつかのIPが範囲間にあるか、またはミスがそのような大きなヒットを引き起こさないようにテーブルをインデックスするより良い方法であることを期待してこれをクエリするより良い方法はありますか?