16

SQL Server 2005を使用して、2012にアップグレードする

ETLを使用している場合、次のことを行います(簡略化)

TRUNCATE TABLE detination
INSERT INTO detination
SELECT *
FROM source

これはインデックスをクリアし、インサートを使用して再構築しますか?フラグメントはありますか?

4

3 に答える 3

12

インデックスが切り捨てられないと想定します。これは、データベースが物理的に一貫していないことを意味します。したがって、このようにすることはできません。

Truncateは論理的にすべての行を削除し、すべてのパーティションに対して新しいbツリーを物理的に作成します。木は新鮮なので、断片化は存在しません。

実際、ツリーに0ページまたは1ページが割り当てられているかどうかはわかりません。しかし、それは問題ではありません。一時テーブルの場合、一時テーブルのキャッシュに関係する特殊なケースがあると思います。また、関係ありません。

質問の挿入は、他の挿入と同じように機能します。これは、ステートメント間の通信方法での以前の切り捨ての影響を受けません。それが断片化を引き起こすかどうかは、特定のケースに依存し、私見では、新しい質問に最適です。

于 2012-12-29T00:50:36.340 に答える
7

挑戦的な@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;
于 2017-03-08T12:04:59.253 に答える
-1

「TRUNCATETABLEはテーブルからすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは残ります。」

記事を参照してください:https ://msdn.microsoft.com/en-us/library/ms177570.aspx

于 2016-12-21T13:57:54.040 に答える