簡體   English   中英

如何使用TRUNCATE TABLE影響索引

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM