Applies ToSQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Αυτό το άρθρο περιγράφει ένα πρόβλημα που παρουσιάζεται κατά τη διάρκεια ενός ερωτήματος ενός συμπλέγματος columnstore Index στο Microsoft SQL Server 2014. Αυτό το άρθρο παρέχει μια λύση για αυτό το πρόβλημα.

Σύνοψη

Όταν χρησιμοποιείτε ένα ερώτημα που σαρώνει ένα συγκεντρωτικό ευρετήριο columnstore στον Microsoft SQL Server 2014, μπορείτε, σε σπάνιες συνθήκες, να λάβετε αποτελέσματα μερικού ερωτήματος. Αυτό το πρόβλημα παρουσιάζεται όταν εκτελείται η παρακάτω λειτουργία.

Βήμα 1

Μια πρόταση Transact-SQL [INSERT ή BULK-INSERT] εισάγει δεδομένα σε έναν πίνακα που έχει συγκεντρωτικό ευρετήριο columnstore. Κατά τη διάρκεια αυτής της λειτουργίας, ισχύουν οι ακόλουθες συνθήκες:

  • Όταν η πρόταση Transact-SQL φθάσει στο όριο του γραμμών, κλείνει το γραμμών R1 που έχει το τμήμα S1.

  • Το τμήμα S1 οδηγεί στο τοπικό λεξικό D1.

  • Η πρόταση συνεχίζει να εισάγει γραμμές στο νέο γραμμών R2.

  • Όταν το γραμμών R1 είναι κλειστό, το τοπικό λεξικό D1 δεν πρέπει επίσης να κλείσει. Εάν το λεξικό D1 εξακολουθεί να έχει διαθέσιμο χώρο, μπορείτε να το αφήσετε ανοιχτό και να το χρησιμοποιήσετε ξανά για το νέο γραμμών R2.

Βήμα 2

Εάν η πρόταση Transact-SQL τερματίστηκε ασυνήθιστα ή ακυρώθηκε πριν κλείσει το νέο γραμμών R2, ισχύουν οι ακόλουθες συνθήκες:

  • Οι αλλαγές μετα-δεδομένων columnstore πραγματοποιούνται σε υποσυναλλαγές που δεσμεύονται ανεξάρτητα από την εξωτερική συναλλαγή.

  • Σε αυτό το στάδιο, το γραμμών R1 εξακολουθεί να υπάρχει στον πίνακα συστήματος σε μια "υπό κατασκευή" ή ΑΌΡΑΤη κατάσταση και το τμήμα S1 αναφέρεται σε λεξικό D1.

  • Δεν έχει δημιουργηθεί καμία γραμμή στον πίνακα συστήματος για το λεξικό D1. Αυτό συμβαίνει επειδή η πρόταση Transact-SQL δεν έχει ποτέ την ευκαιρία να κλείσει την υπάρχουσα γραμμή. Επομένως, η υπάρχουσα γραμμή παραμένει.

Βήμα 3

Σε μια τυπική κατάσταση, εάν η εργασία παρασκηνίου του μετακινούμενου πλειάδα ξεκινά μετά τη λήξη της πρότασης Transact-SQL, η εργασία φόντου καταργεί το αόρατο γραμμών R1 και το τμήμα S1. Εάν μια νέα πρόταση Transact-SQL έχει ξεκινήσει τώρα και δημιουργεί το γραμμών R3 που έχει ένα νέο τμήμα αγοράς S3 που απαιτεί ένα νέο τοπικό λεξικό, δεν μπορείτε να χρησιμοποιήσετε ξανά το εσωτερικό αναγνωριστικό του λεξικού D1. Αυτό συμβαίνει επειδή η κατάσταση στη μνήμη του columnstore παρακολουθεί τα αναγνωριστικά λεξικών που χρησιμοποιούνται. Επομένως, το τμήμα S3 θα αναφέρει το νέο λεξικό D2.Σημείωση Η Συνθήκη σε αυτό το βήμα είναι μια συνηθισμένη Συνθήκη. Επομένως, δεν παρουσιάζεται καταστροφή.

Βήμα 4

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

  • Αυτό το συμβάν παρουσιάζεται για οποιονδήποτε από τους παρακάτω λόγους:

    • Ο SQL Server παρουσιάζει υπερφόρτωση μνήμης και τα περιεχόμενα της μνήμης του λεξικού D1 εκδιώκονται από τη μνήμη.

    • Γίνεται επανεκκίνηση της παρουσίας του SQL Server.

    • Η βάση δεδομένων που περιέχει το ευρετήριο συμπλέγματος columnstore αποσυνδέεται και, στη συνέχεια, επανέρχεται σε σύνδεση.

  • Αφού προκύψει κάποιο από αυτά τα συμβάντα και ο SQL Server φορτώνει ξανά τις δομές της μνήμης, δεν υπάρχει εγγραφή ότι υπήρχε ένα λεξικό D1 και το εσωτερικό του αναγνωριστικό. Αυτό συμβαίνει επειδή το λεξικό D1 δεν διατηρείται στους πίνακες συστήματος όταν έληξε η πρόταση Transact-SQL ή conceled.

  • Εάν η εργασία παρασκηνίου του μετακινούμενου πλειάδα ξεκινά σε αυτό το στάδιο, δεν παρουσιάζονται σφάλματα, επειδή ισχύουν οι συνθήκες που περιγράφονται στο βήμα 3.

  • Εάν δημιουργηθεί ένα νέο γραμμών R3 πριν από την έναρξη της εργασίας πλειάδα πρόγραμμα μετακίνησης φόντου (ανά το προηγούμενο στοιχείο κουκκίδας), ο SQL Server εκχωρεί το ίδιο εσωτερικό αναγνωριστικό σε νέο λεξικό D1 και αναφέρεται σε λεξικό D1 για το τμήμα S3 στο γραμμών R3.

  • Όταν η εργασία πλειάδα πρόγραμμα μετακίνησης φόντου ξεκινά μετά την προηγούμενη ενέργεια, μειώνεται η αόρατη γραμμών R1 και τα τμήματα S1 μαζί με το νέο λεξικό D1. Αυτό συμβαίνει επειδή το πρόγραμμα μετακίνησης πλειάδα θεωρεί ότι το νέο λεξικό D1 και το αρχικό λεξικό D1 ότι οι αναφορές S1 είναι ίδιες.Σημείωση Όταν παρουσιαστεί αυτή η Συνθήκη, δεν μπορείτε να υποβάλετε ερώτημα για τα περιεχόμενα του γραμμών R3.

Επίλυση

Το πρόβλημα διορθώθηκε για πρώτη φορά στις ακόλουθες αθροιστικές ενημερώσεις για τον SQL Server:

Αθροιστική ενημερωμένη έκδοση 1 για τον SQL server 2014 SP1 αθροιστική ενημέρωση 8 για τον SQL Server 2014Η επιδιόρθωση για αυτό το πρόβλημα περιλαμβάνεται επίσης στις ακόλουθες ενημερώσεις έκδοσης γενικής διανομής (GDR):

Ενημέρωση ασφαλείας για τον SQL Server 2014 QFE  Αυτή η ενημέρωση περιλαμβάνει την αθροιστική ενημερωμένη έκδοση 8, αυτή τη σημαντική επιδιόρθωση και τις απαιτούμενες ενημερώσεις ασφαλείας MS15-058.Ενημέρωση ασφαλείας για τον SQL Server 2014 GDR  Αυτή η ενημέρωση περιλαμβάνει αυτή τη σημαντική επιδιόρθωση και τις αθροιστικές επιδιορθώσεις ασφαλείας μέσω MS15-058.Ενημέρωση ασφαλείας για τον SQL Server 2014 Service Pack 1 GDR  Αυτή η ενημέρωση περιλαμβάνει μόνο αυτή τη σημαντική επιδιόρθωση.

Κάθε νέα αθροιστική ενημέρωση για τον SQL Server περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις επιδιορθώσεις ασφαλείας που συμπεριλήφθηκαν στην προηγούμενη αθροιστική ενημέρωση. Δείτε τις πιο πρόσφατες αθροιστικές ενημερώσεις για τον SQL Server:

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

Μηνύματα σφάλματοςΣε μια βάση δεδομένων που επηρεάζεται αυτήν τη στιγμή, εάν εκτελέσετε την εντολή DBCC CHECKDB μετά την εφαρμογή αυτής της ενημέρωσης κώδικα, λαμβάνετε το ακόλουθο μήνυμα σφάλματος:

MSG 5289, επίπεδο 16, κατάσταση 1, πίνακας 1 Clustered columnstore Index "ΚΠΕ" στον πίνακα 't "έχει μία ή περισσότερες τιμές δεδομένων που δεν συμφωνούν με τις τιμές δεδομένων σε ένα λεξικό. Επαναφέρετε τα δεδομένα από ένα αντίγραφο ασφαλείας.

Σε μια βάση δεδομένων που επηρεάζεται αυτήν τη στιγμή, όταν εκτελείτε ένα ερώτημα που σαρώνει τους πίνακες που επηρεάζονται μετά την εφαρμογή αυτής της ενημέρωσης κώδικα, λαμβάνετε το ακόλουθο μήνυμα σφάλματος:

MSG 5288, επίπεδο 16, κατάσταση 1, το ευρετήριο columnstore line 1 έχει μία ή περισσότερες τιμές δεδομένων που δεν συμφωνούν με τις τιμές δεδομένων σε ένα λεξικό. Παρακαλούμε εκτελέστε το DBCC CHECKDB για περισσότερες πληροφορίες.

Εάν λάβετε αυτά τα σφάλματα, μπορείτε να αποθηκεύσετε τα δεδομένα που δεν έχουν καταστραφεί, εξάγοντας μαζικά τα δεδομένα των στηλών/rowgroups που δεν επηρεάζονται και, στη συνέχεια, να φορτώσετε εκ νέου τα δεδομένα αφού αποθέσετε ή δημιουργήσετε το συγκεντρωτικό ευρετήριο columnstore. Θα πρέπει να ενεργοποιήσετε τη σημαία ανίχνευσης 10207 για να αποκρύψετε το σφάλμα 5288 και να επιστρέψετε στην παλιά συμπεριφορά της παράλειψης κατεστραμμένων rowgroups. Σημείωση Τα μηνύματα σφάλματος 5288 και 5289 δημιουργούνται για αυτό το γραμμών R3 που έχει τμήμα S3. Η σημαία παρακολούθησης 10207 χρησιμοποιείται για την εξαγωγή των τμημάτων του γραμμών R3 που δεν επηρεάζονται από το λεξικό που λείπει D1.

Ερώτημα για βάσεις δεδομένων που επηρεάζονταιΓια να προσδιορίσετε εάν η βάση δεδομένων που περιέχει τα ευρετήρια columnstore επηρεάζεται ήδη από αυτό το πρόβλημα, εκτελέστε το ακόλουθο ερώτημα:

select         object_name(i.object_id) as table_name,        i.name as index_name,        p.partition_number,        count(distinct s.segment_id) as damaged_rowgroups from        sys.indexes i        join sys.partitions p on p.object_id = i.object_id and p.index_id = i.index_id        join sys.column_store_row_groups g on g.object_id = i.object_id and g.index_id = i.index_id and g.partition_number = p.partition_number        join sys.column_store_segments s on s.partition_id = p.partition_id and s.segment_id = g.row_group_id where         i.type in (5, 6)        and s.secondary_dictionary_id <> -1         and g.state_description = 'COMPRESSED'        and s.secondary_dictionary_id not in        (               select dictionary_id from sys.column_store_dictionaries d               where d.hobt_id = p.hobt_id and d.column_id = s.column_id        ) group by         object_name(i.object_id),        i.name,        p.partition_number 

Σημειώσεις

  • Πρέπει να εκτελέσετε αυτό το ερώτημα σε κάθε βάση δεδομένων που περιέχει ευρετήρια columnstore στο διακομιστή που εκτελεί τον SQL Server. Ένα κενό συνόλου αποτελεσμάτων υποδηλώνει ότι η βάση δεδομένων δεν επηρεάζεται.

  • Εκτελέστε αυτό το ερώτημα κατά τη διάρκεια μιας περιόδου όπου δεν υπάρχει δραστηριότητα που θα δημιουργήσει νέες rowgroups ή θα αλλάξει την κατάσταση των υπαρχουσών rowgroups. Για παράδειγμα, οι ακόλουθες δραστηριότητες μπορούν να τροποποιήσουν την κατάσταση του rowgroups: δημιουργία ευρετηρίου, αναδιοργάνωση ευρετηρίου, μαζική εισαγωγή, μετακίνηση πλειάδας που συμπιέζει τα καταστήματα Δέλτα. Πριν να εκτελέσετε το ερώτημα, μπορείτε να απενεργοποιήσετε την εργασία "πρόγραμμα μετακίνησης πλειάδας φόντου" χρησιμοποιώντας τη σημαία παρακολούθησης 634. Χρησιμοποιήστε αυτήν την εντολή για να απενεργοποιήσετε την εργασία φόντου: DBCC TRACEON (634;-1). Αφού ολοκληρωθεί η εκτέλεση του ερωτήματος, θυμηθείτε να ενεργοποιήσετε ξανά την εργασία φόντου, χρησιμοποιώντας την εντολή: DBCC TRACEOFF (634;-1). Βεβαιωθείτε επίσης ότι δεν υπάρχουν ΜΑΖΙΚές εντολές ΕΙΣΑΓΩΓΉς/BCP/SELECT-INTO για την εισαγωγή δεδομένων στους πίνακες που χρησιμοποιούν το ευρετήριο columnstore ενώ εκτελείται αυτό το ερώτημα. Συνιστάται να χρησιμοποιήσετε αυτά τα βήματα για να αποτρέψετε την επιστροφή ψευδών θετικών στο ερώτημα.

Κατάσταση

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

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.