2010-06-03 5 views
5

Аналогичный вопрос задан, но поскольку это всегда зависит от меня, я прошу о конкретной ситуации отдельно.sql: DELETE + INSERT vs UPDATE + INSERT

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

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

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

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

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

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

EDIT: RDBMS: MS SQL Server 2008 Ent

+1

Какую базу вы используете? (DELETE и INSERT не выставляют «одно выражение SQL» в некоторых из СУБД, которые я использую.) – pilcrow

+0

my bad, я имел в виду INSERT - это один оператор, а DELETE + INSERT - это один оператор. –

ответ

13

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

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

+0

RDBMS: MS SQL Server 2008 Ent –

+2

2007 не существует, вы имеете в виду 2005 или 2008, если в 2008 году вы посмотрите MERGE http://msdn.microsoft.com/en-us/library/bb510625.aspx – SQLMenace

+0

yes 2008 (IIS - 7). Слияние - идеальное решение. –

1

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

0

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

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

0

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

+0

Предполагая, что он принимает несколько вставок, если все вставки находятся в одной транзакции, это не требуется. – Donnie

0

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

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

1

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

+0

Материализованный вид в SQL Server не допускает внешних и самостоятельных соединений, что будет включать в себя любой запрос (стоимостью материализации). Если бы не это ограничение - материализованное представление было бы идеальным решением. –

0

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

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

+0

(и по причинам, не зависящим от меня, я не могу комментировать вопросник SQLMenace, следовательно, мой собственный ответ) (я думаю, что я слишком «молод» на StackOverflow atm) – deroby

+0

MERGE на SQL Server обрабатывает INSERT, UPDATE _and_ DELETE. –

+0

OMG, он делает!? Я так привык называть его UPSERT, что я не ожидал, что он поддержит DELETE ... (застрял на SQL2k5, Merge - одна из вещей, которые я не могу использовать в своих повседневных вещах ...) Извините за плохой совет, чтение документации по сравнению с публикацией не повредит мне. Кажется = (http://technet.microsoft.com/en-us/library/bb510625.aspx – deroby

Смежные вопросы