sql: DELETE + INSERT vs UPDATE + INSERT - PullRequest
5 голосов
/ 03 июня 2010

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

У меня есть страница веб-сайта, на которой показаны некоторые данные, поступающие из базы данных, и для создания данных из этой базы данных мне нужно выполнить несколько довольно сложных запросов на множественные объединения.

Данные обновляются один раз в день (ночью).

Я бы хотел предварительно сгенерировать данные для указанного представления, чтобы ускорить доступ к странице.

Для этого я создаю таблицу, которая содержит точные данные, которые мне нужны.

Вопрос: для моей ситуации, разумно ли делать полное удаление таблицы с последующей вставкой? или мне сделать обновление, вставить?

В отношении SQL кажется, что DELETE + INSERT будет проще (часть INSERT - это одно выражение SQL).

РЕДАКТИРОВАТЬ: СУБД: MS SQL Server 2008 Ent

Ответы [ 7 ]

13 голосов
/ 03 июня 2010

TRUNCATE будет быстрее, чем удаление, поэтому, если вам нужно очистить таблицу, сделайте это вместо

Вы не указали поставщика СУБД, но некоторые из них также имеют команды MERGE / UPSERT . Это позволяет обновить таблицу, если данные существуют, и вставить, если их нет

.
1 голос
/ 03 июня 2010

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

1 голос
/ 03 июня 2010

Отчасти это зависит от того, как осуществляется доступ к данным. Если у вас есть период времени, когда к нему нет (или очень мало) пользователей, то это не окажет большого влияния на исчезновение данных (между УДАЛЕНИЕМ и завершением ВСТАВКИ) на короткое время.

0 голосов
/ 03 июня 2010

Хотя я полностью согласен с ответом SQLMenace Я хотел бы отметить, что MERGE НЕ удаляет ненужные записи! Если вы уверены, что ваши новые данные будут являться надмножеством существующих данных, то MERGE отлично, в противном случае вам нужно будет либо убедиться, что вы удалите лишние записи позже, либо использовать метод TRUNCATE + INSERT ... (Лично я все еще поклонник последнего, так как обычно он довольно быстрый, просто обязательно удалите все индексы / уникальные ограничения заранее и перестройте их один за другим. Преимущество транзакции INSERT в том, что она меньше, а индекс - добавление выполняется в (меньшие) транзакции позже). (**)

(**: да, это может быть сложно на работающей системе, но опять же он уже упомянул, что это было сделано во время какой-то ночи, в любом случае, я экстраполирую пользовательский доступ отсутствует в это время)

0 голосов
/ 03 июня 2010

Что если некоторые данные, которые присутствовали вчера, больше не существуют? Удалить может быть безопаснее, или вы все равно можете удалить некоторые записи.

И, в конце концов, не имеет значения, по какому пути вы идете. Если только по делу @kevinw не упомянуто

0 голосов
/ 03 июня 2010

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

0 голосов
/ 03 июня 2010

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

Есть ли у вас возможность MERGE / UPSERT? Если вы используете MS-SQL, вы можете использовать CROSS APPLY, чтобы сделать нечто подобное, если вы этого не сделаете.

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