Truncate table sql: SQL DROP TABLE, TRUNCATE TABLE

PostgreSQL TRUNCATE TABLE с практическими примерами

Резюме : в этом руководстве вы узнаете, как использовать инструкцию PostgreSQL TRUNCATE TABLE для быстрого удаления всех данных из больших таблиц.

Введение в оператор PostgreSQL TRUNCATE TABLE

Чтобы удалить все данные из таблицы, используйте оператор DELETE . Однако когда вы используете оператор DELETE для удаления всех данных из таблицы с большим количеством данных, это неэффективно. В этом случае вам нужно использовать TRUNCATE TABLE оператор:

 TRUNCATE TABLE имя_таблицы;  Язык кода: SQL (язык структурированных запросов) (sql)  

Оператор TRUNCATE TABLE удаляет все данные из таблицы без ее сканирования. По этой причине он быстрее, чем оператор DELETE .

Кроме того, оператор TRUNCATE TABLE  сразу освобождает память, поэтому вам не нужно выполнять последующую операцию VACUMM , что полезно в случае больших таблиц.

Удалить все данные из одной таблицы

Простейшая форма оператора TRUNCATE TABLE выглядит следующим образом:

 TRUNCATE TABLE имя_таблицы;  Язык кода: SQL (язык структурированных запросов) (sql)  

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

 TRUNCATE TABLE инвойсы;  Язык кода: SQL (язык структурированных запросов) (sql)  

Помимо удаления данных, вы можете сбросить значения в столбце идентификации с помощью RESTART IDENTITY параметр, подобный этому:

 TRUNCATE TABLE table_name
ПЕРЕЗАПУСТИТЬ ИДЕНТИФИКАЦИЮ;  Язык кода: SQL (язык структурированных запросов) (sql)  

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

 TRUNCATE TABLE invoices
ПЕРЕЗАПУСТИТЬ ИДЕНТИФИКАЦИЮ; 
Язык кода: SQL (язык структурированных запросов) (sql)

По умолчанию  Оператор TRUNCATE TABLE использует параметр CONTINUE IDENTITY . Этот параметр в основном не перезапускает значение в последовательности, связанной со столбцом в таблице.

Удалить все данные из нескольких таблиц

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

 TRUNCATE TABLE
    имя_таблицы1,
    имя_таблицы2,
    ...;  Язык кода: SQL (язык структурированных запросов) (sql)  

Например, следующая инструкция удаляет все данные из счета-фактуры и клиенты таблицы:

 TRUNCATE TABLE счета-фактуры, клиенты;  Язык кода: SQL (язык структурированных запросов) (sql)  

Удалить все данные из таблицы со ссылками на внешний ключ

На практике таблица, которую вы хотите усечь, часто содержит ссылки на внешний ключ из других таблиц, которые не указан в операторе

TRUNCATE TABLE .

По умолчанию оператор TRUNCATE TABLE не удаляет данные из таблицы, имеющей ссылки на внешний ключ.

Чтобы удалить данные из таблицы и других таблиц, которые имеют внешний ключ, ссылающийся на таблицу, вы используете параметр CASCADE в операторе TRUNCATE TABLE следующим образом:

 TRUNCATE TABLE table_name
КАСКАД;  Язык кода: SQL (язык структурированных запросов) (sql)  

В следующем примере удаляются данные из таблицы invoices и других таблиц, которые ссылаются на таблицу invoices через ограничения внешнего ключа:

 TRUNCATE TABLEincounts CASCADE;  Язык кода: SQL (язык структурированных запросов) (sql)  

Вариант CASCADE следует использовать с дальнейшим рассмотрением, иначе вы можете удалить данные из таблиц, которые вам не нужны.

По умолчанию оператор TRUNCATE TABLE использует параметр RESTRICT , который предотвращает усечение таблицы, содержащей ссылки на ограничение внешнего ключа.

PostgreSQL TRUNCATE TABLE и триггер ON DELETE

Несмотря на то, что  Оператор TRUNCATE TABLE удаляет все данные из таблицы, но не запускает триггеры ON DELETE , связанные с таблицей.

Чтобы активировать триггер при применении к таблице команды TRUNCATE TABLE , необходимо определить триггеры BEFORE TRUNCATE и/или AFTER TRUNCATE для этой таблицы.

