go backsqlschool blogs list

The TRUNCATE TABLE statement

by Fivi Panopoulou - Sotiris Karras

Σε αυτό το post θα μιλήσουμε για το TRUNCATE TABLE statement, τις χρήσεις του και τις διαφορές του με το DELETE statement.
Χρησιμοποιώντας το TRUNCATE TABLE σε έναν πίνακα της βάσης μας, το αποτέλεσμα θα είναι να διαγραφούν όλες οι γραμμές του πίνακα αυτού. Για παράδειγμα, με το παρακάτω statement θα διαγραφούν όλα τα δεδομένα του πίνακα TransactionHistory.
 
TRUNCATE TABLE Production.TransactionHistory;
GO

Σύγκριση με το DELETE Statement:

Το ίδιο αποτέλεσμα θα πετυχαίναμε και με την εντολή:

DELETE FROM Production.TransactionHistory;
GO
 
Παρόλα αυτά υπάρχουν κάποιες διαφορές ανάμεσα στις δύο παραπάνω περιπτώσεις.
Αρχικά, δοκιμάζοντας τα παραπάνω statements παρατηρούμε ότι το πρώτο εκτελείται ακαριαία, ενώ το δεύτερο χρειάζεται 7 δευτερόλεπτα να εκτελεστεί. Αυτό συμβαίνει γιατί στην δεύτερη περίπτωση η διαγραφή γίνεται για κάθε μία γραμμή του πίνακα και ο SQL Server βάζει ένα entry στο transaction log για κάθε γραμμή που διαγράφεται. Αντίθετα, στην περίπτωση του truncate ο SQL Server θα κάνει deallocate τις σελίδες που αντιστοιχούν στα δεδομένα του πίνακα και στο log θα γραφτεί ένα deallocation ανά σελίδα. Έτσι το truncate γίνεται πολύ πιο γρήγορα και καταναλώνει λιγότερους πόρους σε σχέση με το αντίστοιχο delete.

Μια ακόμα διαφορά μεταξύ των δύο παραπάνω περιπτώσεων, είναι ότι στην περίπτωση του delete, είναι πιθανό να παραμείνουν allocated κενές σελίδες που αντιστοιχούν στον πίνακα ή τους indexes.

Επίσης, το delete statement  χρησιμοποιεί ένα lock ανά γραμμή του πίνακα, ενώ το truncate κάνει lock τον πίνακα και τις σελίδες του.

Παρατηρήσεις:

• Δεν μπορούμε να κάνουμε truncate πίνακα ο οποίος συμμετέχει σε foreign key constraints
• Το truncate δεν πυροδοτεί τους triggers που πυροδοτούνται από delete.
• Σε πίνακες που περιλαμβάνουν στήλη με IDENTITY, όταν τον κάνουμε truncate αυτό θα γίνει RESEED στην αρχική τιμή που έχει καθοριστεί στον ορισμό του πίνακα.
• Το truncate μπορεί να γίνει rollback, εφόσον φυσικά περιέχεται μέσα σε ένα transaction


Ημερομηνία: 15 November 2015 23:41
Αξιολόγηση:
Tags:
Share it:

Αφήστε το σχόλιο σας - Leave your comment

Τα σχόλια έχουν κλείσει.
Επιτρέπονται μόνο τα σχόλια από τα μέλη του SqlSchool.gr.


newsletter subscription

Εάν επιθυμείτε να λαμβάνετε ενημέρωση από εμάς, δώστε μας το e-mail σας.
PASS chapter logo
Official Professional Association for SQL Server (PASS) chapter for Greece
Join to PASS