Pull to refresh

Comments 7

Оказывается, использование MERGE для вставки четырех строк значительно быстрее чем 4 отдельных оператора INSERT – даже в пакетном режиме

Это как то противоречит документации MS SQL:

Performance Tip: The conditional behavior described for the MERGE statement works best when the two tables have a complex mixture of matching characteristics. For example, inserting a row if it doesn't exist, or updating a row if it matches. When simply updating one table based on the rows of another table, improve the performance and scalability with basic INSERT, UPDATE, and DELETE statements

https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16

Разве?

Performance Tip: The conditional behavior described for the MERGE statement works best when the two tables have a complex mixture of matching characteristics. For example, inserting a row if it doesn't exist, or updating a row if it matches.

complex mixture of matching characteristics

То есть когда есть и совпадения и новые сроки

Я это понимаю так, что внутри сервера (например, внутри хранимой процедуры) выгоднее использовать чистый INSERT вместо MERGE. Но EF оптимизирует сетевой трафик, и он на порядки дороже по времени, чем экономия микросекунд на логике внутри сервера.

Оптимизацией сетевого трафика занялись в EF7, а MERGE использовали уже в EF6.

И кстати, в обсуждениях поста был вопрос - почему не использовали INSERT для нескольких записей, типа: "INSERT MyTable VALUES (row1c1, row1c2), (row2c1, row2c2) "

Ответ Shay Rojansky таков: "Да, такой INSERT эффективнее, однако он не гарантирует порядок возврата значений сформированных в БД идентификаторов и теряется возможность сопоставить их с переданными на добавление строками.

Постояно упоминается SQLSERVER (в том числе только его настройки), статья справедлива для SQL SERVER или для любой совместимой базы, например постгри?

Это был первый вопрос к посту. Ответ автора:

The 2nd optimization (bulk update) is indeed only for SQL Server, but the other two (the roundtrip reduction) do apply for other providers

т.е., оптимизация массового обновления реализована только в модуле Microsoft.EntityFrameworkCore.SqlServer. Оптимизации, связанные с отказом от явных транзакций, применимы и для других SQL провайдеров. А вот выполнены они реально или нет - автор не уточняет.

Sign up to leave a comment.

Articles