Έβλεπα τους ανώτερους προγραμματιστές μου να χρησιμοποιούν το WITH (NOLOCK) όταν έκαναν ερωτήματα στον SQL Server και αναρωτιόμουν γιατί χρησιμοποιούν. Τώρα το εξερεύνησα και διαπίστωσα ότι είναι χρήσιμο να βελτιωθεί η απόδοση κατά την εκτέλεση του ερωτήματος . Ωστόσο, υπάρχει ένα μειονέκτημα στη χρήση του. Το μειονέκτημα είναι ότι κάποιος μπορεί να μην είναι σίγουρος ότι λαμβάνει τα δεδομένα που ενημερώνονται αυτήν τη στιγμή στον Πίνακα, δηλαδή, Χωρίς προστασία κλειδώματος, δεν μπορείτε να είστε σίγουροι ότι τα δεδομένα δεν είναι Αλλάζει κατά τη διάρκεια του χρόνου εκτέλεσης του ερωτήματος. Παρέπεμψα αυτόν τον σύνδεσμο και τον βρήκα αρκετά χρήσιμο.
Για να βελτιωθεί η απόδοση του ερωτήματος SQL, σε γενικές γραμμές, το πρώτο μέλημα είναι η δημιουργία ενός ευρετηρίου. Στην πραγματικότητα, εκτός από τη δημιουργία ευρετηρίων, όταν τοποθετούμε εντολές SQL, η προσθήκη μιας ενότητας ΜΕ (NOLOCK) στη σύνταξη μπορεί να βελτιώσει το φαινόμενο του κλειδώματος των συνόλων δεδομένων σε ένα περιβάλλον με μεγάλο αριθμό διαδικτυακών ερωτημάτων, βελτιώνοντας έτσι την απόδοση του ερωτήματος.
Ωστόσο, ένα πράγμα που πρέπει να σημειωθεί είναι ότι το SQL SELECT με (NOLOCK) μπορεί να προκαλέσει βρώμικη ανάγνωση.
Για παράδειγμα:
Επειδή ο SQL Server εκτελεί τον αντίστοιχο έλεγχο συνέπειας κλειδώματος. Για να βελτιώσετε τη συνολική απόδοση του ερωτήματος της βάσης δεδομένων, προσθέστε το WITH (NOLOCK) στο τέλος του ονόματος του πίνακα στη σύνταξη SELECT, αν και το (NOLOCK) είναι επίσης αποδεκτό, αλλά η Microsoft εξακολουθεί να συνιστά την προσθήκη WITH.
Εκτός από το απλό SELECT, μπορείτε επίσης να χρησιμοποιήσετε τη σύνταξη SELECT με το JOIN. Αλλά οι εντολές DELETE, INSERT, UPDATE και άλλες εντολές που απαιτούν συναλλαγές δεν είναι καλές...
Ορισμένα αρχεία λένε ότι η αποτελεσματικότητα των ερωτημάτων SQL μπορεί να αυξηθεί κατά 33% με το WITH (NOLOCK). Η προσθήκη WITH (NOLOCK) λέει στον SQL Server ότι η εντολή SELECT δεν χρειάζεται να λαμβάνει υπόψη την κατάσταση κλειδώματος συναλλαγών του τρέχοντος πίνακα, επομένως η απόδοση θα βελτιωθεί σημαντικά και το φαινόμενο κλειδώματος του συστήματος βάσης δεδομένων θα μειωθεί σημαντικά (συμπεριλαμβανομένου του dead lock).
Ένα πράγμα που πρέπει να σημειωθεί είναι ότι επειδή το WITH (NOLOCK) δεν λαμβάνει υπόψη το κλείδωμα συναλλαγών του τρέχοντος πίνακα, οπότε όταν υπάρχουν κάποια δεδομένα σε πολλαπλές φάσεις μιας συναλλαγής (π.χ. μια συναλλαγή σε πολλούς πίνακες - > όπως ένα σύστημα ανάληψης), το WITH (NOLOCK) θα αγνοήσει τα δεδομένα που επεξεργάζεται αυτήν τη στιγμή τη διαδικασία συναλλαγής...
Για να το θέσω ωμά, δηλαδή όταν χρησιμοποιείτε το NoLock, επιτρέπει την ανάγνωση δεδομένων που έχουν τροποποιηθεί αλλά η συναλλαγή δεν έχει ακόμη ολοκληρωθεί. Επομένως, εάν πρέπει να λάβετε υπόψη την ακεραιότητα των δεδομένων συναλλαγών σε πραγματικό χρόνο, θα πρέπει να σκεφτείτε προσεκτικά τη χρήση του WITH (NOLOCK).
Εάν δεν χρειάζεται να λάβετε υπόψη τις συναλλαγές, το WITH (NOLOCK) μπορεί να είναι μια χρήσιμη αναφορά.
Σημείωση 1: ΜΕ ( < table_hint > ) Καθορίζει τη σάρωση πίνακα, ένα ή περισσότερα ευρετήρια που χρησιμοποιούνται από τη βελτιστοποίηση ερωτήματος, Ή από το εργαλείο βελτιστοποίησης ερωτήματος για να αξιοποιήσετε αυτόν τον πίνακα δεδομένων και να χρησιμοποιήσετε τη λειτουργία κλειδώματος για αυτήν την πρόταση.
Σημείωση 2: Το WITH (NOLOCK) ισοδυναμεί με το READ UNCOMMITTED
Τέλος, ας μιλήσουμε για μερικές μικρές διαφορές μεταξύ nolock και with(nolock): 1: Συνώνυμα στο SQL05, υποστηρίζεται μόνο με (nolock). 2: με (nolock) γράφεται πολύ εύκολα και στη συνέχεια καθορίστε το ευρετήριο. Όταν κάνετε ερωτήματα σε δηλώσεις σε διακομιστές, δεν μπορείτε να χρησιμοποιήσετε με (nolock), μόνο nolock Κατά την υποβολή ερωτημάτων στον ίδιο διακομιστή, μπορούν να χρησιμοποιηθούν και τα δύο με (nolock) και nolock Όπως αυτό που Κώδικας SQL επιλέξτε * από [IP].a.dbo.table1 με (nolock) Αυτό θα σας ζητήσει το σφάλμα επιλέξτε * από a.dbo.table1 με (nolock) Αυτό θα λειτουργήσει |