Αντιμετώπιση προβλημάτων αποθηκευμένη διαδικασία recompilation

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 243586 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Αυτό το άρθρο ασχολείται με ένα συγκεκριμένο τύπο επιδόσεων το ζήτημα που ενδέχεται να αντιμετωπίσετε εφαρμογών με το Microsoft SQL Server: το χρόνο εκτέλεσης recompilation των αποθηκευμένων διαδικασιών. Εάν αντιμετωπίζετε προβλήματα επιδόσεις το ζήτημα, αλλά έχετε προσδιορίσει ότι αυτή είναι η ακριβής προέλευση του σας το πρόβλημα, ανατρέξτε στο ακόλουθο άρθρο της Microsoft Knowledge Base πριν διαδικασία:

224587ΔΙΑΔΙΚΑΣΙΕΣ: Αντιμετώπιση προβλημάτων επιδόσεων εφαρμογών με τον SQL Server
Αυτό το άρθρο προϋποθέτει ότι έχετε χρησιμοποιήσει που το άρθρο για να περιορίσετε το εύρος του προβλήματος και ότι καταγράψετε μια Trace Profiler του SQL Server με τις συγκεκριμένες στήλες συμβάντα και δεδομένα λεπτομερείς μέσα σε αυτό.

Περισσότερες πληροφορίες

Όταν ένας χρήστης εκτελεί μια αποθηκευμένη διαδικασία, εάν δεν υπάρχει υπάρχει ήδη στη μνήμη cache, SQL Server φορτώνει τη διαδικασία και δημιουργεί ένα ερώτημα το σχέδιο. Το μεταγλωττισμένο σχέδιο είναι αποθηκευμένο στη μνήμη cache και είναι εκ νέου από μεταγενέστερες καλούντες της αποθηκευμένης διαδικασίας μέχρι να παρουσιαστεί κάποια ενέργεια για να ακυρώσει το σχέδιο και επιβάλλει έναν recompilation. Οι ακόλουθες ενέργειες μπορεί να προκαλέσει recompilation από μια σχέδιο αποθηκευμένη διαδικασία:
  • Χρήση του όρου με μεταγλωττίσετε ΞΑΝΆ στη ΔΙΑΔΙΚΑΣΊΑ ΔΗΜΙΟΥΡΓΊΑΣ ή Πρόταση EXECUTE.
  • Αλλαγές σχήματος σε οποιοδήποτε από τα αντικείμενα που αναφέρθηκαν, συμπεριλαμβανομένων Προσθήκη ή την απόρριψη περιορισμούς, προεπιλογές ή κανόνες.
  • Εκτέλεσηsp_recompileγια έναν πίνακα που αναφέρεται από τη διαδικασία.
  • Επαναφορά της βάσης δεδομένων που περιέχει τη διαδικασία ή οποιαδήποτε τα αντικείμενα στις αναφορές διαδικασία (Εάν πραγματοποιείτε μεταξύ-βάση δεδομένων Οι λειτουργίες).
  • Επαρκή δραστηριότητα διακομιστή που προκαλεί το σχέδιο να είναι ηλικίας άνω του χώρου προσωρινής αποθήκευσης.
Υπάρχει όλους αυτούς τους λόγους για μεταγλωττίζοντας ξανά μια αποθηκευμένη διαδικασία σε παλαιότερες εκδόσεις, και προκάλεσε το σχέδιο να μεταγλωττίσετε ξανά πριν από την αρχή εκτέλεση της διαδικασίας. Στον SQL Server 7.0, εισάγεται μια νέα συμπεριφορά που μπορεί να προκαλέσει μια αποθηκευμένη διαδικασία για να μεταγλωττίσετε ξανά κατά την εκτέλεση. Αυτό το νέο η συμπεριφορά εξασφαλίζει ότι η "Βελτιστοποίηση" έχει πάντα το καλύτερο σχέδιο για κάθε συγκεκριμένη πρόταση μέσα σε μια διαδικασία. Τα παρακάτω συμβάντα μπορεί να προκαλέσει μια recompilation εκτέλεση μιας αποθηκευμένης διαδικασίας:
  • Αλλαγές στα δεδομένα ενός πίνακα που είναι επαρκές ποσοστό αναφέρεται από την αποθηκευμένη διαδικασία.
  • Η διαδικασία interleaves γλώσσας ορισμού δεδομένων (DDL) και λειτουργίες γλώσσα χειρισμού δεδομένων (DML).
  • Η διαδικασία εκτελεί συγκεκριμένες λειτουργίες στα προσωρινά πίνακες.
Κάθε μία από αυτές τις αιτίες εξετάζεται με περισσότερες λεπτομέρειες σε αυτό το άρθρο.

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


Οι ακόλουθες πληροφορίες σε αυτό το άρθρο επικεντρώνεται στο τον προσδιορισμό της αιτίας του χρόνου εκτέλεσης αποθηκευμένη διαδικασία εναναμεταγλωττίσεων και αναλύει Μπορείτε να χρησιμοποιήσετε για να αποτρέψετε τις μεθόδους.

Βέλτιστες πρακτικές

Είναι καλύτερα να κατόχου χαρακτηρίζονται αποθηκευμένη διαδικασία όταν τα ονόματα που η εκτέλεση μιας διαδικασίας. Αυτό επιτρέπει μεγαλύτερη σαφήνεια και πιο εύκολη επαναχρησιμοποίηση του υπάρχον σχέδιο εκτέλεσης από τον τρέχοντα χρήστη. Για παράδειγμα, εάν ένας χρήστης που δεν είναι ο κάτοχος της βάσης δεδομένων (dbo) εκτελεί ανήκει dbo αποθηκευμένη διαδικασία (που ονομάζεταιmyProcσε αυτό το παράδειγμα) με τοPubsβάση δεδομένων, χρησιμοποιήστε την ακόλουθη δήλωση:
exec dbo.myProc
				
Αντί για αυτό:
exec myProc
				
Η τεχνική αυτή εξαλείφει σύγχυση σχετικά με άλλες πιθανές εκδόσεις του η διαδικασία από διαφορετικούς κατόχους από την πλευρά κωδικοποίησης και συντήρησης, και επιτρέπει επίσης σε SQL Server για να αποκτήσετε πρόσβαση στο σχέδιο εκτέλεσης για τη συγκεκριμένη διαδικασία πιο άμεσα.

