Я пытаюсь получить более глубокое понимание о различиях между DELETE
и TRUNCATE
командами. Мое понимание внутренних органов идет примерно так:
DELETE
-> ядро базы данных находит и удаляет строку из соответствующих страниц данных и всех страниц индекса, где эта строка введена. Таким образом, чем больше индексов, тем больше времени занимает удаление.
TRUNCATE
-> просто удаляет все страницы данных таблицы массово, делая это более эффективным вариантом для удаления содержимого таблицы.
Предполагая, что вышеприведенное верно (пожалуйста, исправьте меня, если нет):
- Как разные режимы восстановления влияют на каждое утверждение? Если есть какой-либо эффект вообще
- При удалении сканируются все индексы или только те, где находится строка? Я бы предположил, что все индексы сканируются (и не ищутся?)
- Как реплицируются команды? Отправляется ли и обрабатывается ли команда SQL на каждом подписчике? Или MSSQL немного умнее?
sql-server
database-internals
Стюарт Блэклер
источник
источник
DELETE
иTRUNCATE
в ответах на этот вопрос о полезностиTRUNCATE
сразу -ную передDROP
. Вы также можете сами покопаться в журнале, чтобы изучить эффекты обеих команд, используя технику, описанную в этом ответе .TRUNCATE
можно откатить. Ник рассказывает об этом в своем ответе на вопрос, который он связал .Ответы:
Да, хотя здесь есть два варианта. Строки могут быть удалены из некластеризованных индексов построчно тем же оператором, который выполняет удаление базовой таблицы. Это называется узким (или для каждой строки) планом обновления:
Или удаление некластеризованного индекса может выполняться отдельными операторами, по одному на некластеризованный индекс. В этом случае (известный как широкий план обновления или план обновления для каждого индекса) полный набор действий сохраняется в рабочей таблице (готовая папка) перед повторным воспроизведением по индексу, часто явно сортируемой по ключам конкретного некластеризованного индекса, чтобы стимулировать последовательное шаблон доступа.
Да.
TRUNCATE TABLE
является более эффективным по ряду причин:Удаление всегда полностью регистрируется (каждая удаленная строка записывается в журнал транзакций). Существуют небольшие различия в содержании записей журнала, если модель восстановления отличается от них
FULL
, но это все еще технически полная запись в журнал.Удаление строки в индексе (с использованием узких или широких планов обновления, показанных ранее) - это всегда доступ по ключу (поиск). Сканирование всего индекса для каждой удаленной строки будет ужасно неэффективным. Давайте снова посмотрим на план обновления для индекса, показанный ранее:
Планы выполнения представляют собой управляемые спросом конвейеры: родительские операторы (слева) заставляют дочерние операторы выполнять работу, запрашивая у них строку за раз. Операторы сортировки блокируются (они должны использовать весь свой ввод перед созданием первой отсортированной строки), но они все еще управляются своим родителем (удаление индекса), запрашивающим эту первую строку. Удаление индекса извлекает строку за раз из завершенной сортировки, обновляя целевой некластеризованный индекс для каждой строки.
В широком плане обновлений вы часто будете видеть столбцы, добавляемые в поток строк оператором обновления базовой таблицы. В этом случае удаление кластеризованного индекса добавляет столбцы ключа некластеризованного индекса в поток. Эти данные требуются подсистеме хранения, чтобы найти строку, которую необходимо удалить из некластеризованного индекса:
Усечение не допускается для таблицы, опубликованной с использованием репликации транзакций или репликации слиянием. Способ репликации удалений зависит от типа репликации и ее конфигурации. Например, репликация моментальных снимков просто реплицирует представление таблицы на определенный момент времени с использованием массовых методов - дополнительные изменения не отслеживаются и не применяются. Репликация транзакций работает путем чтения записей журнала и генерации соответствующих транзакций для применения изменений у подписчиков. Репликация слиянием отслеживает изменения с использованием триггеров и таблиц метаданных.
Связанное чтение: Оптимизация запросов T-SQL, которые изменяют данные
источник