2012-12-28 20 views
5

Korzystanie z SQL Server 2005, uaktualnienie do 2012jaki sposób za pomocą TRUNCATE TABELA wpłynąć indeksów

Jeśli mam ETL łanie następujący (uproszczony)

TRUNCATE TABLE detination 
INSERT INTO detination 
SELECT * 
FROM source 

Czy to jasne indeks i odbudować ją z wkładki? Czy będę miał fragmenty?

+0

„TRUNCATE TABLE usuwa wszystkie wiersze z tabeli, ale struktura tabeli i jej kolumny, ograniczenia, indeksy itd. Pozostają. Licznik używany przez tożsamość dla nowych wierszy jest resetowany do początkowego dla kolumny. Jeśli chcesz zachować licznik tożsamości , użyj zamiast tego DELETE .Jeśli chcesz usunąć definicję tabeli i jej dane, użyj instrukcji DROP TABLE "z http://msdn.microsoft.com/en-us/library/aa260621(v=sql.80).aspx. Jeśli obetniesz tabelę, a następnie ponownie wstawisz dane, po wstawieniu może to najbardziej sensowne, aby odbudować indeks, ponieważ masz nowe dane w tabeli. – Kprof

+0

@Kprof Mieliśmy sytuację sytuacyjną, gdy cotygodniowe DELETE zabija działanie serwera aż do całkowitego odbudowania indeksu, ale cotygodniowe TRUNCATE utrzymują go w czystości na MSSQL 2005 – alex

Odpowiedz

9

Załóżmy, że to , a nie skrócić indeksy. Oznaczałoby to, że baza danych była fizycznie niespójna. Więc nie może tak być.

Skróć logicznie usuwa wszystkie wiersze i fizycznie tworzy świeże b-drzewa dla wszystkich partycji. Ponieważ drzewa są świeże, nie ma fragmentacji.

Właściwie nie jestem pewien, czy drzewa mają przypisane 0 lub 1 stronę. Ale to nie ma znaczenia. Uważam, że dla tabel tymczasowych istnieje specjalny przypadek związany z buforowaniem tabel tymczasowych. Również nie ma znaczenia.

Wkładka z twojego pytania działa tak samo jak każda inna wkładka. Nie ma na nią wpływu poprzednie obcięcie w komunikacji krzyżowej. To, czy powoduje rozdrobnienie, zależy od konkretnego przypadku, a IMHO jest najlepiej umieszczone w nowym pytaniu.

+1

Dzięki, szukałem, czy tworzy on świeże drzewa – Jmyster

0

Trudne @sjaan reponse

MSDN „TRUNCATE TABELA usuwa wszystkie wiersze z tabeli, ale strukturę tabeli i jej kolumn, ograniczeń, indeksy, i tak dalej pozostanie” SQL zespół mówi, że indeksy będą istnieć, ale bez stron danych ... Można łatwo sprawdzić, że z reference

Jeśli sprawdzić rozmiar indeksów na tym stole będzie wynosić zero

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; 
Powiązane problemy