2012-12-28 10 views
5

von SQL Server mithilfe 2005 ein Upgrade auf 2012Wie mit TRUNCATE TABLE-Indizes beeinflusst

Wenn ich ein ETL habe die folgende tut (vereinfacht)

TRUNCATE TABLE detination 
INSERT INTO detination 
SELECT * 
FROM source 

Enthält diese den Index löschen und neu erstellen mit die Einsätze? Werde ich Fragmente haben?

+0

„TRUNCATE sein TABLE entfernt alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Integritätsregeln, Indizes usw. Der Zähler, der von einer Identität für neue Zeilen verwendet wird, wird auf den Startwert für die Spalte zurückgesetzt, wenn der Identitätszähler beibehalten werden soll Verwenden Sie stattdessen DELETE. Wenn Sie die Tabellendefinition und ihre Daten entfernen möchten, verwenden Sie die Anweisung DROP TABLE "von http://msdn.microsoft.com/en-us/library/aa260621(v=sql.80).aspx. Wenn Sie die Tabelle abschneiden und Daten erneut einfügen, ist es nach dem Einfügen möglicherweise am sinnvollsten, den Index neu zu erstellen, da Sie neue Daten in der Tabelle haben. – Kprof

+0

@Kprof Wir hatten eine passende Situation, wenn wöchentlich DELETE Server-Performance bis zur vollständigen Wiederherstellung des Indexes killt, aber wöchentlich TRUNCATE sauber auf MSSQL 2005 halten – alex

Antwort

9

Angenommen, es würde nicht die Indizes abgeschnitten. Das würde bedeuten, dass die Datenbank physikalisch inkonsistent ist. So kann es nicht sein.

Abschneiden entfernt logisch alle Zeilen und erstellt physisch neue B-Bäume für alle Partitionen. Da die Bäume frisch sind, besteht keine Fragmentierung.

Eigentlich bin ich nicht sicher, ob den Bäumen 0 oder 1 Seiten zugewiesen sind. Aber das macht nichts. Ich glaube, für temporäre Tabellen gibt es einen speziellen Fall, der mit dem Zwischenspeichern von temporären Tabellen zu tun hat. Ist auch egal.

Die Einfügung von Ihrer Frage funktioniert auf die gleiche Weise wie jede andere Einfügung. Es wird nicht durch das vorherige truncate in einer Cross-Statement-Kommunikationsweise beeinflusst. Ob es Fragmentierung verursacht, hängt von Ihrem speziellen Fall ab und, IMHO, am besten in einer neuen Frage.

+1

Danke, ich suchte, ob es die frischen Bäume schafft – Jmyster

0

Challenging @sjaan reponse

MSDN "TRUNCATE TABLE löscht alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Einschränkungen, Indizes und so weiter bleiben" SQL-Team sagt, dass Indizes existieren, aber ohne Daten Seiten ... Sie könnten leicht überprüfen, ob mit reference

Wenn Sie die Größe der Indizes auf die Tabelle überprüfen wird es Null

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;