使用SQL Server 2005,升级到2012
如果我有ETL,则执行以下操作(简化)
TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source
Run Code Online (Sandbox Code Playgroud)
这是否清除索引并使用插入重建它?我有碎片吗?
usr*_*usr 10
假设它不会截断索引.这意味着数据库在物理上不一致.所以不可能这样.
截断逻辑删除所有行,并为所有分区物理创建新的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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33832 次 |
| 最近记录: |