Как эффективно удалить строки из таблицы Postgresql 8.1?

Согласно этому ответу, полученному на репо rhea github:

https://github.com/amqp/rhea/issues/200#issuecomment-469220880

Фильтр должен быть описанным значением. Попробуйте что-то вроде этого:

blockquote>
connection.open_receiver({
    source: {
        address: 'amq.match',
        filter: {
            'foo': amqp_types.wrap_described({
                'nat': 'it',
                'prod': 'a22',
                'x-match': 'all'
            }, 0x468C00000002)
        }
    }
});

где:

var amqp_types = require('rhea').types;

Это работает только с Qpid cpp, оно не работает с ActiveMQ и Qpid java.

6
задан Quassnoi 22 April 2009 в 20:16
поделиться

4 ответа

Не угадывайте, измеряйте. Попробуйте различные методы и посмотрите, какой из них самый короткий для выполнения. Также, используйте EXPLAIN , чтобы узнать, что будет делать PostgreSQL, и посмотрите, где вы можете оптимизировать. Очень немногие пользователи PostgreSQL могут правильно угадать самый быстрый запрос ...

10
ответ дан 8 December 2019 в 12:22
поделиться

Мне интересно, работает ли следующее и является ли оно более эффективным?

    DELETE
    FROM    Employees e
    USING   EmployeesToDelete ed
    WHERE   id = ed.employee_id;

Это полностью зависит от вашей селективности по индексу.

PostgreSQL имеет тенденцию использовать MERGE IN JOIN для предикатов IN , который имеет стабильное время выполнения.

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

Для упорядоченного набора результатов требуется либо операция сортировки или индекс. Полный обход индекса очень неэффективен в PostgreSQL по сравнению с SEQ SCAN .

Предикат JOIN , с другой стороны, может выиграть от использования NESTED LOOPS , если ваш индекс очень избирателен, и использование HASH JOIN является инсективным.

7
ответ дан 8 December 2019 в 12:22
поделиться

Почему вы не можете сначала удалить строки вместо их добавления в таблицу EmployeesToDelete ?

Или, если вам нужно отменить, просто добавьте Флаг «удален» для Сотрудников , так что вы можете отменить удаление или сделать его постоянным, все в одной таблице?

0
ответ дан 8 December 2019 в 12:22
поделиться

Я не уверен в синтаксисе DELETE FROM ... USING , но, как правило, подзапрос должен логически совпадать с INNER JOIN в любом случае. Оптимизатор запросов к базе данных должен быть способен (и это только предположение) выполнять один и тот же план запросов для обоих.

2
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: