Как найти строки в одной таблице, которые ссорятся в другой таблице

Unix имеет системный вызов 'ветвления', который 'разделяет' текущий процесс на два и дает Вам второй процесс, который идентичен первому (по модулю возврат из вызова ветвления). Так как адресное пространство нового процесса уже в порядке, это, должно быть более дешевым, чем вызов 'CreateProcess' в Windows и наличии его загружает изображение exe, связанные dlls, и т.д.

В ветвлении случаются, ОС может использовать семантику 'копии на записи' для страниц памяти, связанных с обоими новыми процессами, чтобы гарантировать, что каждый получает их собственную копию страниц, которые они впоследствии изменяют.

65
задан OMG Ponies 12 September 2009 в 16:11
поделиться

4 ответа

select tableA.id from tableA left outer join tableB on (tableA.id = tableB.id)
where tableB.id is null
order by tableA.id desc 

Если ваша база данных знает, как выполнять пересечения индексов, это коснется только индекса первичного ключа

89
ответ дан 24 November 2019 в 15:23
поделиться

Вы также можете использовать exists , поскольку иногда это быстрее, чем левое соединение . Вам нужно будет протестировать их, чтобы определить, какой из них вы хотите использовать.

select
    id
from
    tableA a
where
    not exists
    (select 1 from tableB b where b.id = a.id)

Чтобы показать, что существует может быть более эффективным, чем левое соединение , вот планы выполнения эти запросы в SQL Server 2008:

левое соединение - общая стоимость поддерева: 1.09724:

left join

существует - общая стоимость поддерева: 1.07421:

exists

32
ответ дан 24 November 2019 в 15:23
поделиться

I не могу сказать вам, какой из этих методов будет лучшим для H2 (или даже если все они будут работать), но я написал статью, в которой подробно описаны все (хорошие) методы, доступные в TSQL. Вы можете дать им шанс и посмотреть, работает ли какой-либо из них для вас:

http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=QueryBasedUponAbsenceOfData& referringTitle = Home

3
ответ дан 24 November 2019 в 15:23
поделиться

Вы должны сравнить каждый идентификатор в таблице A с каждым идентификатором в таблице B. Полнофункциональная СУБД (например, Oracle) могла бы оптимизировать это в INDEX FULL FAST SCAN и вообще не касаться таблицы. Я не знаю, настолько ли умен оптимизатор H2.

H2 действительно поддерживает синтаксис MINUS, так что вы должны попробовать это

select id from tableA
minus
select id from tableB
order by id desc

Это может работать быстрее; это, безусловно, заслуживает тестирования.

это, безусловно, заслуживает тестирования.

это, безусловно, заслуживает тестирования.

7
ответ дан 24 November 2019 в 15:23
поделиться
Другие вопросы по тегам:

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