Από δεν απολαύουν το όνομα κατόχου, εισάγει SQL Server ο κωδικός μεταγλώττισης και αποκτά ένα κλείδωμα ΜΕΤΑΓΛΏΤΤΙΣΗΣ για τη διαδικασία. Ωστόσο, τελικά Καθορίζει ότι ένα νέο σχέδιο δεν απαιτείται (με την προϋπόθεση δεν εφαρμόσετε λόγους), ώστε να μεταγλωττίσετε ξανά το σχέδιο σε αυτό το σημείο επειδή για την ΕΚΤΕΛΕΣΗ προσόντων. Ωστόσο, το επιπλέον βήμα γρήγορα μια ΜΕΤΑΓΛΏΤΤΙΣΗΣ κλείδωμα για το διαδικασία μπορεί να προκαλέσει διένεξη αποκλεισμού σε σοβαρές περιπτώσεις. Αναφέρεται σε Q263889 INF: SQL αποκλεισμός παράδοσης κλειδωμάτων [[ΜΕΤΑΓΛΏΤΤΙΣΗΣ]] για περισσότερες λεπτομέρειες σχετικά με αυτήν την κατάσταση.

Εάν ο κάτοχος που χαρακτηρίζονται με owner.procedure η κλήση της διαδικασίας, κάνετε δεν χρειάζεται να αποκτά το κλείδωμα μεταγλώττισης, ώστε να μειώνεται η διένεξη.

Προσδιορισμός και επίλυση προβλημάτων

Εάν δεν το έχετε κάνει ήδη, ανατρέξτε στο ακόλουθο άρθρο της Microsoft Knowledge Base για λεπτομέρειες σχετικά με την καταγραφή δεδομένων Profiler για να σας βοηθήσει Αναλύστε τις επιδόσεις του συστήματός σας:
224587ΔΙΑΔΙΚΑΣΙΕΣ: Αντιμετώπιση προβλημάτων επιδόσεων εφαρμογών με τον SQL Server

Προβολή των δεδομένων δημιουργίας προφίλ

Δημιουργία προφίλ διακομιστή SQL περιλαμβάνει έναSP:Recompileσυμβάν που χρησιμοποιείτε για να παρακολουθείτε τον αριθμό των recompiles Εμφάνιση. ΤοSP:Recompileτο συμβάν συμβαίνει κάθε φορά που μια αποθηκευμένη διαδικασία μεταγλώττιση κατά τη διάρκεια εκτέλεση.
  • Για να ομαδοποιήσετε το ίχνος Profiler από την κλάση συμβάντων

    1. Σχετικά με τηνΤο αρχείομενού, κάντε κλικ στο κουμπίΙδιότητες.
    2. Σχετικά με τηνΣτήλες δεδομένωνTAB, χρησιμοποιήστε το κουμπί "UP" για να μετακινήσετε τοΗ κλάση συμβάντωνκαιΚείμενοκάτω από τηνΟμάδεςεπικεφαλίδα, μεΗ κλάση συμβάντωνπρώτη. Χρησιμοποιήστε το κουμπί ΚΆΤΩ για να καταργήσετε όλες τις άλλες στήλες στην περιοχή τουΟμάδεςεπικεφαλίδα.
    3. Κάντε κλικ στο κουμπίOK.
    Ελέγξτε τον αριθμό τηςSP:Recompileσυμβάντα.

    Μπορείτε να αναπτύξετε την ομάδα SP:Recompile για να δείτε τις λεπτομέρειες των μεμονωμένων εμφανίσεων. ΤοΚείμενοστήλη του συμβάντος δηλώνει το όνομα της αποθηκευμένης διαδικασίας που ανασύνθεση του. Εάν πολλές διαδικασίες που προκαλούν recompiles, ταξινομούνται ο αριθμός των εμφανίσεων. Εάν έχετε μεγάλο αριθμόSP:Recompileτα συμβάντα και να αντιμετωπίζετε μεγάλη χρήση της CPU, εστίαση σε αναλύει τις διαδικασίες που έχουν το μεγαλύτερο αριθμό recompiles. Σημείωση το σύστημα επεξεργαστεί Αναγνωριστικό (SPID) και την ώρα έναρξης τηςSP:Recompileσυμβάν για μία περίοδο λειτουργίας του το συγκεκριμένο αποθηκευμένες διαδικασίες και Ακολουθήστε τα παρακάτω βήματα.

    Εάν δεν βλέπετε καμίαSP:Recompileσυμβάντα, αλλά εξακολουθείτε να αντιμετωπίζετε δυσκολίες επιδόσεων, ανατρέξτε στο θέμα στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
    224587ΔΙΑΔΙΚΑΣΙΕΣ: Αντιμετώπιση προβλημάτων επιδόσεων εφαρμογών με τον SQL Server
  • Προσδιορίστε τη δήλωση που ενεργοποίησε το συμβάν μεταγλωττίστε

    1. Σχετικά με τηνΤο αρχείομενού, κάντε κλικ στο κουμπίΙδιότητες.
    2. Σχετικά με τηνΣτήλες δεδομένωνTAB, χρησιμοποιήστε το κουμπί "ΚΆΤΩ" για να καταργήσετε όλες τις άλλες στήλες στην περιοχή τουΟμάδεςεπικεφαλίδα.
    3. Σχετικά με τηνΣυμβάνταη καρτέλα, καταργήστε όλα τα συμβάντα εκτός απόSP: εκκίνηση,SP:StmtStarting,SP:Recompile, καιSP: ολοκληρώθηκε. Εάν δεν καταγράψετε τοSP:StmtStartingσυμβάν, μπορείτε να αντικαταστήσετεSP:StmtCompleted, αλλά δεν περιλαμβάνουν και τα δύο επειδή με αυτόν τον τρόπο διπλασιάζεται ώστε το ποσό του πληροφορίες που χρειάζεστε για την αναζήτηση.
    4. Αν έχετε προσδιορίσει μια συγκεκριμένη παρουσία ενός αποθηκευμένη διαδικασία recompilation να εξετάσει, μπορείτε να περιορίσετε τα δεδομένα που προβάλλετε σε το συγκεκριμένο SPID και το χρονικό πλαίσιο της εμφάνισης, χρησιμοποιώντας τηνΦίλτραστην καρτέλα.
    5. Κάντε κλικ στο κουμπίOK.

    ΤοSP:Recompileτο συμβάν θα αυξηθεί απευθείας από τοSP:StmtStartedσυμβάν της δήλωσης της αποθηκευμένης διαδικασίας που προκάλεσε το recompilation. Αφού ολοκληρωθεί το συμβάν μεταγλωττίστε, θα δείτε μια επανάληψη της τοSP:StmtStartedσυμβάν, που υποδηλώνει ότι η εντολή εκτελείται με τα πρόσφατα το σχέδιο που δημιουργήθηκε.

    Εξετάστε το ακόλουθο παράδειγμα:
    use pubs
    go
    drop procedure RecompProc 
    go
    create procedure RecompProc as
    create table #t (a int)
    select * from #t
    go
    exec RecompProc
    						
    Εάν εκτελέσετε αυτόν τον κώδικα στο Query Analyzer και προβάλετε τα παραπάνω συμβάντα στο ένα ίχνος Profiler, θα εμφανιστεί η παρακάτω ακολουθία:

    Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
    Η κλάση συμβάντωνΚείμενο
    SP: εκκίνησηRecompProc
    SP:StmtStartingΔημιουργία πίνακα # t (int)
    SP:StmtStartingΕπιλέξτε * από # t
    SP:RecompileRecompProc
    SP:StmtStartingΕπιλέξτε * από # t
    SP: ολοκληρώθηκεRecompProc


    Μπορείτε να καταλάβετε αμέσως που την πρόταση που caused ήταν το recompilation:
    select * from #t
    						
    Γιατί εμφανίζεται τόσο πριν όσο και μετά τηνSP:Recompileτο συμβάν.

    Εάν είχε καταγραφεί μόνο τουSP:StmtCompletedσυμβάν, αλλά δεν τοSP:StmtStartingτο συμβάν, τοSP:Recompileεμφανίζεται ακριβώς πριν από την πρόταση η οποία προκάλεσε ως παρακάτω:

    Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
    Η κλάση συμβάντωνΚείμενο
    SP: εκκίνησηRecompProc
    SP:RecompileRecompProc
    SP:StmtCompletedΕπιλέξτε * από # t
    SP: ολοκληρώθηκεRecompProc


    Μπορείτε να δείτε ότι τοSP:Recompileτο συμβάν ενεργοποιείται πριν από τοSP:StmtCompletedσυμβάν για το "επιλέξτε * από # t" πρόταση, η οποία προκάλεσε την recompilation. Αυτό είναι κατανοητό, καθώς η πρόταση δεν μπορεί να ολοκληρωθεί μέχρι Όταν δημιουργείται το νέο σχέδιο ερωτήματος για το μεταγλωττίστε. Όλα τα υπόλοιπα από τα Παραδείγματα σε αυτό το άρθρο χρήση τουSP:StmtStartingτο συμβάν. Εάν καταγράψετε μόνο τοSP:StmtCompletedσυμβάν, μην ξεχνάτε να προβάλετε τη δήλωση μετά τοSP:Recompile, όπως εξηγείται ανωτέρω.

    Σημειώστε ότι αν εκτελείτε αυτό ιδιαίτερα αποθηκευμένη διαδικασία πολλές φορές, SQL Server θα χρησιμοποιήσετε πάλι την υπάρχουσα Πρόκειται για αυτήν τη διαδικασία. Θα δείτε το συμβάν μεταγλωττίστε μόνο στην πρώτη εκτέλεση της διαδικασίας, ή αν η απόθεση και δημιουργήστε ξανά τη διαδικασία, κάθε ο χρόνος εκτέλεσης της δέσμης ενεργειών. Ο λόγος για το recompilation σε αυτό το συγκεκριμένο περίπτωση εξετάζεται στο "εναναμεταγλωττίσεων προς παράδοση παρεμβολής ορισμό δεδομένων Ενότητα Language (DDL) και λειτουργίες (DML) γλώσσα χειρισμού δεδομένων"του παρόντος του άρθρου. Αυτό είναι απλώς ένα παράδειγμα για να απεικονίζουν τον τρόπο εύκολα προσδιορισμού πρόταση προκαλεί την recompilation.

