如何在一个非常大的表中有效地选择

Posted

技术标签:

【中文标题】如何在一个非常大的表中有效地选择【英文标题】:How to select efficiently in a very large table 【发布时间】:2014-08-07 08:27:34 【问题描述】:

该表包含大约 3 亿行。我需要根据两列选择这些行。

SELECT * 
FROM table_1 
WHERE column_1 
IN (SELECT column FROM table_2) 
AND column_2 
IN (SELECT column FROM table_2)

table_1 有 3 亿行。 table_2 有 100 万个不同的行。

我也使用了 exists 方法:

SELECT * 
FROM table_1 
WHERE EXISTS (
SELECT 1 
FROM table_2 
WHERE column=table_1.column_1) 
AND EXISTS (
SELECT 1 
FROM table_2 
WHERE column=table_1.column_2)

但是太慢了。我在 table_1 中的两列和 table_2 中的列上创建了索引。在 12G RAM 戴尔服务器上需要两个多小时。

有没有更好的方法来处理这么大的桌子? Hadoop 能解决这个问题吗?

【问题讨论】:

发布查询的explain。 postgresql.org/docs/current/static/sql-explain.html 【参考方案1】:

使用这个:

SELECT * 
FROM table_1 
INNER JOIN
    (SELECT DISTINCT column FROM table_2) tab2_1
        ON colum_1 = tab2_1.column 
INNER JOIN
    (SELECT DISTINCT column FROM table_2) tab2_2
        ON colum_2 = tab2_2.column

希望对你有帮助

【讨论】:

我知道这个方法。我搜索了 in、exists 和 join 之间的区别。我不认为加入会更快。但我会试试的。谢谢。【参考方案2】:

有了这么大的数据库,我会在这个查询上创建一个物化视图,然后可以做一个简单的SELECT * FROM table_view

CREATE MATERIALIZED VIEW table_view AS
     SELECT * FROM table_1 
     WHERE column_1 IN (SELECT column FROM table_2) 
     AND column_2 IN (SELECT column FROM table_2);

您只需创建一个触发器即可在您从table1table2 添加或删除一行时更新此视图。

【讨论】:

以上是关于如何在一个非常大的表中有效地选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python有效地填充给定一个非常大的表的矩阵?

如何从没有数字主键的表中有效地选择随机行

使用多个 WHERE 有效地连接两个表

如何通过索引从一个非常大的列表中有效地删除元素?

如何有效地读取非常大的 gzip 压缩日志文件的最后一行?

如何在表中查找列名