如何使用TRUNCATE TABLE影响索引

时间:2012-12-28 21:59:00

标签: sql-server

使用SQL Server 2005,升级到2012

如果我有ETL,则执行以下操作(简化)

TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source

这是否清除索引并使用插入重建它?我有片段吗?

3 个答案:

答案 0 :(得分:9)

假设截断索引。这意味着数据库在物理上不一致。所以不可能这样。

截断逻辑删除所有行,并为所有分区物理创建新的b树。由于树木很新鲜,不存在碎片。

实际上我不确定这些树是否分配了0或1页。但没关系。我相信临时表有一个与临时表缓存有关的特殊情况。也无所谓。

您问题中的插入与任何其他插入的工作方式相同。它不受交叉语句通信方式中的前一个截断的影响。它是否导致碎片化取决于您的具体情况,恕我直言,最好放在一个新问题。

答案 1 :(得分:3)

挑战@sjaan的回应

MSDN" TRUNCATE TABLE删除表中的所有行,但表结构及其列,约束,索引等仍然存在。" SQL团队说索引将存在但没有数据页......你可以使用reference

轻松检查

如果检查该表上的索引大小,则为零

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;

答案 2 :(得分:-3)

“TRUNCATE TABLE删除表中的所有行,但表结构及其列,约束,索引等仍然存在。”

参见文章:https://msdn.microsoft.com/en-us/library/ms177570.aspx