Соединения с альтернативой влево на больших наборах данных - PullRequest
1 голос
/ 13 июля 2010

Если мне нужно было выполнить левое соединение между двумя таблицами (для того, чтобы провести какой-то анализ между ними), но оба набора данных слишком велики для того, чтобы это могло быть выполнено в одном запросе, какова лучшая практика для этого??

Я видел FETCH в документации, но не был уверен, что это обычно используется для циклического перебора целых наборов данных.Поскольку я полагал, что это задание должно быть обычным делом, я не собирался убивать себя, пытаясь неправильно подбирать FETCH или OFFSET, чтобы выполнить мой анализ.

Примечание. Это локальная база данных, и она не будетизменено в течение всей процедуры - поэтому соображения производительности и транзакции не являются фактором.

Я использую PostgreSQL, но я уверен, что практика одинакова во всех современных СУБД.

1 Ответ

2 голосов
/ 13 июля 2010

Я согласен с комментариями о том, что современные СУБД должны иметь возможность присоединяться к любой таблице, которую они могут хранить. Иногда вы должны указать базе данных не пытаться использовать хеш-соединение для гигантских таблиц; хэш-соединения очень быстрые, но не для соединений, где хэш не умещается в памяти. Для 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 в обеих таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...