【发布时间】:2017-10-26 21:04:23
【问题描述】:
在我的工作中,我们目前有一个包含 5000 万行的表,该表在 ip_start 和 ip_end 两个 Varbinary(16) 列上有一个索引。
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 会在范围之间,或者有更好的方法来索引表,这样未命中就不会造成如此大的命中?
【问题讨论】:
标签: sql sql-server indexing varbinary