Εναναμεταγλωττίσεων οφείλεται σε σειρά τροποποιήσεων

Εάν έχει αλλάξει ένα επαρκές ποσοστό των δεδομένων σε έναν πίνακα αναφέρεται από μια αποθηκευμένη διαδικασία από τη στιγμή που έγινε το αρχικό σχέδιο ερωτήματος δημιουργείται, SQL Server θα μεταγλωττίσετε την αποθηκευμένη διαδικασία για να βεβαιωθείτε ότι έχει ένα σχέδιο με βάση τα πιο ενημερωμένα στατιστικά στοιχεία. Για παράδειγμα, σκεφτείτε η ακόλουθη αποθηκευμένη διαδικασία:
drop procedure RowModifications 
go
create procedure RowModifications as
-- assume SomeTable exists with the same definition as #t, 
-- and has over 1000 rows
create table #t (a int, b char(10))
select * from #t
insert #t select * from SomeTable
select count(*) from #t  where a = 37
go
exec RowModifications
exec RowModifications
				
Για την εκτέλεση δεύτερης τοRowModificationsη διαδικασία, θα δείτε τα ακόλουθα συμβάντα στο Δημιουργία προφίλ:

Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η κλάση συμβάντωνΚείμενο
SP: εκκίνησηRowModifications
SP:StmtStartingΔημιουργία πίνακα t # (ένα int, β CHAR(10))
SP:StmtStartingΕπιλέξτε * από # t
SP:StmtStartingΕισαγάγετε, επιλέξτε t # * από SomeTable
SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από # t, όπου a = 37
SP:RecompileRowModifications
Auto-UpdateStatsένα
SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από # t, όπου a = 37
SP: ολοκληρώθηκεRowModifications

ΣΗΜΕΊΩΣΗ:Επίσης θα εμφανίζει την πρώτη εκτέλεση ενόςSP:Recompileσυμβάν για το "επιλέξτε * από # t" δήλωση. Ο λόγος για την recompilation σε αυτήν τη συγκεκριμένη περίπτωση γίνεται λόγος στο "εναναμεταγλωττίσεων παράδοσης προς Παρεμβολή Data Definition Language (DDL) και γλώσσα χειρισμού δεδομένων Ενότητα λειτουργίες (DML)"αυτού του άρθρου. Αυτό το παράδειγμα, η εστίαση σε τοSP:Recompileφαίνεται παραπάνω επειδή συμβαίνει κάθε φορά που εφαρμόζεται η διαδικασία να εκτελεστεί.

