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

时间:2014-08-07 08:27:35

标签: sql postgresql

该表包含大约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万个不同的行。

我还使用 存在 方法:

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可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

使用它:

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

希望这会对你有所帮助

答案 1 :(得分:0)

有了这么大的数据库,我会在这个查询上创建一个物化视图,然后可以做一个简单的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中的行时,您只需创建一个TRIGGER即可更新此视图。