Truncate table sql: TRUNCATE TABLE (Transact-SQL) — SQL Server

Сервер

sql — Какой самый быстрый способ очистить таблицу SQL?

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

спросил

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

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

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

4

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

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 для удаления всех данных из таблицы invoices :

 

invoices;

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

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

 

TRUNCATE TABLE table_name ПЕРЕЗАПУСТИТЬ ИДЕНТИФИКАЦИЮ;

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

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

 

TRUNCATE TABLE счета-фактуры ПЕРЕЗАПУСТИТЬ ИДЕНТИФИКАЦИЮ;

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

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

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

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

 

ТАБЛИЦА ОТРЕЗАНИЯ имя_таблицы1, имя_таблицы2, ...;

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

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

 

TRUNCATE TABLE накладные, клиенты;

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

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

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

TRUNCATE TABLE .

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

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

 

TRUNCATE TABLE имя_таблицы КАСКАД;

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

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

 

накладные КАСКАД;

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

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

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

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

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