Σε αυτό το παράδειγμα, "επιλέξτε οι συναρτήσεις count(*) από # t όπου ένα = 37" προκαλεί ένα recompilation της διαδικασίας οφείλεται στην αλλαγή του αριθμού γραμμών από τη δημιουργία του πίνακα. Η παρουσία τουAuto-UpdateStatsσυμβάν επιβεβαιώνει ότι το recompilation οφειλόταν σε γραμμή τροποποιήσεις. ΤοΚείμενοστήλη επισημαίνει τη στήλη για την οποία είχαν τα στατιστικά στοιχεία τροποποίηση.

Όταν δημιουργήθηκε στον πίνακα t #, τον αριθμό των γραμμών είναι μηδέν. Το σχέδιο για την αρχική "επιλέξτε * από # t" έχει αναπτυχθεί με το πλήθος γραμμών, καθώς και το σχέδιο για το ερώτημα "επιλογή count (*)". Ωστόσο, πριν από την "επιλογή οι συναρτήσεις count(*)" εκτελείται, 1.000 νέες γραμμές εισάγονται στον πίνακα t #. Επειδή μια επαρκή ποσότητα δεδομένων έχει αλλάξει, η βελτιστοποίηση μεταγλώττιση διαδικασία που εξασφαλίζει ότι επιλέγει το πιο αποτελεσματικό σχέδιο για το η πρόταση. Recompilation αυτό θα συμβεί σε κάθε εκτέλεση της αποθηκευμένης διαδικασία, επειδή το σημείο παρεμβολής 1.000 γραμμές πάντα θα προβληθεί ως αρκετά σημαντικά ώστε να δικαιολογούν την recompilation.

Ο αλγόριθμος SQL Server χρησιμοποιεί για να καθορίσει αν θα πρέπει να μεταγλωττιστούν ξανά ένα σχέδιο είναι το ίδιο αλγόριθμο χρησιμοποιείται για την αυτόματη ενημέρωση στατιστικών στοιχείων, όπως περιγράφεται στο ακόλουθο άρθρο της Microsoft (Knowledge Base):
195565INF: SQL Server 7.0 και SQL Server 2000 Autostats λειτουργίας
Στο παραπάνω παράδειγμα, η αποθηκευμένη διαδικασία είναι μικρό αρκετά ότι το recompilation θα έχει κάποιο αξιοπρόσεκτο αποτέλεσμα απόδοση. Ωστόσο, εάν έχετε μια μεγάλη αποθηκευμένη διαδικασία που πραγματοποιεί παρόμοιες δραστηριότητες, με αποτέλεσμα πολλές εναναμεταγλωττίσεων, ενδέχεται να παρατηρήσετε μια υποβάθμιση των επιδόσεων.

Υπάρχουν οι ακόλουθες μέθοδοι για την αντιστάθμιση των εναναμεταγλωττίσεων οφείλεται σε σειρά τροποποιήσεων:
  • Εκτελέστε τη χρήση της πρότασηsp_executesql.
    Αυτή είναι η προτιμώμενη μέθοδος. Οι προτάσεις που εκτελείται με χρήση τουsp_executesqlαποθηκευμένη διαδικασία δεν χρησιμοποιείται ως μέρος της αποθηκευμένης διαδικασίας το σχέδιο. Επομένως, όταν εκτελείται η πρόταση, SQL Server θα είναι ελεύθερα να Χρησιμοποιήστε ένα υπάρχον σχέδιο στο χώρο προσωρινής αποθήκευσης για την πρόταση ή να δημιουργήσετε ένα νέο σε το χρόνο εκτέλεσης. Και στις δύο περιπτώσεις, είναι το σχέδιο της κλήσης αποθηκευμένης διαδικασίας δεν επηρεάζεται και δεν χρειάζεται να μεταγλωττιστούν ξανά.

    Η πρόταση EXECUTE θα έχετε το ίδιο αποτέλεσμα. Ωστόσο, δεν συνιστάται. Χρήση της ΕΚΤΈΛΕΣΗΣ η πρόταση δεν είναι όσο αποτελεσματική χρήσηsp_executesqlεπειδή δεν επιτρέπει για τον ορισμό παραμέτρων από το το ερώτημα.

    ΤοRowModificationsδιαδικασία που αναφέρονται ανωτέρω, μπορεί να εγγραφεί για να χρησιμοποιήσετεsp_executesqlως εξής:

    drop procedure RowModifications2 
    go
    create procedure RowModifications2 as
    set nocount on
    -- assume SomeTable exists with the same definition as #t, 
    -- and has over 1000 rows
    create table #t (a int, b char(10))
    select * from #t
    insert #t select * from SomeTable
    exec sp_executesql N'select count(*) from #t where a = @a', 
                       N'@a int', @a =  37
    go
    exec RowModifications2
    exec RowModifications2
    						

    Για την εκτέλεση δεύτερης τοRowModifications2η διαδικασία, θα δείτε τα ακόλουθα συμβάντα στο Δημιουργία προφίλ:

    Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
    Η κλάση συμβάντωνΚείμενο
    SP: εκκίνησηRowModifications2
    SP:StmtStartingΔημιουργία πίνακα t # (ένα int, β CHAR(10))
    SP:StmtStartingΕπιλέξτε * από # t
    SP:StmtStartingΕισαγάγετε, επιλέξτε t # * από SomeTable
    SP:StmtStartingExec sp_executesql N'select Οι συναρτήσεις Count(*) από # t όπου ένα = @ ένα ', N'@a int', @ μια = 37
    SP: εκκίνηση
    SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από # t, όπου a = @ ένα
    Auto-UpdateStatsένα
    SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από # t, όπου a = @ ένα
    SP: ολοκληρώθηκε
    SP: ολοκληρώθηκεRowModifications2


    Σημειώστε ότι δεν υπάρχει καμίαSP:Recompileσυμβάντα για ταRowModifications2διαδικασία. Υπάρχουν ολοκληρώθηκεSP: εκκίνησηΓια ναSP: ολοκληρώθηκεσυμβάντα για ταsp_executesqlΚαλέστε το περιβάλλον, και έναAuto-UpdateStatsσυμβάν στήληςένα. Ωστόσο, επειδή αυτή η κλήση είναι έξω από το πλαίσιο της αποθηκευμένης διαδικασία, τοRowModifications2η διαδικασία δεν χρειάζεται να μεταγλωττιστούν ξανά σε αυτήν την περίπτωση.

    Για περισσότερες πληροφορίες σχετικά με τη χρήση τουsp_executesqlαποθηκευμένη διαδικασία, δείτε τα "sp_executesql (Τ-SQL)" και "χρήση θέματα sp_executesql"στα ηλεκτρονικά βιβλία SQL Server Books Online.
  • Χρησιμοποιήστε το sub-procedures για την εκτέλεση των καταστάσεων που είναι προκαλεί την εναναμεταγλωττίσεων.
    Στην περίπτωση αυτή, η πρόταση εξακολουθεί να μπορεί να προκαλέσει μια recompilation, αλλά αντί για νέα μεταγλώττιση μεγάλων κλήσης αποθηκευμένης διαδικασίας, το μόνο θα να μεταγλωττίσετε ξανά το μικρό sub-procedure.
  • Χρησιμοποιήστε την επιλογή ΔΙΑΤΉΡΗΣΗ ΣΧΕΔΙΑΣΜΌ.
    Έχετε προσωρινούς πίνακες ειδικοί κανόνες σχετικά με τις εναναμεταγλωττίσεων που, σε ορισμένες περιπτώσεις, μπορεί να είναι πιο αυστηρές από τον προεπιλεγμένο αλγόριθμο recompilation. Μπορείτε να χρησιμοποιήσετε το ΣΧΈΔΙΟ ΔΙΑΤΉΡΗΣΗ η επιλογή να χαλαρώσετε το κατώφλι προσωρινός πίνακας σε ο προεπιλεγμένος αλγόριθμος. Για περισσότερες πληροφορίες, δείτε το "αποφυγή Recompilation από χρησιμοποιώντας την ΔΙΑΤΉΡΗΣΗ ΣΧΕΔΙΑΣΜΌΣ Η επιλογή"ενότητα αυτού του άρθρου.
