Οι προσωρινοί πίνακες είναι πολύ σημαντικοί στη βάση δεδομένων του Sqlserver και ακολουθεί μια λεπτομερής εισαγωγή στα χαρακτηριστικά και τη χρήση των προσωρινών πινάκων στη βάση δεδομένων SQL, μόνο για αναφορά.
Οι προσωρινοί πίνακες είναι παρόμοιοι με τους μόνιμους πίνακες, αλλά οι προσωρινοί πίνακες αποθηκεύονται στο tempdb και διαγράφονται αυτόματα όταν δεν χρησιμοποιούνται πλέον. Υπάρχουν δύο τύποι προσωρινών πινάκων: τοπικοί και καθολικοί. Διακρίνονται από το όνομα, την ορατότητα και τη διαθεσιμότητα.
Ο προσωρινός πίνακας έχει τα ακόλουθα χαρακτηριστικά:
- Οι τοπικοί προσωρινοί πίνακες είναι πίνακες στους οποίους οι χρήστες προσθέτουν το πρόθεμα "#" κατά τη δημιουργία πινάκων, οι οποίοι είναι ανεξάρτητοι σύμφωνα με τις συνδέσεις της βάσης δεδομένων. Μόνο η σύνδεση βάσης δεδομένων που δημιούργησε τον τοπικό προσωρινό πίνακα έχει πρόσβαση στον πίνακα και άλλες συνδέσεις δεν μπορούν να έχουν πρόσβαση στον πίνακα.
- Σε διαφορετικές συνδέσεις βάσεων δεδομένων, αν και οι τοπικοί προσωρινοί πίνακες που δημιουργούνται έχουν το ίδιο "όνομα", αυτοί οι πίνακες δεν έχουν καμία σχέση μεταξύ τους. Στον SQLSERVER, ένας ειδικός μηχανισμός ονομασίας διασφαλίζει την ανεξαρτησία των τοπικών προσωρινών πινάκων στις συνδέσεις βάσεων δεδομένων.
- Οι πραγματικοί προσωρινοί πίνακες εκμεταλλεύονται τον προσωρινό χώρο πινάκων της βάσης δεδομένων, ο οποίος διατηρείται αυτόματα από το σύστημα βάσης δεδομένων, εξοικονομώντας έτσι χώρο στον πίνακα. Και επειδή ο προσωρινός χώρος πινάκων χρησιμοποιεί γενικά εικονική μνήμη, ο αριθμός των εισόδων/εξόδων στον σκληρό δίσκο μειώνεται σημαντικά, επομένως βελτιώνεται και η απόδοση του συστήματος.
- Ο προσωρινός πίνακας αδειάζει αυτόματα μετά την ολοκλήρωση της συναλλαγής ή της περιόδου λειτουργίας, επομένως δεν χρειάζεται να θυμάστε να διαγράψετε τα δεδομένα μετά την εξάντλησή τους.
Τοπικοί προσωρινοί πίνακες
Το όνομα του τοπικού προσωρινού πίνακα έχει πρόθεμα με ένα μόνο αριθμητικό σύμβολο (#). Είναι ορατά μόνο στην τρέχουσα σύνδεση χρήστη (δηλαδή στη σύνδεση που δημιουργεί τον τοπικό προσωρινό πίνακα). Διαγράφεται όταν ένας χρήστης αποσυνδέεται από μια παρουσία του SQL Server.
Για παράδειγμα, δημιουργούμε έναν τοπικό προσωρινό πίνακα σε μια σύνδεση βάσης δεδομένων με την ακόλουθη δήλωση: #Temp
Σύνδεση βάσης δεδομένων 1:
Στη συνέχεια, ξεκινήστε τη σύνδεση βάσης δεδομένων 2 ταυτόχρονα για να εκτελέσετε το ερώτημα #temp
Σύνδεση βάσης δεδομένων 2:
Ας δούμε ποιο είναι το αποτέλεσμα της σύνδεσης βάσης δεδομένων 2;
Σύνδεση βάσης δεδομένων 2:
Τα αποτελέσματα δείχνουν ότι η σύνδεση βάσης δεδομένων 2 δεν μπορεί να βρει #Temp πίνακα. Αυτό σημαίνει ότι ο προσωρινός πίνακας #Temp είναι ορατός μόνο στη σύνδεση βάσης δεδομένων 1 που τον δημιούργησε, αλλά όχι στη σύνδεση βάσης δεδομένων 2.
Καθολικός προσωρινός πίνακας
Το όνομα ενός καθολικού προσωρινού πίνακα έχει πρόθεμα δύο αριθμητικά σύμβολα (##) και είναι ορατό σε όλες τις συνδέσεις βάσης δεδομένων κατά τη δημιουργία του και καταργείται όταν όλες οι συνδέσεις βάσης δεδομένων που αναφέρονται στον πίνακα αποσυνδεθούν από τον SQL Server.
Για παράδειγμα, δημιουργούμε έναν καθολικό προσωρινό πίνακα ##Temp σε μια σύνδεση βάσης δεδομένων με την ακόλουθη πρόταση και, στη συνέχεια, εισάγουμε τρεις σειρές δεδομένων
Σύνδεση βάσης δεδομένων 1:
Στη συνέχεια, ρωτάμε ##Temp的数据 στη σύνδεση βάσης δεδομένων 2
Σύνδεση βάσης δεδομένων 2:
Το αποτέλεσμα της σύνδεσης βάσης δεδομένων 2 έχει ως εξής
Σύνδεση βάσης δεδομένων 2:
Όπως μπορείτε να δείτε, η σύνδεση βάσης δεδομένων 2 μπορεί να έχει πρόσβαση με επιτυχία στον καθολικό πίνακα θερμοκρασίας ##Temp που δημιουργήθηκε από τη σύνδεση βάσης δεδομένων 1, αλλά αν κλείσουμε τη σύνδεση δεδομένων 1 τώρα και στη συνέχεια εκτελέσουμε το ##Temp查询语句会发生什么呢 της σύνδεσης βάσης δεδομένων 2; Τα αποτελέσματα έχουν ως εξής:
Κλείστε τη σύνδεση βάσης δεδομένων 1 και, στη συνέχεια, η σύνδεση βάσης δεδομένων 2 εκτελείται ξανά:
Διαπιστώσαμε ότι μετά το κλείσιμο της σύνδεσης βάσης δεδομένων 1, η σύνδεση βάσης δεδομένων 2 δεν μπορεί να βρει τον καθολικό προσωρινό πίνακα ##Temp了. Αυτό συμβαίνει επειδή μετά το κλείσιμο της σύνδεσης βάσης δεδομένων 1, δεν υπάρχει καμία δήλωση στη σύνδεση βάσης δεδομένων 2 που να χρησιμοποιεί τον προσωρινό πίνακα ##Temp, επομένως ο sqlserver πιστεύει ότι δεν υπάρχει σύνδεση βάσης δεδομένων που να αναφέρεται στον καθολικό προσωρινό πίνακα ##Temp了 αυτήν τη στιγμή, επομένως θα ##Temp释放掉了.
Στη συνέχεια, προσπαθούμε να κλείσουμε τον καθολικό πίνακα θερμοκρασίας ##Temp持有事务中的排他锁 (X-lock) στη σύνδεση βάσης δεδομένων 2 και, στη συνέχεια, να κλείσουμε τη σύνδεση βάσης δεδομένων 1.
Σύνδεση βάσης δεδομένων 1:
Σύνδεση βάσης δεδομένων 2:
Κλείστε τη σύνδεση βάσης δεδομένων 1 και, στη συνέχεια, εκτελείται η σύνδεση βάσης δεδομένων 2:
Το αποτέλεσμα δείχνει ότι παρόλο που κλείνουμε τη σύνδεση βάσης δεδομένων 1, επειδή η σύνδεση βάσης δεδομένων 2 διατηρεί τον καθολικό προσωρινό πίνακα ##Temp的排他锁 (κλείδωμα X) στη συναλλαγή, τον προσωρινό πίνακα # #Temp并没有随着数据库连接1的关闭而被释放掉, εφόσον η συναλλαγή που ξεκίνησε στη σύνδεση βάσης δεδομένων 2 δεν έχει επαναφερθεί ή δεσμευτεί, τότε η σύνδεση βάσης δεδομένων 2 θα διατηρεί πάντα τον προσωρινό πίνακα ##Temp的排他锁. Αυτή τη στιγμή, ο Sqlserver θα πιστεύει ότι υπάρχει ακόμα μια σύνδεση βάσης δεδομένων που αναφέρεται στον καθολικό πίνακα θερμοκρασίας ##Temp, άρα ##Temp不会被释放掉. |