Производительность: подзапрос или присоединение

Я получил немного вопроса о производительности подзапроса / присоединяющийся к другой таблице

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)

ИЛИ

  • Если я добавляю 'HelpTable' к from и сделайте участие where?

edit1
Ну, этот сценарий работает только так же как туда r люди.

Моя программа имеет 2 тех модулей, которые заполняют MaTabelle и тот, который передает данные. Эта программа действительно объединяет 2 базы данных вместе и из-за этого, иногда тот же Ключ используется.
Теперь я работаю над решением, которые не делают Дубликаты ключа, существует.

Мое решение состоит в том, чтобы сделать 'HelpTable'. Владелец ключа (SID) генерирует новый ключ и пишет это в 'HelpTable'. Все другие таблицы, которые используют этот ключ, могут считать его из 'HelpTable'.

edit2
Просто получил что-то в моем уме:
если таблица как Ключ, который может быть пустым (foreignkey, который не связан) затем это не будет работать с от или?

5
задан Athafoud 12 February 2018 в 11:03
поделиться

4 ответа

Современные RDBM, включая Oracle, оптимизируют большинство объединений и подзапросов до одного и того же плана выполнения.

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

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

Редактировать

Вот несколько общих советов, которые применимы к вашему запросу:

  • Для объединений убедитесь, что у вас есть индекс для столбцов, к которым вы объединяетесь. Обязательно примените индекс к объединенным столбцам в обеих таблицах. Вы можете подумать, что вам нужен индекс только в одном направлении, но вы должны индексировать оба, поскольку иногда база данных определяет, что лучше присоединиться в противоположном направлении.
  • Для предложений WHERE убедитесь, что у вас есть индексы для столбцов, упомянутых в WHERE.
  • Для вставки большого количества строк лучше всего, если вы можете вставить их все в один запрос.
  • Для вставки в таблицу с кластеризованным индексом лучше всего, если вы вставляете с инкрементными значениями для кластеризованного индекса, чтобы новые строки добавлялись в конец данных. Это позволяет избежать перестроения индекса и часто позволяет избежать блокировок существующих записей, что может замедлить выполнение запросов SELECT к существующим строкам. В основном вставки становятся менее болезненными для других пользователей системы.
7
ответ дан 13 December 2019 в 05:31
поделиться

Объединение будет намного быстрее, чем подзапрос

3
ответ дан 13 December 2019 в 05:31
поделиться

Вместо того, чтобы сосредоточиться на том, следует ли использовать соединение или подзапрос, я бы сосредоточился на необходимости выполнения 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 
  );

С уважением, Роб.

0
ответ дан 13 December 2019 в 05:31
поделиться

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

Кроме того, этот присоединяется к подзапросу может дать вам дополнительную информацию

2
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

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