ΣΗΜΕΊΩΣΗ:ΤοRowModificationsη διαδικασία είναι ένα παράδειγμα πολύ απλουστευμένη διαδικασία που είναι ανασύνθεση οφείλεται σε σειρά τροποποιήσεων. Διαβάστε τις παρακάτω προειδοποιήσεις όσον αφορά αυτό το παράδειγμα:

  • Παρόλο που το παράδειγμα χρησιμοποιεί έναν προσωρινό πίνακα, αυτή η κατάσταση ισχύει για αποθηκευμένες διαδικασίες που αναφέρουν καθώς και μόνιμη πίνακες. Εάν ένα επαρκής ποσότητα δεδομένων στον αναφερόμενο πίνακα έχει τροποποιηθεί από το δημιουργήθηκε σχεδίου ερωτήματος, θα να μεταγλωττιστούν ξανά την αποθηκευμένη διαδικασία. Το θεωρούνται ως διαφορές στον τρόπο προσωρινούς πίνακες για σκοπούς recompilation περιγράφονται με την αποφυγή Recompilation από χρησιμοποιώντας την ΔΙΑΤΉΡΗΣΗ ΣΧΕΔΙΑΣΜΌΣ επιλογή"" ενότητα αυτού του άρθρου.
  • Επίσης να προκαλέσει την πρώτη εκτελέσεις από τις ανωτέρω δύο διαδικασίες μια recompilation από την πρώτη επιλογή από την t # προσωρινό πίνακα. Τους λόγους για αυτό το recompilation αναφέρονται σε το "εναναμεταγλωττίσεων προς παράδοση παρεμβολής Data Definition Language (DDL) και λειτουργίες γλώσσας (DML) χειρισμού δεδομένων" ενότητα αυτού του άρθρου.
  • Χρησιμοποιήθηκε μια πρόταση "επιλέξτε οι συναρτήσεις count(*) από # t" σε αυτό παράδειγμα, αντί για ένα απλό "επιλέξτε * από # t" δήλωση. Για να αποφευχθεί η υπερβολική εναναμεταγλωττίσεων, SQL Server δεν λαμβάνει υπόψη μεταγλωττίζοντας ξανά "trivial σχέδια" (όπως ως μια επιλογή * από έναν πίνακα) οφείλεται σε σειρά τροποποιήσεων.

Εναναμεταγλωττίσεων οφείλεται σε παρεμβολής Data Definition Language (DDL) και λειτουργίες γλώσσας (DML) χειρισμός δεδομένων

Εάν οι λειτουργίες DDL εκτελούνται μέσα σε μια διαδικασία ή μια δέσμη, το ανασύνθεση διαδικασία ή μια παρτίδα, όταν συναντά την πρώτη μετέπειτα ΟΘΔ η λειτουργία που επηρεάζουν τον πίνακα που αφορά τη γλώσσα DDL.

Σκεφτείτε το Ακολουθεί παράδειγμα αποθηκευμένη διαδικασία:
drop procedure Interleave 
go
create procedure Interleave as
-- DDL
create table t1 (a int)
-- DML
select * from t1
-- DDL
create index idx_t1 on t1(a)
-- DML
select * from t1
-- DDL
create table t2 (a int)
-- DML
select * from t2
go
exec Interleave
				
Εάν εκτελέσετε αυτόν τον κώδικα στο Query Analyzer και προβάλετε τα παραπάνω συμβάντα στο ένα ίχνος Profiler, θα εμφανιστεί η παρακάτω ακολουθία:

Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η κλάση συμβάντωνΚείμενο
SP: εκκίνησηΠαρεμβολής
SP:StmtStartingΔημιουργία πίνακα t1 (int)
SP:StmtStartingΕπιλέξτε * από t1
SP:RecompileΠαρεμβολής
SP:StmtStartingΕπιλέξτε * από t1
SP:StmtStartingΔημιουργία ευρετηρίου idx_t1 σε t1(a)
SP:StmtStartingΕπιλέξτε * από t1
SP:RecompileΠαρεμβολής
SP:StmtStartingΕπιλέξτε * από t1
SP:StmtStartingΔημιουργία πίνακα t2 (int)
SP:StmtStartingΕπιλέξτε * από t2
SP:RecompileΠαρεμβολής
SP:StmtStartingΕπιλέξτε * από t2
SP: ολοκληρώθηκεΠαρεμβολής


Στην περίπτωση αυτή, μεταγλωττιστούν ξανά την αποθηκευμένη διαδικασία τρεις φορές κατά την εκτέλεση. Για να καταλάβετε για ποιο λόγο συμβαίνει αυτό, μπορείτε να τα Βελτιστοποίηση αναπτύσσει ένα σχέδιο για αυτήν την αποθηκευμένη διαδικασία:
  1. Κατά την αρχική κατάρτιση τη διαδικασία, Τ1 πίνακες και δεν υπάρχουν t2. Επομένως, δεν υπάρχει σχέδιο για την αναφορά σε αυτά τα ερωτήματα Μπορείτε να δημιουργήσετε πίνακες. Πρέπει να δημιουργηθούν κατά το χρόνο εκτέλεσης.
  2. Καθώς η διαδικασία εκτελείται για πρώτη φορά, το πρώτο βήμα είναι η δημιουργία πίνακα t1. Το επόμενο βήμα είναι μια επιλογή από τον πίνακα Τ1--που δεν υπάρχει κανένα σχέδιο. Επομένως, η διαδικασία είναι ανασύνθεση σε αυτό το σημείο να Αναπτύξτε ένα σχέδιο για την πρόταση SELECT. Δημιουργείται ένα σχέδιο για το τρέχον Επιλέξτε από Τ1, καθώς και την επιλογή από Τ1 μετά τη δημιουργία του ευρετηρίου. Κανένα σχέδιο είναι δυνατό να δημιουργηθούν για, επιλέξτε το από t2, επειδή δεν υπάρχει ακόμη από t2 ακόμη.
  3. Το επόμενο βήμα είναι να δημιουργήσετε ένα ευρετήριο σε t1. Μετά από αυτό, μια άλλη επιλογή Εκτέλεση Τ1, το οποίο διαθέτει τώρα ένα σχέδιο από το πρώτο να μεταγλωττίσετε ξανά. Ωστόσο, επειδή το σχήμα του Τ1 άλλαξε από το σχέδιο έχει δημιουργηθεί, η διαδικασία πρέπει να είναι ανασύνθεση ξανά για να δημιουργήσετε ένα νέο σχέδιο για την επιλογή από t1. Και επειδή t2 εξακολουθεί να υπάρχει, το σχέδιο δεν μπορεί να είναι που δημιουργήθηκε για την επιλογή από την t.
  4. Στη συνέχεια, δημιουργείται ο πίνακας t2 και είναι η επιλογή από t2 να εκτελεστεί. Επειδή υπάρχει κάποιο πλάνο για δήλωση, η διαδικασία είναι ανασύνθεση σε τελευταία φορά.
Αυτές οι εναναμεταγλωττίσεων που λαμβάνουν χώρα σε κάθε εκτέλεση της αποθηκευμένης διαδικασία. Για να μειώσετε την εναναμεταγλωττίσεων, τροποποιήστε τη διαδικασία για να το κάνετε όλες τις DDL λειτουργίες πρώτα, ακολουθούμενη από λειτουργίες ΟΘΔ, όπως φαίνεται στα παρακάτω:
drop procedure NoInterleave 
go
create procedure NoInterleave as
-- All DDL first
create table t1 (a int)
create index idx_t1 on t1(a)
create table t2 (a int)
-- Then DML 
select * from t1
select * from t1
select * from t2
go
exec NoInterleave 
exec NoInterleave
				
Την πρώτη εκτέλεση τουNoInterleaveη διαδικασία θα εμφανιστούν τα ακόλουθα συμβάντα της δημιουργίας προφίλ:

Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η κλάση συμβάντωνΚείμενο
SP: εκκίνησηNoInterleave
SP:StmtStartingΔημιουργία πίνακα t1 (int)
SP:StmtStartingΔημιουργία ευρετηρίου idx_t1 σε t1(a)
SP:StmtStartingΔημιουργία πίνακα t2 (int)
SP:StmtStartingΕπιλέξτε * από t1
SP:RecompileNoInterleave
SP:StmtStartingΕπιλέξτε * από t1
SP:StmtStartingΕπιλέξτε * από t1
SP:StmtStartingΕπιλέξτε * από t2
SP: ολοκληρώθηκεNoInterleave


Σε αυτή την περίπτωση όλες τις προτάσεις DDL γίνονται προς τα επάνω εμπρός. Η βελτιστοποίηση μεταγλωττίζει αυτήν τη διαδικασία ως εξής:
  1. Κατά την αρχική κατάρτιση τη διαδικασία, Τ1 πίνακες και δεν υπάρχουν t2. Επομένως, δεν υπάρχει σχέδιο για την αναφορά σε αυτά τα ερωτήματα Μπορείτε να δημιουργήσετε πίνακες. Πρέπει να δημιουργηθούν κατά το χρόνο εκτέλεσης.
  2. Τα πρώτα βήματα που εκτελεί τη διαδικασία είναι η γλώσσα DDL λειτουργίες, δημιουργία πινάκων t1 και t2, καθώς και το ευρετήριο σε t1.
  3. Το επόμενο βήμα είναι η πρώτη επιλογή από t1. Επειδή δεν υπάρχει ανασύνθεση του δεν είναι διαθέσιμες για αυτό πρόταση SELECT, η διαδικασία σχέδιο. Επειδή υπάρχουν όλα τα αντικείμενα, τα σχέδια δημιουργούνται για όλους του, ΕΠΙΛΈΞΤΕ προτάσεις στην διαδικασία αυτήν τη στιγμή.
  4. Το υπόλοιπο της διαδικασίας που εκτελείται χρησιμοποιώντας τα σχέδια δημιουργούνται. Επειδή δεν υπάρχουν αλλαγές σε αντικείμενα που αναφέρθηκαν, δεν υπάρχει καμία πρέπει να μεταγλωττίζει τη διαδικασία περαιτέρω.
ΣΗΜΕΊΩΣΗ:Κάνετε τη δεύτερη και τις επόμενες εκτελέσεις χρησιμοποίηση του υφιστάμενου ερώτημα σχέδιο και cache και δεν καταλήγουν σε οποιαδήποτε εναναμεταγλωττίσεων καθόλου. Διαδικασίες που δημιουργία, τροποποίηση ή απόρριψη πίνακες πρέπει να τροποποιηθεί ώστε να εξασφαλίζεται ότι όλες οι προτάσεις DDL βρίσκονται στην αρχή της διαδικασίας.

Εναναμεταγλωττίσεων οφείλεται σε ορισμένες εργασίες προσωρινό πίνακα

Χρήση προσωρινών πινάκων σε μια αποθηκευμένη διαδικασία μπορεί να προκαλέσει την αποθηκευμένη διαδικασία να μεταγλωττιστούν ξανά κάθε φορά που εφαρμόζεται η διαδικασία να εκτελεστεί.

