Συμπτώματα
Εξετάστε το ακόλουθο σενάριο:
-
Ένα συνδεδεμένο διακομιστή ρυθμίζεται μεταξύ ενός τοπικού διακομιστή και έναν απομακρυσμένο διακομιστή ότι και τα δύο έχουν παρουσίες 2012 του Microsoft SQL Server.
-
Ο τοπικός διακομιστής ρυθμίζεται χρησιμοποιώντας μία συρραφή, όπως μια συρραφή διάκριση πεζών-κεφαλαίων.
-
Ο απομακρυσμένος διακομιστής έχει ένα αντικείμενο που έχει ρυθμιστεί σε μια διαφορετική κατάταξη από τον τοπικό διακομιστή, όπως η συρραφή με διάκριση πεζών-κεφαλαίων.
-
Πραγματοποιείται μια σύνδεση από το πρόγραμμα οδήγησης JDBC της Microsoft για τον SQL Server, το πρόγραμμα οδήγησης Microsoft ODBC για SQL Server, η υπηρεσία παροχής SQL OLE DB ή SQL Native Client στον τοπικό διακομιστή.
-
Το πρόγραμμα οδήγησης εκτελείται ένα ερώτημα ενημέρωσης Transact-SQL ως μια έτοιμη πρόταση που καλεί τη διαδικασία sp_prepexec αποθηκεύονται στον τοπικό διακομιστή.
-
Το ερώτημα ενημερώνει έναν πίνακα στον απομακρυσμένο διακομιστή. Αυτό περιλαμβάνει ένα αντικείμενο στήλη που χρησιμοποιεί μια διαφορετική κατάταξη από τον τοπικό διακομιστή.
Σε αυτό το σενάριο, ενδέχεται να αντιμετωπίσετε χαμηλές επιδόσεις του η εκτέλεση του ερωτήματος. Εάν ελέγξετε το σχέδιο εκτέλεσης του ερωτήματος ενημέρωσης, μπορείτε να δείτε ότι πραγματοποιείται μια απομακρυσμένη σάρωση στον πίνακα σε απομακρυσμένο διακομιστή χωρίς φιλτράρισμα. Επομένως, το ερώτημα μπορεί να εκτελέσει πολλές αναγνώσεις όταν σαρώνει τον απομακρυσμένο πίνακα και, στη συνέχεια, ανακτά όλες τις γραμμές στο τοπικό διακομιστή.
Για παράδειγμα, το ερώτημα είναι έτοιμη στον τοπικό διακομιστή που έχει προεπιλογή συρραφής διάκριση πεζών-κεφαλαίων και ο απομακρυσμένος διακομιστής έχει έναν πίνακα T1 που περιέχει μια στήλη που είναι διάκριση πεζών-κεφαλαίων. Η ενημερωμένη έκδοση θα σαρώσει όλες τις γραμμές του Τ1.
DECLARE @p1 INTEXEC sp_prepexec @p1 output, N'@P0 NVARCHAR(16), @P1 NVARCHAR(16)',
N'UPDATE RemoteServer.RemoteDatabase.dbo.T1 SET COL1=@P0 WHERE COL2=@P1',
N'a', N'a'
SELECT @p1
Αιτία
Το ζήτημα παρουσιάζεται επειδή το ερώτημα ενημέρωσης παρασκευασμένα θα σαρώσει τον απομακρυσμένο πίνακα όταν η συρραφή δεν αντιστοιχεί στους δύο διακομιστές.
Προτεινόμενη αντιμετώπιση
Αφού εφαρμόσετε την επείγουσα επιδιόρθωση, πρέπει να ενεργοποιήσετε τη σημαία παρακολούθησης 4199 στον τοπικό διακομιστή που φιλοξενεί το συνδεδεμένο διακομιστή. Για πληροφορίες σχετικά με την ενεργοποίηση του traceflag, ανατρέξτε στην ενότητα περισσότερες πληροφορίες.
Σημείωση Η επείγουσα επιδιόρθωση ισχύει μόνο για τον τοπικό διακομιστή που φιλοξενεί το συνδεδεμένο διακομιστή και βελτιστοποιεί το έτοιμων προτάσεων. Αυτή η επείγουσα επιδιόρθωση δεν εφαρμόζεται στον απομακρυσμένο διακομιστή.
Το ζήτημα επιδιορθώθηκε για πρώτη φορά με την ακόλουθη αθροιστική ενημερωμένη έκδοση του SQL Server.
Αθροιστική ενημερωμένη έκδοση 6 για τον SQL Server 2012 SP1/en-us/help/2874879
Κάθε νέα αθροιστική ενημερωμένη έκδοση για τον SQL Server περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ασφαλείας διορθώνει που συμπεριλήφθηκαν με την προηγούμενη αθροιστική ενημερωμένη έκδοση. Αποσύρετε τις πιο πρόσφατες αθροιστικές ενημερωμένες εκδόσεις για τον SQL Server:
Πληροφορίες άμεσης επιδιόρθωσηςΜια υποστηριζόμενη άμεση επιδιόρθωση είναι διαθέσιμη από τη Microsoft. Ωστόσο, αυτή η άμεση επιδιόρθωση προορίζεται για τη διόρθωση μόνο του προβλήματος που περιγράφεται σε αυτό το άρθρο. Εφαρμόστε αυτήν την άμεση επιδιόρθωση μόνο σε συστήματα που αντιμετωπίζουν το συγκεκριμένο πρόβλημα.
Εάν η άμεση επιδιόρθωση είναι διαθέσιμη για λήψη, τότε υπάρχει μια ενότητα με τίτλο "Διαθέσιμη λήψη άμεσης επιδιόρθωσης" στην αρχή αυτού του άρθρου της Γνωσιακής βάσης. Εάν αυτή η ενότητα δεν εμφανίζεται, υποβάλετε μια αίτηση στο τμήμα Εξυπηρέτησης και υποστήριξης πελατών της Microsoft για να αποκτήσετε την άμεση επιδιόρθωση.
Σημείωση Εάν προκύψουν πρόσθετα ζητήματα ή απαιτείται αντιμετώπιση προβλημάτων, ίσως χρειαστεί να δημιουργήσετε ξεχωριστή αίτηση εξυπηρέτησης. Για πρόσθετες ερωτήσεις υποστήριξης και θέματα που δεν αφορούν τη συγκεκριμένη άμεση επιδιόρθωση, ισχύουν οι συνηθισμένες χρεώσεις υποστήριξης. Για μια πλήρη λίστα αριθμών τηλεφώνου υπηρεσία εξυπηρέτησης πελατών της Microsoft και υποστήριξη ή για να δημιουργήσετε μια ξεχωριστή αίτηση εξυπηρέτησης, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft στο Web:
http://support.microsoft.com/contactus/?ws=supportΣημείωση Η φόρμα "Διαθέσιμη λήψη άμεσης επιδιόρθωσης" εμφανίζει τις γλώσσες για τις οποίες είναι διαθέσιμη η άμεση επιδιόρθωση. Εάν η γλώσσα σας δεν εμφανίζεται, τότε η άμεση επιδιόρθωση δεν είναι διαθέσιμη για αυτήν τη γλώσσα.
ΠροϋποθέσειςΓια να εφαρμόσετε αυτήν την επείγουσα επιδιόρθωση, πρέπει να έχετε εγκατεστημένο το SQL Server 2012.
Πληροφορίες μητρώουΔεν χρειάζεται να αλλάξετε το μητρώο, αφού εφαρμόσετε αυτήν την επείγουσα επιδιόρθωση.
Πληροφορίες αντικατάστασης άμεσης επιδιόρθωσηςΑυτή η επείγουσα επιδιόρθωση δεν αντικαθιστά άλλες επείγουσες επιδιορθώσεις.
Κατάσταση
Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα των προϊόντων της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".
Εναλλακτικός τρόπος αντιμετώπισης
Για να abound το ζήτημα, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους:
-
Μην χρησιμοποιείτε το έτοιμων προτάσεων στον πηγαίο κώδικα εφαρμογής προγράμματος-πελάτη. Μπορείτε να χρησιμοποιήσετε ad-hoc δηλώσεις ή οι δηλώσεις που είναι δυνατή η κλήση όπως αποθηκευμένες διαδικασίες αν το πρόγραμμα οδήγησης υποστηρίζει αυτές τις διασυνδέσεις.
-
Χρήση συρραφής που ταιριάζουν και στους δύο διακομιστές.
Περισσότερες πληροφορίες
Για να ενεργοποιήσετε τη σημαία παρακολούθησης, προσθέστε την παράμετρο εκκίνησης -T4199 ή DBCC TRACEON(4199,-1) πριν την έτοιμη πρόταση έχει μεταγλωττιστεί ώστε να ενεργοποιήσετε τη συμπεριφορά της.
Μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες μεθόδους για να ενεργοποιήσετε τη σημαία παρακολούθησης:
-
Πριν από την εκκίνηση του SQL Server, χρησιμοποιήστε το Microsoft SQL Server Configuration Manager, κάντε δεξιό κλικ στην παρουσία που επηρεάζονται και προσθέστε την παράμετρο εκκίνησης -T4199 έτσι ώστε να παραμένει από διάφορες επανεκκινήσεις και όλες τις συνδέσεις με την παρουσία στο μέλλον.
-
Δυναμικά να ενεργοποιήσετε τη ρύθμιση κατά το χρόνο εκτέλεσης όταν γίνεται εκκίνηση της υπηρεσίας και καθολικά για όλες τις "(-1) συνδέσεις." Θα πρέπει να ελευθερώσετε τη μνήμη cache διαδικασία εάν σκοπεύετε να κάνετε δοκιμές με το διακόπτη ενεργοποιημένη ή απενεργοποιημένη.
Χρησιμοποιήστε τα ακόλουθα για να ενεργοποιήσετε τη ρύθμιση καθολικά και δυναμικά:
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
Χρησιμοποιήστε τα ακόλουθα για να απενεργοποιήσετε τη ρύθμιση καθολικά και δυναμικά:
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE