Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

221 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

28 maart 2024, 21:32:07

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: TRUNCATE of DROP/CREATE ?  (gelezen 19150 keer)

0 leden en 1 gast bekijken dit topic.

Offline Ronald

  • Forum Manager
  • *****
  • Berichten: 1.856
  • Geslacht: Man
    • NL Computer Forum
TRUNCATE of DROP/CREATE ?
« Gepost op: 5 december 2009, 17:20:41 »
Hallo allemaal,

Stel, ik heb een tabel waarvan ik de inhoud compleet wil verversen (om er zeker van te zijn dat er geen 'oud zeer' achterblijft). Dan kan ik dat op 2 manieren doen:

1. Ik gooi de tabel leeg met een TRUNCATE TABLE opdracht.
2. Ik gooi de tabel weg met DROP TABLE en maak hem opnieuw aan met dezelfde specificaties als de oude tabel.

Wat zijn nu de voor- of nadelen van deze manieren? Welke is het beste?

Groeten,

Ronald
Forum Manager NL Computer Forum
Microsoft Certified Solutions Expert (MCSE) - Business Intelligence

Offline Hugo

  • Erelid
  • *****
  • Berichten: 101
  • Geslacht: Man
Re: TRUNCATE of DROP/CREATE ?
« Reactie #1 Gepost op: 17 december 2009, 21:30:50 »
Hoi Ronald,

Sorry voor het late antwoord. Die optie "stuur mail als er een nieuw topic is" heeft weinig zin als je dan niet direct reageert en er de volgende dag zoveel nieuwe mail achter aan komt dat de mail van de eerste pagina af is...

TRUNCATE TABLE werkt sneller en is in principe beter. Het verschil tussen TRUNCATE TABLE en DELETE zonder WHERE clause (vroeg je niet, weet ik, maar vertel ik lekker toch :P) is dat bij een DELETE elke verwijderde rij in de logfile wordt opgenomen, terwijl bij een TRUNCATE TABEL alleen de deallocaties van pages gelogd zijn. Dat betekent dus veel minder overhead, waardoor het sneller gaat.

Bij een DROP TABLE worden, voor zover ik weet, ook alleen de deallocaties gelogd. Wat dat betreft is er dus geen verschil. Maar wel gebeurt er vervolgens meer. Ook alle indexen en constraints verdwijnen automatisch, evenals alle triggers die op de tabel gedefinieerd zijn. En de metadata wordt uit de systeemtabellen verwijderd.

Vervolgens wordt met de CREATE TABLE die metadata weer toegevoegd, en hopelijk voer je daarna ook de ALTER TABLE, CREATE INDEX en CREATE TRIGGER opdrachten uit om ook dat te herstellen. Moet allemaal verwerkt worden, is allemaal overhead.

Kost dit veel? Nee. Normaalgesproken misschien een paar milliseconden. Niet echt een verschil om een keuze op te baseren. Dus wat blijft er dan over voor de keuze? Onderhoudbaarheid en gemak. TRUNCATE TABLE is een statement; DROP TABLE en CREATE TABLE zijn er al twee (en de tweede is vrij lang) en dan moet je daarna nog de indexen, constraints en triggers opnieuw opvoeren. Makkelijke keuze, toch?
--
Hugo Kornelis, SQL Server MVP

Offline Ronald

  • Forum Manager
  • *****
  • Berichten: 1.856
  • Geslacht: Man
    • NL Computer Forum
Re: TRUNCATE of DROP/CREATE ?
« Reactie #2 Gepost op: 1 januari 2010, 23:20:22 »
Hoi Hugo,

Sorry voor het late antwoord. Die optie "stuur mail als er een nieuw topic is" heeft weinig zin als je dan niet direct reageert en er de volgende dag zoveel nieuwe mail achter aan komt dat de mail van de eerste pagina af is...

Geen probleem hoor! Alles op z'n tijd, geen haast enzo. Ik vind het allang geweldig dat je hier zo nu en dan komt buurten. :)

Kost dit veel? Nee. Normaalgesproken misschien een paar milliseconden. Niet echt een verschil om een keuze op te baseren. Dus wat blijft er dan over voor de keuze? Onderhoudbaarheid en gemak. TRUNCATE TABLE is een statement; DROP TABLE en CREATE TABLE zijn er al twee (en de tweede is vrij lang) en dan moet je daarna nog de indexen, constraints en triggers opnieuw opvoeren. Makkelijke keuze, toch?

Ach so! :)  Het (kleine) voordeel van de tabel volledig nieuw aanmaken, vind ik dat ik zeker weet dat die tabel er altijd is (voor als er direct daarna van alles gaat lopen dat met die (opgeschoonde) tabel moet gaan werken), en ook precies met de definities die ik nodig heb. Als er een oudere versie van de tabel blijkt te zijn (met bijv. 1 kolom minder), dan heb ik daar met truncate table vervolgens wél last van.  :-\

Ik las laatst in de SQL Server 2008 Bible wat pas als een 'grote' database wordt beschouwd (vele gigabytes uit m'n hoofd). De databases waar ik mee werk zijn doorgaans een héél stuk kleiner. ;)

Maakt het trouwens qua fragmentatie in de database nog uit of je truncate of drop/create gebruikt? Als ik een tabel opnieuw aanmaak, is die dan per definitie 0% gefragmenteerd? (In tegenstelling tot een tabel die met truncate is geleegd en die -stel- wellicht al sterk gefragmenteerd was?)

Groeten,

Ronald
Forum Manager NL Computer Forum
Microsoft Certified Solutions Expert (MCSE) - Business Intelligence

Offline Hugo

  • Erelid
  • *****
  • Berichten: 101
  • Geslacht: Man
Re: TRUNCATE of DROP/CREATE ?
« Reactie #3 Gepost op: 2 januari 2010, 00:25:37 »
Hoi Ronald,

Ik ben er 99% zeker van dat er voor die gefragmenteerde tabel geen enkel verschil is. Zowel DROP TABLE als TRUNCATE TABLE leiden tot een deallocatie van alle pages die voor de tabel in gebruik waren, zodat in beide gevallen daarna de tabel geen pagina's gebruikt en dus met schone lei begint.

Omdat 99% net geen volledige zekerheid is, heb ik het toch ook nog maar even nagevraagd in de MVP nieuwsgroep. Ik hou je op de hoogte als ik antwoorden krijg.

Groetjes, Hugo
--
Hugo Kornelis, SQL Server MVP

Offline Hugo

  • Erelid
  • *****
  • Berichten: 101
  • Geslacht: Man
Re: TRUNCATE of DROP/CREATE ?
« Reactie #4 Gepost op: 3 januari 2010, 14:50:40 »
Hoi Ronald,

Zoals beloofd heb ik het nog even nagevraagd, maar wat ik al dacht klopt - een TRUNCATE dealloceert alle pages die aan de table gealloceerd waren, dus wat betreft storage is het effect van TRUNCATE exact gelijk aan dat van DROP / CREATE.

Overigens is het wel zo dat als er weinig lege ruimte in de database is, de tabel snel weer gefragmenteerd kan worden, omdat SQL Server dan geen aaneensluitende pages kan alloceren als je weer gegevens gaat toevoegen.
--
Hugo Kornelis, SQL Server MVP

Offline Ronald

  • Forum Manager
  • *****
  • Berichten: 1.856
  • Geslacht: Man
    • NL Computer Forum
Re: TRUNCATE of DROP/CREATE ?
« Reactie #5 Gepost op: 25 januari 2010, 22:18:29 »
Hoi Hugo,

Ik had je nog helemaal niet bedankt, shame on me! Bij deze dus alsnog: hartelijk dank! Weer wat geleerd. :)

Groeten,

Ronald --Tweet-tweet (moet van Just): Inmiddels 10% van de SQL Server 2008 Bible gelezen ;)
Forum Manager NL Computer Forum
Microsoft Certified Solutions Expert (MCSE) - Business Intelligence

Offline Michel Uphoff

  • Wizop
  • *****
  • Berichten: 1.816
  • Geslacht: Man
    • Tentoonstelling
Re: TRUNCATE of DROP/CREATE ?
« Reactie #6 Gepost op: 25 januari 2010, 22:34:59 »
>> Tweet-tweet <<
 
Alweer zo'n pokke-kanarie. Waar is me buks...
Michel Uphoff
Homepage