Για να το αποφύγετε, αλλάξτε την αποθηκευμένη διαδικασία, έτσι ώστε να ανταποκρίνεται Οι ακόλουθες απαιτήσεις:
  • Όλες τις προτάσεις που περιέχουν το όνομα ενός προσωρινού πίνακα αναφέρεται σε έναν προσωρινό πίνακα που δημιουργούνται στο ίδιο αποθηκευμένη διαδικασία και όχι σε ένα η κλήση που ονομάζεται αποθηκευμένη διαδικασία ή σε μια συμβολοσειρά εκτελείται με χρήση της ΕΚΤΈΛΕΣΗΣ δήλωση ήsp_executesqlαποθηκευμένη διαδικασία.
  • Όλες τις προτάσεις που περιέχουν το όνομα ενός προσωρινού πίνακα συντακτικά εμφανίζονται μετά τον προσωρινό πίνακα στην αποθηκευμένη διαδικασία ή το έναυσμα.
  • Υπάρχουν προτάσεις δεν ΔΗΛΏΝΟΥΝ ΔΡΟΜΈΑ του οποίου ΕΠΙΛΟΓΉ δηλώσεις παραπέμπει σε έναν προσωρινό πίνακα.
  • Όλες τις προτάσεις που περιέχουν το όνομα του κάθε προσωρινό πίνακα πριν από οποιαδήποτε πρόταση DROP TABLE που αναφέρεται σε έναν προσωρινό πίνακα.

    Δεν είναι απαραίτητα DROP TABLE προτάσεις για προσωρινούς πίνακες που έχουν δημιουργηθεί σε μια αποθηκευμένη διαδικασία. Οι πίνακες καταργούνται αυτόματα κατά τη διαδικασία που έχει ολοκλήρωση.
  • Χωρίς προτάσεις τη δημιουργία ενός προσωρινού πίνακα (για παράδειγμα, ΔΗΜΙΟΥΡΓΊΑ ΠΊΝΑΚΑ ή ΕΠΙΛΈΞΤΕ... ΣΕ) εμφανίζονται σε μια δήλωση ελέγχου ροής, όπως στην Περίπτωση... ΆΛΛΟΣ ή κατά τη ΔΙΆΡΚΕΙΑ.

Αποφυγή Recompilation, χρησιμοποιώντας την επιλογή ΣΧΈΔΙΟ ΔΙΑΤΉΡΗΣΗΣ

Χρήση του προσωρινού πίνακα μέσα σε αποθηκευμένες διαδικασίες παρουσιάζει ορισμένα περίπλοκες διαδικασίες για τη βελτιστοποίηση του ερωτήματος. Το πλήθος γραμμών και στατιστικά στοιχεία Οι πίνακες ποικίλλουν σημαντικά σε όλη τη διάρκεια ζωής του την αποθηκευμένη η διαδικασία εκτέλεσης. Για να βεβαιωθείτε ότι η "Βελτιστοποίηση" χρησιμοποιεί το καλύτερο σχέδιο σε όλα περιπτώσεις που αφορούν προσωρινούς πίνακες, μια ειδική αλγόριθμο αναπτύχθηκε για να έχετε μεγαλύτερη επιθετική με εναναμεταγλωττίσεων. Ο αλγόριθμος δηλώνει ότι, εάν ένας προσωρινός πίνακας δημιουργήθηκε με μια αποθηκευμένη διαδικασία έχει αλλάξει περισσότερο από έξι φορές, η διαδικασία θα ανασύνθεση κατά την επόμενη πρόταση αναφέρει τον προσωρινό πίνακα.

Εξετάστε το ακόλουθο παράδειγμα:
drop procedure useKeepPlan 
go
create procedure useKeepPlan as
create table #t (a int, b char(3))
select * from #t
-- Make greater than 6 changes to #t
insert #t values (1, 'abc')
insert #t values (2, 'abc')
insert #t values (3, 'abc')
insert #t values (4, 'abc')
insert #t values (5, 'abc')
insert #t values (6, 'abc')
insert #t values (7, 'abc')
-- Now reference #t
select count(*) from #t 
--option (KEEP PLAN)
go
exec useKeepPlan
exec useKeepPlan
				
Στην περίπτωση αυτή, θα δείτε τα ακόλουθα συμβάντα στο Profiler για το δεύτερη εκτέλεση:

Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η κλάση συμβάντωνΚείμενο
SP: εκκίνησηuseKeepPlan
SP:StmtStartingΔημιουργία πίνακα # t (int)
SP:StmtStarting-Οι επτά εισαγωγή δηλώσεις-
SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από # t1
SP:RecompileuseKeepPlan
SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από # t1
SP: ολοκληρώθηκεuseKeepPlan

Ανασύνθεση του τη διαδικασία σχετικά με την επιλογή που προκύπτει μετά από επτά αλλαγές για την t # προσωρινό πίνακα.

Αυτή δραστική recompilation είναι χρήσιμο σε περιπτώσεις όπου οι αλλαγές για τη διανομή δεδομένων προσωρινό πίνακα μπορούν να επηρεάσουν σημαντικά το σχέδιο βέλτιστη ερώτημα για το η πρόταση αναφέρει. Ωστόσο, στην περίπτωση των μεγάλων διαδικασιών που τροποποιούν προσωρινών πινάκων συχνά, αλλά όχι σε σημαντικό τρόπο, το εναναμεταγλωττίσεων ενδέχεται να έχει ως αποτέλεσμα πιο αργή συνολική απόδοση. Η επιλογή ΔΙΑΤΉΡΗΣΗ ΣΧΕΔΙΑΣΜΌΣ από την πρόταση SELECT θεσπίστηκε για αυτήν την κατάσταση.

ΔΙΑΤΉΡΗΣΗ ΣΧΈΔΙΟ εξαλείφει την αποθηκευμένη διαδικασία εναναμεταγλωττίσεων που προκαλούνται από περισσότερους από έξι αλλαγές προσωρινών πινάκων στα πλαίσια της διαδικασίας και επανέρχονται στο πρότυπο αλγόριθμος για recompilation οφείλεται σε σειρά τροποποιήσεων που αναφέρονται παραπάνω σε το "Εναναμεταγλωττίσεων λόγω τροποποιήσεων γραμμής" ενότητα αυτού του άρθρου. ΔΙΑΤΉΡΗΣΗ ΣΧΈΔΙΟ δεν εμποδίζει την εναναμεταγλωττίσεων εντελώς, απλώς εμποδίζει αυτές που προκαλούνται από περισσότερα από έξι αλλαγές σε προσωρινούς πίνακες γίνεται αναφορά στη διαδικασία. Με το παράδειγμα παραπάνω, εάν καταργήσετε το σχόλιο από τη γραμμή "(KEEP ΣΧΈΔΙΟ) την επιλογή" στο η αποθηκευμένη διαδικασία, τοSP:Recompileτο συμβάν δεν θα δημιουργηθεί.

