Разница в производительности между вставкой и вставкой, где не существует - PullRequest
0 голосов
/ 05 мая 2019

Я знаю, что лучше использовать INSERT, ГДЕ НЕ СУЩЕСТВУЕТ, чем INSERT, так как это приводит к дублированию записей или проблемам нарушения уникального ключа. Но с точки зрения производительности, это создаст какую-то большую разницу?

INSERT WHERE NOT EXISTS внутренне вызовет дополнительный оператор SELECT, чтобы проверить, существует запись или нет. В случае больших таблиц, что рекомендуется использовать INSERT vs INSERT, ГДЕ НЕ ВЫХОДИТ? И кто-то, пожалуйста, объясните разницу в стоимости исполнения между ними.

Ответы [ 3 ]

0 голосов
/ 05 мая 2019

Дело не в том, «что быстрее», а в том, «что правильно».

Когда вы INSERT попадаете в таблицу (без каких-либо ограничений), вы просто добавляете записи в эту таблицу.Если существующая идентичная запись уже была там, это приведет к тому, что теперь будет две такие записи.Это может быть хорошо, или это может быть проблемой в зависимости от ваших потребностей (**).

Когда вы добавляете WHERE NOT EXISTS() к вашей конструкции INSERT, система будет добавлять только записи в таблицу, которая не 'пока нет, что позволяет избежать ситуации с несколькими идентичными записями.

(**: предположим, что у вас есть ограничение уникального или первичного ключа для целевой таблицы, тогда INSERT дублирующейся записи приведет кошибка нарушения UQ / PK. IF Ваш вопрос был: «Что быстрее: попробуйте вставить строку, и если есть такая ошибка, просто проигнорируйте ее вместо попытки вставить, где не существует (), и избегайте ошибки«тогда я не могу дать вам окончательный ответ, но я вполне уверен, что это будет близкий вызов. Однако я могу сказать, что подход WHERE NOT EXISTS () будет выглядеть намного лучше в коде и (что важно!) это также будет работать для операций, основанных на множествах, подход try / catch не удастся для всего набора, даже если только 1 запись вызывает проблему.)

0 голосов
/ 30 мая 2019

INSERT будет проверять вставленные данные на предмет любых существующих ограничений схемы, PK, FK, уникальных индексов, а не нулевых значений и любых других пользовательских ограничений - в зависимости от требований схемы таблицы.Если эти проверки в порядке, строка будет вставлена ​​и зациклена на следующей строке.

ВСТАВИТЬ, ЧТО НЕ СУЩЕСТВУЕТ, до проверки выше проверяет данные всех столбцов строки на соответствие данных всех строкстола.Даже если 1 столбец отличается, это нормально, и тогда он будет двигаться точно так же, как INSERT выше.

Влияние на производительность в основном зависит от: 1. количества существующих строк в таблице 2. размера строки

Таким образом, по мере увеличения таблицы, за которой следует увеличение размера строки, разница увеличивается.

0 голосов
/ 05 мая 2019

Большинство запросов предложения Oracle IN содержат ряд литеральных значений, и когда таблица присутствует, стандартное объединение лучше.В большинстве случаев оптимизатор Oracle на основе затрат создаст идентичный план выполнения для IN против EXISTS, поэтому нет никакой разницы в производительности запросов.

Ключевое слово Exists оценивает true или false, но ключевое слово IN будет сравнивать всезначения в соответствующем столбце подзапроса.Если вы используете оператор IN, механизм SQL будет сканировать все записи, извлеченные из внутреннего запроса.С другой стороны, если мы используем EXISTS, движок SQL остановит процесс сканирования, как только найдет совпадение.

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

Предложение EXISTS намного быстрее, чем IN, когда результаты подзапроса очень велики.И наоборот, предложение IN быстрее, чем EXISTS, когда результаты подзапроса очень малы.

Кроме того, предложение IN не может сравнивать что-либо со значениями NULL, но предложение EXISTS может сравнивать все с NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...