16

使用 SQL Server 2005,升级到 2012

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

TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source

这会清除索引并使用插入重建它吗?我会有碎片吗?

4

3 回答 3

12

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

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

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

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

于 2012-12-29T00:50:36.340 回答
7

挑战@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;
于 2017-03-08T12:04:59.253 回答
-1

“TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保留。”

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

于 2016-12-21T13:57:54.040 回答