Ο χώρος που χρησιμοποιεί ένας πίνακας δεν κυκλοφορεί πλήρως μετά τη χρήση μιας δήλωσης ΔΙΑΓΡΑΦΉς για τη διαγραφή δεδομένων από τον πίνακα στον SQL Server


Σφάλμα #: 219514 (SQL Server 8,0)

Συμπτώματα


Αφού χρησιμοποιήσετε μια πρόταση DELETE στον Microsoft SQL Server για να διαγράψετε δεδομένα από έναν πίνακα, ενδέχεται να παρατηρήσετε ότι ο χώρος που χρησιμοποιεί ο πίνακας δεν έχει κυκλοφορήσει πλήρως. Όταν, στη συνέχεια, επιχειρήσετε να εισαγάγετε δεδομένα στη βάση δεδομένων, ενδέχεται να λάβετε το ακόλουθο μήνυμα σφάλματος:
Δεν ήταν δυνατή η εκχώρηση χώρου για το αντικείμενο "TableName" στη βάση δεδομένων "όνομαβάσηςδεδομένων", επειδή το "πρωτεύον" αρχείων είναι πλήρες.
Σημείωση το TableName αντιπροσωπεύει το όνομα του πίνακα. Το όνομαβάσηςδεδομένων αντιπροσωπεύει το όνομα της βάσης δεδομένων που περιέχει τον πίνακα.

Αιτία


Αυτό το πρόβλημα παρουσιάζεται επειδή ο SQL Server απελευθερώνει μόνο όλες τις σελίδες που χρησιμοποιεί ένας πίνακας σωρού όταν ισχύουν οι ακόλουθες συνθήκες:
  • Εμφανίζεται μια διαγραφή σε αυτόν τον πίνακα.
  • Ένα κλείδωμα επιπέδου πίνακα κρατείται.
Σημείωση Ένας πίνακας σωρού είναι οποιοσδήποτε πίνακας που δεν σχετίζεται με ένα συγκεντρωτικό ευρετήριο. Εάν οι σελίδες δεν έχουν αποδεσμευτεί, τα άλλα αντικείμενα στη βάση δεδομένων δεν μπορούν να επαναχρησιμοποιήσουν τις σελίδες. Ωστόσο, όταν ενεργοποιείτε ένα επίπεδο απομόνωσης βάσει εκδόσεων γραμμής σε μια βάση δεδομένων του SQL Server 2005, δεν είναι δυνατή η κυκλοφορία των σελίδων, ακόμα και αν κρατείται ένα κλείδωμα επιπέδου πίνακα. Για περισσότερες πληροφορίες σχετικά με τα επίπεδα απομόνωσης βάσει εκδόσεων γραμμής, ανατρέξτε στο θέμα "χρήση επιπέδων απομόνωσης βάσει εκδόσεων γραμμής" στον SQL Server 2005 Books Online.

Λύση


Για να επιλύσετε αυτό το πρόβλημα, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους:
  • Συμπεριλάβετε μια υπόδειξη του TABLOCK στην πρόταση DELETE, εάν δεν είναι ενεργοποιημένο ένα επίπεδο απομόνωσης βάσει εκδόσεων γραμμής. Για παράδειγμα, χρησιμοποιήστε μια πρόταση που είναι παρόμοια με την εξής:
    DELETE FROM <TableName> WITH (TABLOCK)
    Σημείωση<TableName> αντιπροσωπεύει το όνομα του πίνακα.
  • Χρησιμοποιήστε την πρόταση περικοπή πίνακα, εάν θέλετε να διαγράψετε όλες τις εγγραφές στον πίνακα. Για παράδειγμα, χρησιμοποιήστε μια πρόταση που είναι παρόμοια με την εξής:
    TRUNCATE TABLE <TableName>
  • Δημιουργήστε ένα συγκεντρωτικό ευρετήριο σε μια στήλη του πίνακα. Για περισσότερες πληροφορίες σχετικά με το πώς μπορείτε να δημιουργήσετε ένα συγκεντρωτικό ευρετήριο σε έναν πίνακα, ανατρέξτε στο θέμα "δημιουργία συμπλέγματος ευρετηρίου" στον SQL Server Books Online.

Κατάσταση


Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα πρόβλημα στα προϊόντα της Microsoft που παρατίθενται στην ενότητα "ισχύει για".