SQL Server 2005を使用して、2012にアップグレードする
ETLを使用している場合、次のことを行います(簡略化)
TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source
これはインデックスをクリアし、インサートを使用して再構築しますか?フラグメントはありますか?
SQL Server 2005を使用して、2012にアップグレードする
ETLを使用している場合、次のことを行います(簡略化)
TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source
これはインデックスをクリアし、インサートを使用して再構築しますか?フラグメントはありますか?
インデックスが切り捨てられないと想定します。これは、データベースが物理的に一貫していないことを意味します。したがって、このようにすることはできません。
Truncateは論理的にすべての行を削除し、すべてのパーティションに対して新しいbツリーを物理的に作成します。木は新鮮なので、断片化は存在しません。
実際、ツリーに0ページまたは1ページが割り当てられているかどうかはわかりません。しかし、それは問題ではありません。一時テーブルの場合、一時テーブルのキャッシュに関係する特殊なケースがあると思います。また、関係ありません。
質問の挿入は、他の挿入と同じように機能します。これは、ステートメント間の通信方法での以前の切り捨ての影響を受けません。それが断片化を引き起こすかどうかは、特定のケースに依存し、私見では、新しい質問に最適です。
挑戦的な@sjaanの応答
MSDN「TRUNCATETABLEはテーブルからすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは残ります。」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;
「TRUNCATETABLEはテーブルからすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは残ります。」
記事を参照してください:https ://msdn.microsoft.com/en-us/library/ms177570.aspx