2015-07-13 6 views
0

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

USE [myDatabase] 
GO 
SET ANSI_NULLS_ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[ClearTheTable] 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT * INTO tempMyTable FROM MyTable WHERE 1 = 0; 
    DROP TABLE MyTable 
    EXEC sp_rename tempMyTable, MyTable; 
END 

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

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

Спасибо!

EDIT

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

USE [myDatabase] 
GO 
SET ANSI_NULLS_ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[ClearTheTable] 
AS 
BEGIN 
    SET NOCOUNT ON; 
    ALTER DATABASE myDatabase 
    SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE 
    TRUNCATE TABLE MyTable 
    ALTER DATABASE myDatabase 
    SET MULTI_USER 
END 
+3

Как насчет использования 'TRUNCATE'? –

+0

truncate сохранит только скелет вашей таблицы, очистив все значения. Убедитесь, что у него нет ограничений. – mohan111

+0

http://stackoverflow.com/questions/24213299/how-to-delete-large-data-of-table- in-sql-without-log – mohan111

ответ

3

Лучший способ очистить стол с TRUNCATE.

С тех пор, как вы создаете и злитесь, предположите, что у вас нет ограничений.

TRUNCATE TABLE <target table> 

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

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

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

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

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

  • Без исключений, нулевые страницы остаются в таблице.

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

+0

Спасибо за предложение. Похоже, это должно быть легко, но запуск 'TRUNCATE TABLE myTable;' работает в течение 30 + минут. Нет внешних ключей, но есть 3 индекса, если это имеет значение. –

+2

Похоже, что моя проблема связана с тем, что в MS Access открыта связанная таблица. Я обошел это, выполнив «SET RESTRICTED_USER», запустив truncate, а затем «SET MULTI_USER» сразу. Отлично! –