替换为大型数据集上的左连接

时间:2010-07-13 04:29:19

标签: sql postgresql

如果我需要在两个表之间进行左连接(为了在它们之间运行某种分析),但是两个数据集都太大而无法在单个查询中执行,那么实现这一目的的最佳实践是什么?

我在文档中看到了FETCH,但不确定这是否通常用于遍历整个数据集。因为我认为这个任务必须是司空见惯的,所以我不会为了完成我的分析而试图不正当地大杂化FETCH或OFFSET。

注意:这是一个本地数据库,在整个过程中不会被更改 - 因此性能考虑和事务不是一个因素。

我正在使用PostgreSQL,但我确信所有现代DBMS的实践都相似。

1 个答案:

答案 0 :(得分:2)

我同意现代DBMS应该能够加入他们可以存储的任何表的评论。有时您必须告诉数据库不要在巨大的表上尝试散列连接;散列连接非常快,但不适用于散列不适合内存的连接。对于PostreSQL,您可以使用以下命令禁用散列连接:

SET ENABLE_HASHJOIN TO FALSE

话虽如此,如果您以较小的批次拆分查询,某些数据库的效果会更好。您可以使用子查询批量分区连接:

select  *
from    (
        select  *
        from    YourTable1
        where   CustomerName like 'A%'
        ) a
left join 
        (
        select  *
        from    YourTable2
        where   CustomerName like 'A%'
        ) b
on      a.CustumerName = b.CustomerName

如果有一种有效的过滤方式,这只会对数据库有所帮助。在该示例中,这将是两个表中CustomerName的索引。