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
:
Язык кода: SQL (язык структурированных запросов) (sql)
TRUNCATE TABLE имя_таблицы;
Оператор TRUNCATE TABLE
удаляет все данные из таблицы без ее сканирования. Вот почему он быстрее, чем оператор DELETE
.
Кроме того, оператор TRUNCATE TABLE
сразу освобождает память, поэтому вам не нужно выполнять последующую операцию VACUMM
, что полезно в случае больших таблиц.
Удалить все данные из одной таблицы
Простейшая форма оператора TRUNCATE TABLE
выглядит следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
TRUNCATE TABLE имя_таблицы;
В следующем примере используется оператор TRUNCATE TABLE
для удаления всех данных из таблицы invoices
:
Язык кода: SQL (язык структурированных запросов) (sql)
invoices;
Помимо удаления данных, вы можете сбросить значения в столбце идентификаторов, используя параметр RESTART IDENTITY
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
TRUNCATE TABLE table_name ПЕРЕЗАПУСТИТЬ ИДЕНТИФИКАЦИЮ;
Например, следующая инструкция удаляет все строки из таблицы invoices
и сбрасывает последовательность, связанную со столбцом invoice_no
:
Язык кода: SQL (язык структурированных запросов) (sql)
TRUNCATE TABLE счета-фактуры ПЕРЕЗАПУСТИТЬ ИДЕНТИФИКАЦИЮ;
По умолчанию оператор TRUNCATE TABLE
использует параметр CONTINUE IDENTITY
. Этот параметр в основном не перезапускает значение в последовательности, связанной со столбцом в таблице.
Удалить все данные из нескольких таблиц
Чтобы удалить все данные из нескольких таблиц сразу, разделите каждую таблицу запятой (,) следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
ТАБЛИЦА ОТРЕЗАНИЯ имя_таблицы1, имя_таблицы2, ...;
Например, следующая инструкция удаляет все данные из счетов-фактур
и клиентов
таблиц:
Язык кода: SQL (язык структурированных запросов) (sql)
TRUNCATE TABLE накладные, клиенты;
Удалить все данные из таблицы со ссылками на внешний ключ
На практике таблица, которую вы хотите усечь, часто содержит ссылки на внешние ключи из других таблиц, которые не указаны в операторе TRUNCATE TABLE
.
По умолчанию оператор TRUNCATE TABLE
не удаляет данные из таблицы, имеющей ссылки на внешний ключ.
Чтобы удалить данные из таблицы и других таблиц, в которых внешний ключ ссылается на таблицу, используйте параметр CASCADE
в операторе TRUNCATE TABLE
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
TRUNCATE TABLE имя_таблицы КАСКАД;
В следующем примере удаляются данные из таблицы invoices
и других таблиц, которые ссылаются на таблицу invoices
через ограничения внешнего ключа:
Язык кода: SQL (язык структурированных запросов) (sql)
накладные КАСКАД;
Параметр CASCADE
следует использовать с дальнейшим рассмотрением, иначе вы можете удалить данные из таблиц, которые вам не нужны.