该表包含大约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可以解决这个问题吗?
答案 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);
每当您添加或删除table1
或table2
中的行时,您只需创建一个TRIGGER即可更新此视图。