正确的说法是“SELECT count(dinstinct d.domain)WHERE r.rdns LIKE'%'| r.rdns”?

时间:2015-05-06 21:21:40

标签: postgresql

我有两张桌子:让我们称他们为dr。我想查找表d.domaindns字段的有效左锚定子字符串r的数量。我没有索引,r有10亿行,而d有9千万行。我该如何编写查询?

PostgreSQL版本是9.3。

2 个答案:

答案 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