PostgreSQL TRUNCATE TABLE и транзакция

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

Сводка

  • Используйте оператор TRUNCATE TABLE для удаления всех данных из большой таблицы.
  • Используйте параметр CASCADE для усечения таблицы и других таблиц, которые ссылаются на таблицу через ограничение внешнего ключа.
  • Триггер TRUNCATE TABLE не запускает триггер ON DELETE . Вместо этого он запускает триггеры BEFORE TRUNCATE и AFTER TRUNCATE .
  • Оператор TRUNCATE TABLE безопасен для транзакций.

Было ли это руководство полезным?

сервер sql — Как быстрее всего очистить таблицу SQL?

Задавать вопрос

спросил

Изменено 7 лет, 8 месяцев назад

Просмотрено 48 тысяч раз

У меня есть таблица примерно из 300 000 строк и 30 столбцов. Как я могу быстро очистить его? Если я выполняю запрос DROP FROM MyTable , его выполнение занимает много времени. Я пытаюсь использовать следующую хранимую процедуру, чтобы в основном сделать копию таблицы без данных, удалить исходную таблицу и переименовать новую таблицу как оригинал:

 USE [myDatabase]
ИДТИ
УСТАНОВИТЬ ANSI_NULLS_ON
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
ИЗМЕНИТЬ ПРОЦЕДУРУ [dbo].[ClearTheTable]
КАК
НАЧИНАТЬ
    УСТАНОВИТЬ БЕЗ СЧЕТА;
    SELECT * INTO tempMyTable FROM MyTable WHERE 1 = 0;
    УДАЛИТЬ СТОЛ MyTable
    EXEC sp_rename tempMyTable, MyTable;
КОНЕЦ
 

Это заняло почти 7 минут. Есть ли более быстрый способ сделать это? Мне не нужно ведение журнала, откат или что-то в этом роде.

Если это имеет значение, я вызываю хранимую процедуру из приложения C#. Думаю, я мог бы написать некоторый код для воссоздания таблицы с нуля после выполнения DROP TABLE , но я не хотел перекомпилировать приложение каждый раз, когда столбец добавляется или изменяется.

Спасибо!

РЕДАКТИРОВАТЬ

Вот моя обновленная хранимая процедура:

 ИСПОЛЬЗОВАТЬ [моя база данных]
ИДТИ
УСТАНОВИТЬ ANSI_NULLS_ON
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
ИЗМЕНИТЬ ПРОЦЕДУРУ [dbo].[ClearTheTable]
КАК
НАЧИНАТЬ
    УСТАНОВИТЬ БЕЗ СЧЕТА;
    ИЗМЕНИТЬ БАЗУ ДАННЫХ myDatabase
    УСТАНОВИТЬ RESTRICTED_USER С НЕМЕДЛЕННЫМ ОТКАТОМ
    ОБРЕЗАТЬ ТАБЛИЦУ MyTable
    ИЗМЕНИТЬ БАЗУ ДАННЫХ myDatabase
    УСТАНОВИТЬ МНОГОПОЛЬЗОВАТЕЛЬСКИЙ
КОНЕЦ
 
  • sql-сервер
  • хранимые процедуры

3

Лучший способ очистить таблицу — использовать TRUNCATE.

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

 TRUNCATE TABLE <целевая таблица>
 

Некоторые преимущества:

  • Используется меньше места в журнале транзакций.

Оператор DELETE удаляет строки по одной и записывает запись в журнале транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные путем освобождения страниц данных, используемых для хранения данных таблицы и записывает в журнал транзакций только освобождение страниц.

  • Обычно используется меньше замков.

Когда инструкция DELETE выполняется с блокировкой строки, каждая строка в таблица заблокирована для удаления. TRUNCATE TABLE всегда блокирует таблицу (включая блокировку схемы (SCH-M)) и страницу, но не каждую строку.

  • В таблице не осталось страниц без исключения.

После выполнения оператора DELETE таблица может содержать пустые страницы. Например, пустые страницы в куче не могут быть освобождены. по крайней мере без эксклюзивной (LCK_M_X) блокировки таблицы. Если удалить операция не использует блокировку таблицы, таблица (куча) будет содержать много пустых страниц. Для индексов операция удаления может оставить пустым страницы позади, хотя эти страницы будут быстро освобождены процесс очистки фона.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *