[英]How does using TRUNCATE TABLE affect Indexes
使用SQL Server 2005,升級到2012
如果我有ETL,則執行以下操作(簡化)
TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source
這是否清除索引並使用插入重建它? 我有碎片嗎?
假設它不會截斷索引。 這意味着數據庫在物理上不一致。 所以不可能這樣。
截斷邏輯刪除所有行,並為所有分區物理創建新的b樹。 由於樹木是新鮮的,因此不存在碎片。
實際上我不確定這些樹是否分配了0或1頁。 但沒關系。 我相信臨時表有一個與臨時表緩存有關的特殊情況。 也沒關系。
您問題中的插入與任何其他插入的工作方式相同。 它不受交叉語句通信方式中的前一個截斷的影響。 是否導致碎片取決於您的具體情況,恕我直言,最好放在一個新問題。
挑戰@sjaan響應
MSDN“TRUNCATE TABLE刪除表中的所有行,但表結構及其列,約束,索引等仍然存在。” SQL團隊說索引會存在但沒有數據頁......你可以通過引用輕松檢查
如果檢查該表上的索引大小,它將為零
SELECT *
FROM
(
SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM sys.indexes AS i
JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID
AND p.index_id = i.index_id
JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
GROUP BY i.OBJECT_ID,
i.index_id,
i.name
) a
WHERE A.TableName LIKE '%table%'
ORDER BY Tablename,
indexid;
“TRUNCATE TABLE從表中刪除所有行,但表結構及其列,約束,索引等仍然存在。”
請參閱文章: https : //msdn.microsoft.com/en-us/library/ms177570.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.