1

我有两张桌子。第一个表 ( 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 在这里使用索引。可能吗?

4

0 回答 0