Unix имеет системный вызов 'ветвления', который 'разделяет' текущий процесс на два и дает Вам второй процесс, который идентичен первому (по модулю возврат из вызова ветвления). Так как адресное пространство нового процесса уже в порядке, это, должно быть более дешевым, чем вызов 'CreateProcess' в Windows и наличии его загружает изображение exe, связанные dlls, и т.д.
В ветвлении случаются, ОС может использовать семантику 'копии на записи' для страниц памяти, связанных с обоими новыми процессами, чтобы гарантировать, что каждый получает их собственную копию страниц, которые они впоследствии изменяют.
select tableA.id from tableA left outer join tableB on (tableA.id = tableB.id)
where tableB.id is null
order by tableA.id desc
Если ваша база данных знает, как выполнять пересечения индексов, это коснется только индекса первичного ключа
Вы также можете использовать exists
, поскольку иногда это быстрее, чем левое соединение
. Вам нужно будет протестировать их, чтобы определить, какой из них вы хотите использовать.
select
id
from
tableA a
where
not exists
(select 1 from tableB b where b.id = a.id)
Чтобы показать, что существует
может быть более эффективным, чем левое соединение
, вот планы выполнения эти запросы в SQL Server 2008:
левое соединение
- общая стоимость поддерева: 1.09724:
существует
- общая стоимость поддерева: 1.07421:
I не могу сказать вам, какой из этих методов будет лучшим для H2 (или даже если все они будут работать), но я написал статью, в которой подробно описаны все (хорошие) методы, доступные в TSQL. Вы можете дать им шанс и посмотреть, работает ли какой-либо из них для вас:
Вы должны сравнить каждый идентификатор в таблице A с каждым идентификатором в таблице B. Полнофункциональная СУБД (например, Oracle) могла бы оптимизировать это в INDEX FULL FAST SCAN и вообще не касаться таблицы. Я не знаю, настолько ли умен оптимизатор H2.
H2 действительно поддерживает синтаксис MINUS, так что вы должны попробовать это
select id from tableA
minus
select id from tableB
order by id desc
Это может работать быстрее; это, безусловно, заслуживает тестирования.
это, безусловно, заслуживает тестирования. это, безусловно, заслуживает тестирования.