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) блокировки таблицы. Если удалить операция не использует блокировку таблицы, таблица (куча) будет содержать много пустых страниц. Для индексов операция удаления может оставить пустым страницы позади, хотя эти страницы будут быстро освобождены процесс очистки фона.