如何在一个非常大的表中有效地选择
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);
您只需创建一个触发器即可在您从table1
或table2
添加或删除一行时更新此视图。
【讨论】:
以上是关于如何在一个非常大的表中有效地选择的主要内容,如果未能解决你的问题,请参考以下文章