2011-11-17 28 views
4

假設我們有一張有200萬行的表格。它有兩個非聚集索引。一般來說,它會以更快的速度下降重新創建新的數據重新申請指數比刪除其所有行,然後做新數據的插入刪除表,重新創建表並重新索引它比直接從SQL Server中刪除所有行更快嗎?

注意:我試圖避免使用trunc,因爲它需要sysadmin priv。

+1

截斷表不需要SysAdmin。它內置於db_owner和db_ddladmin。你也需要這個來運行drop table。 –

+0

我被一位高級數據庫管理員告知。在根據本網站人員的建議調查自己後,我現在可以確認它只需要更改表格權限。這完全改變了一切,並使我的問題變得模糊:)> – deutschZuid

回答

4

嘗試TRUNCATE TABLE TableNameTRUNCATE聲明是非常快的,而且比刪除表,或使用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證書來完成這一點。

+0

我儘量避免使用它,因爲它需要sysadmin priv :)。我現在將這個添加到我的問題中。 – deutschZuid

+1

我已更新我的答案以顯示所需的憑據。你只需要'ALTER'。 「DROP TABLE」需要架構上的「ALTER」或表上的「CONTROL」或ddl_admin成員資格。 –

3

我想避免使用trunc,因爲它需要sysadmin priv。

這是完全不準確的。 TRUNCATE聲明需要ALTER TABLE權限:

所需的最小權限是table_name上的ALTER。

因此,這也正是它會被要求DROP INDEX並重新創建,或ALTER INDEX ... DISABLE索引並重新啓用相同的權限:

要執行DROP INDEX,至少,ALTER表或視圖的權限是必需的。 要執行ALTER INDEX,至少需要表或視圖上的ALTER權限。

所以,更快的是對錶格進行TRUNCATE,然後禁用索引,插入數據,然後啓用索引(這需要重建索引)。但對於僅有的2M行來說,這樣的禁用/啓用遊戲並不值得。對於這樣一個小的工作,只需截斷表格,然後批量插入行。

1

我曾與一個類似的問題,我的表有大約800萬行,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

同樣,對於需要比您想要更多權限的其他操作,您可以按照...

相關問題