Быстрее ли удалить таблицу, воссоздать ее и переиндексировать, чем просто удалить все строки из нее в SQL Server? - PullRequest
4 голосов
/ 18 ноября 2011

Допустим, у нас есть таблица с 2 миллионами строк.На нем есть два некластерных индекса.Вообще говоря, было бы быстрее отбросить это, воссоздать это с новыми данными и повторно применить индексы, чем удалить из все его строки, а затем вставка новых данных?

Примечание. Я пытаюсь избежать использования trunc , так как для этого требуется sysadmin priv.

Ответы [ 4 ]

4 голосов
/ 18 ноября 2011

Попробуйте TRUNCATE TABLE TableName оператор TRUNCATE очень быстрый и лучший подход, чем удаление таблицы или использование DELETE FROM

Разрешения: из MSDN о TRUNCATE:

The minimum permission required is ALTER on table_name. TRUNCATE TABLE
permissions default to the table owner, members of the sysadmin fixed server
role, and the db_owner and db_ddladmin fixed database roles,
and are not transferable.

However, you can incorporate the TRUNCATE TABLE statement within a module, such
as a stored procedure, and grant appropriate permissions to the module using the
EXECUTE AS clause. For more information, see Using EXECUTE AS to Create Custom
Permission Sets.

Так что вам не нужны sysadmin учетные данные для этого.

3 голосов
/ 18 ноября 2011

Я пытаюсь избежать использования trunc, так как для этого требуется sysadmin priv.

Это совершенно неточно. Оператор TRUNCATE требует разрешения ALTER TABLE:

Минимальное необходимое разрешение - ALTER для table_name.

Так что это точно такое же разрешение, которое требуется для DROP INDEX и повторного создания или ALTER INDEX ... DISABLE индекса и повторного включения:

Для выполнения DROP INDEX требуется, как минимум, разрешение ALTER для таблицы или представления. Для выполнения ALTER INDEX требуется как минимум разрешение ALTER для таблицы или представления.

Таким образом, чем быстрее TRUNCATE таблицы, затем отключить индексы, вставить данные, а затем включить обратно индексы (что требует перестроения индексов). Но вряд ли стоило бы делать такую ​​игру с отключением / включением всего лишь для двух миллионов строк. Для такой небольшой работы просто обрежьте таблицу, а затем массово вставьте строки.

3 голосов
/ 18 ноября 2011

Джеймс, тебе не нужно бросать это. Если вам не нужны журналы транзакций при удалении, просто используйте таблицу усечений, так как это не будет генерировать журналы транзакций и, следовательно, будет очень быстрым. http://msdn.microsoft.com/en-us/library/ms177570.aspx

1 голос
/ 18 ноября 2011

Я работал с подобной проблемой, и в моей таблице было около 8 миллионов строк с 43 столбцами.Удаление индексов, усечение таблицы, выполнение массовой вставки, воссоздание индексов - это все еще выполняется довольно быстро, учитывая объем данных, и я выполняю эту задачу в непиковые часы.

Если выЕсли вы хотите избежать использования TRUNCATE, вы можете создать процедуру для выполнения усечения и использовать пользователя с соответствующими правами.То есть, если предоставление разрешения пользователю задания является причиной, по которой вы хотите избежать использования команды усечения:

CREATE PROCEDURE dbo.TruncateTableName
WITH EXECUTE AS 'SqlUserWithTruncatePermission'
AS
BEGIN
    TRUNCATE TABLE TableName
END
GO

Если вы хотите попробовать это, вы можете прочитать больше по адресу:

http://msdn.microsoft.com/en-us/library/ms188354(v=SQL.90).aspx

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...