我有两张桌子。第一个表 ( events
) 如下所示:
id int8
timestamp datetime
ip cidr
我有第二个表 ( networks
),如下所示:
id int8
network cidr
name text
在第一个表中,ip
是一个 IP 地址(例如,日志文件中的传入网络连接的 IP 地址)。在第二个表中,network
表示 IP 地址范围(例如,ISP 的 IP 块)。
我想加入这些表,以便我可以networks.name
检索events
. 我的 SQL 如下所示:
select
e.ip
n.name
from
events e
inner join networks n on e.ip <<= n.network
limit 1000
但是,这非常慢(每返回行>1 秒)。我在 上定义了一个唯一的 BTREE 索引networks.network
,但这似乎没有什么区别。两个表都包含 >10M 的记录。我(不幸的是)正在运行 Postgres 9.6.12。
有没有一种有效的方法来计算这个?在我看来,瓶颈在于 上的“包含在或等于”操作上JOIN
,但目前尚不清楚如何让 Postgres 在这里使用索引。可能吗?