Я получил немного вопроса о производительности подзапроса / присоединяющийся к другой таблице
INSERT
INTO Original.Person
(
PID, Name, Surname, SID
)
(
SELECT ma.PID_new , TBL.Name , ma.Surname, TBL.SID
FROM Copy.Person TBL , original.MATabelle MA
WHERE TBL.PID = p_PID_old
AND TBL.PID = MA.PID_old
);
Это - мой SQL, теперь эта вещь обтекает 1 миллион раз или больше. Мой вопрос - то, что было бы быстрее?
TBL.SID
к (Select new from helptable where old = tbl.sid
) ИЛИ
from
и сделайте участие where
?edit1
Ну, этот сценарий работает только так же как туда r люди.
Моя программа имеет 2 тех модулей, которые заполняют MaTabelle
и тот, который передает данные. Эта программа действительно объединяет 2 базы данных вместе и из-за этого, иногда тот же Ключ используется.
Теперь я работаю над решением, которые не делают Дубликаты ключа, существует.
Мое решение состоит в том, чтобы сделать 'HelpTable'. Владелец ключа (SID
) генерирует новый ключ и пишет это в 'HelpTable'. Все другие таблицы, которые используют этот ключ, могут считать его из 'HelpTable'.
edit2
Просто получил что-то в моем уме:
если таблица как Ключ, который может быть пустым (foreignkey, который не связан) затем это не будет работать с от или?
Современные RDBM, включая Oracle, оптимизируют большинство объединений и подзапросов до одного и того же плана выполнения.
Поэтому я хотел бы написать ваш запрос наиболее простым для вас способом и сосредоточиться на том, чтобы вы полностью оптимизировали свои индексы.
Если вы предоставите окончательный запрос и схему своей базы данных, мы сможем предложить подробные предложения, включая информацию о потенциальных проблемах с блокировкой.
Редактировать
Вот несколько общих советов, которые применимы к вашему запросу:
Вместо того, чтобы сосредоточиться на том, следует ли использовать соединение или подзапрос, я бы сосредоточился на необходимости выполнения 1 000 000 выполнений этого конкретного оператора вставки. Тем более, что оптимизатор Oracle - как уже указывал Маркус Адамс - оптимизирует и перепишет ваши операторы под прикрытием в наиболее оптимальную форму.
Вы заполняете MaTabelle 1 000 000 раз всего несколькими строками и выдаете это утверждение? Если да, то ответ - сделать это одним выстрелом. Не могли бы вы предоставить дополнительную информацию о вашем процессе, который столько раз выполняет этот оператор?
РЕДАКТИРОВАТЬ: вы указываете, что этот оператор вставки выполняется для каждого человека. В этом случае советуем сначала заполнить MATabelle, а затем выполнить один раз:
INSERT
INTO Original.Person
(
PID, Name, Surname, SID
)
(
SELECT ma.PID_new , TBL.Name , ma.Surname, TBL.SID
FROM Copy.Person TBL , original.MATabelle MA
WHERE TBL.PID = MA.PID_old
);
С уважением, Роб.
Основное различие между подзапросом и соединением заключается в подзапрос выполняется быстрее, когда нам нужно получить данные из большого количества таблиц, потому что становится утомительно присоединяться к большему количеству таблиц. join быстрее извлекает данные из базы данных, когда у нас меньше таблиц.
Кроме того, этот присоединяется к подзапросу может дать вам дополнительную информацию