SQL SERVER-使用BETWEEN运算符高效地连接两个表

SQL SERVER-使用BETWEEN运算符高效地连接两个表,sql,sql-server,indexing,geolocation,inner-join,Sql,Sql Server,Indexing,Geolocation,Inner Join,然而,我也看到过类似的帖子,没有得出结论性的答案 我正在使用geolite(免费数据库)查找一个ip块到一个GeoIP,我想批量这样做- 相应的IP已转换为IPBlock,并放在一张桌子(L)上 每个ipblock都在一个范围内(介于startIpNum和endIpNum之间),它位于另一个表(g)中 但是,下面的查询非常低效,特别是因为我需要在很长的时间内执行查询- SELECT l.ipAddress, g.locId FROM l INNER JOIN g ON l.ipblock BET

然而,我也看到过类似的帖子,没有得出结论性的答案

我正在使用geolite(免费数据库)查找一个ip块到一个GeoIP,我想批量这样做-

相应的IP已转换为IPBlock,并放在一张桌子(L)上

每个ipblock都在一个范围内(介于startIpNum和endIpNum之间),它位于另一个表(g)中

但是,下面的查询非常低效,特别是因为我需要在很长的时间内执行查询-

SELECT l.ipAddress, g.locId
FROM l
INNER JOIN g ON l.ipblock BETWEEN g.startIpNum AND g.endIpNum
两个表都编制了索引(g为复合索引)

无法执行哈希联接,因为该联接是在一个BETWEEN运算符上进行的


重组表g的唯一可行方案是什么?或者还有另一种方法?

单个查询的最佳索引是在
/
JOIN
子句的节点中有所有列,并且
SELECT
子句中的所有列都在叶中(如果尚未在节点中)

尝试将此索引放在表
l
上,看看性能是否有所提高:

CREATE INDEX IDX_l_ipblock ON l (ipblock) INCLUDE (ipAddress)

“复合索引”是什么意思?在什么栏目上?还有,
b.locId
来自哪里?还有为什么您认为散列连接在这里会有用?谢谢您的回复。翻译自我的母语:)我指的是复合索引,而不是复合索引。这是在startIpNum上完成的,endIpNumi刚才提到了哈希,因为我相信它在处理大量数据时会更有效,因为我正在处理大量数据。最后,b.loc是一个拼写错误,现在已经安排好了。感谢您的回答,但不幸的是,它仍然非常缓慢。我还想补充一点,ipblock是一个BIGINT,大约7-8位数字-我不能100%确定这是否会影响性能。你能计算“慢”的数量吗,即:现在需要多少秒,以及“足够好”的目标是什么?而
l
g
表有多大?l表是1800000,g表是2000000。慢意味着1天处理20分钟(10k行表l)