我有两张桌子:让我们称他们为d
和r
。我想查找表d.domain
中dns
字段的有效左锚定子字符串r
的数量。我没有索引,r
有10亿行,而d
有9千万行。我该如何编写查询?
PostgreSQL版本是9.3。
答案 0 :(得分:1)
SELECT count(DISTINCT d.domain)
FROM d
WHERE EXISTS (
SELECT 1
FROM r
WHERE r.domain LIKE '%' || d.domain
);
EXISTS有可能比JOIN更快,因为它是半连接。
我会在d.domain上创建一个b-tree索引,看看是否有一个松散的索引扫描有助于比DISTINCT更快地获取不同的域。见https://wiki.postgresql.org/wiki/Loose_indexscan
另请参阅https://wiki.postgresql.org/wiki/Reverse_string有可能加快后缀模式匹配。
答案 1 :(得分:0)
SELECT
dd.domain,
COUNT(r.dns)
FROM d AS dd
JOIN r AS rr
ON rr.dns LIKE '%' + dd.domain
GROUP BY dd.domain