Εάν καταργήσετε το σχόλιο από την επιλογή"(KEEP ΣΧΈΔΙΟ)" με τον παραπάνω κώδικα και εκτέλεσης, που θα δείτε τα ακόλουθα συμβάντα στο Profiler:

Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η κλάση συμβάντωνΚείμενο
SP: εκκίνησηuseKeepPlan
SP:StmtStartingΔημιουργία πίνακα # t (int)
SP:StmtStarting-Οι επτά εισαγωγή δηλώσεις-
SP:StmtStartingΕπιλέξτε οι συναρτήσεις count(*) από επιλογή Τ1 # (ΔΙΑΤΉΡΗΣΗ ΣΧΈΔΙΟ)
SP: ολοκληρώθηκεuseKeepPlan


Σημείωση δεν υπάρχει καμίαSP:Recompileτο συμβάν.

Εναναμεταγλωττίσεων οφείλεται σε ορισμένες καταστάσεις ΣΎΝΟΛΟ εκτελούνται στην αποθηκευμένη διαδικασία

Τα ακόλουθα πέντε ΣΎΝΟΛΟ ορίζονται στο ON από προεπιλογή:
  • ANSI_DEFAULTS
  • ANSI_NULLS
  • ANSI_PADDING
  • ANSI_WARNINGS
  • CONCAT_NULL_YIELDS_NULL
Εάν εκτελέσετε την πρόταση SET για να ορίσετε αυτές τις επιλογές για ΑΠΕΝΕΡΓΟΠΟΊΗΣΗ, η αποθηκευμένη διαδικασία θα ανασύνθεση κάθε φορά που εκτελείται. Ο λόγος Αυτό είναι ότι αλλάζοντας τις επιλογές αυτές ενδέχεται να επηρεάσουν το αποτέλεσμα του ερωτήματος που ενεργοποίησε το recompilation.

Εξετάστε το ακόλουθο δείγμα κώδικα:
Use pubs
drop procedure test_recompile
go

create procedure test_recompile as
Set ANSI_DEFAULTS OFF
Select au_lname, au_fname, au_id from authors
where au_lname like 'L%'
--Option (Keep Plan)
Go
				
Στην περίπτωση αυτή, θα δείτε τα ακόλουθα συμβάντα στο Profiler SQL για κάθε εκτέλεση της αποθηκευμένης διαδικασίας:
+---------------------------------------------------+
| Event Class     | Text                            | 
+---------------------------------------------------+
| SP:Starting     | test_recompile                  | 
+---------------------------------------------------+
| SP:StmtStarting | Set ANSI_DEFAULTS OFF           | 
+---------------------------------------------------+
| SP:StmtStarting | select au_lname, au_fname, au_id| 
+---------------------------------------------------+
| SP:Recompile    | test_recompile                  | 
+---------------------------------------------------+
| SP:StmtStarting | select au_lname, au_fname, au_id| 
+---------------------------------------------------+
| SP:Completed    | test_recompile                  | 
+---------------------------------------------------+
				
Αντικαθιστά την επιλογή ΣΎΝΟΛΟ με μία από τις πέντε επιλογές στη λίστα παραπάνω, θα εμφανιστούν τα ίδια αποτελέσματα. Επίσης, χρησιμοποιώντας την επιλογή διατήρηση σχεδίου εδώ δεν θα συμβάλλει στην αποφυγή της recompilation, επειδή είναι η αιτία της recompilation από την πρόταση SET.

Ο προτεινόμενος τρόπος για να αποφύγετε την recompilation είναι να χρησιμοποιήσετε κάποια από αυτές τις πέντε πρόταση SET σε μια αποθηκευμένη διαδικασία. Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Microsoft (Knowledge Base):
294942PRB: Μπορεί να προκαλέσει CONCAT_NULL_YIELDS_NULL ΣΎΝΟΛΟ αποθηκευμένων διαδικασιών σε μεταγλωττίστε
Ωστόσο, ως δεν συνιστάται, εκτελείται το ΣΎΝΟΛΟ Για να επαναφέρετε την επιλογή "σύνδεση" την ίδια τιμή με την αποθηκευμένη κατάσταση διαδικασία, αυτό μπορεί να επίσης να αποφύγετε το μεταγλωττίστε, κάνοντας ως:
Set ANSI_DEFAULTS OFF

exec test_recompile
				
Το ίχνος SQL Profiler θα εμφανίσει περισσότερες συμβάντα SP:Recompile.

Ο ακόλουθος πίνακας παραθέτει ορισμένες κοινές δηλώσεις ΣΎΝΟΛΟ και αν ή δεν θέλετε να αλλάξετε την πρόταση SET σε μια αποθηκευμένη διαδικασία προκαλεί μια μεταγλωττίστε:
Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η πρόταση SetΝα μεταγλωττίσετε ξανά
Set quoted_identifierΌχι
Σύνολο arithabortΝαι (Yes)
Σύνολο ansi_null_dflt_onΝαι (Yes)
Σύνολο ansi_defaultsΝαι (Yes)
Σύνολο ansi_warningsΝαι (Yes)
Σύνολο ansi_paddingΝαι (Yes)
Σύνολο concat_null_yields_nullΝαι (Yes)
Σύνολο numeric_roundabortΌχι
Set nocountΌχι
Σύνολο rowcountΌχι
Σύνολο xact_abortΌχι
Σύνολο implicit_transactionsΌχι
Σύνολο arithignoreΌχι
Σύνολο lock_timeoutΌχι
Σύνολο fmtonlyΌχι

Αναφορές

308737INF: Πώς να προσδιορίσετε την αιτία της Recompilation σε ένα συμβάν SP:Recompile

Για πληροφορίες σχετικά με τη χρήση του SQL Server Δημιουργία προφίλ, δείτε ηλεκτρονικά βιβλία SQL Server Books Online.

Ιδιότητες

Αναγν. άρθρου: 243586 - Τελευταία αναθεώρηση: Πέμπτη, 27 Ιανουαρίου 2011 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Standard Edition
Λέξεις-κλειδιά: 
kbinfo kbmt KB243586 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:243586

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com