Bu makalede, Microsoft SQL Server 2014 ' de kümelenmiş bir columnstore dizininin sorgusu sırasında oluşan bir sorun açıklanır. Bu makalede, bu soruna yönelik bir çözüm sağlanmaktadır.

Özet

Microsoft SQL Server 2014 'da kümelenmiş bir columnstore dizinini tarayan bir sorgu kullandığınızda, nadir koşullar altında kısmi sorgu sonuçları alabilirsiniz. Bu sorun, aşağıdaki işlem çalıştırıldığında oluşur.

Adım 1

Transact-SQL deyimi [INSERT veya BULK-INSERT] kümelenmiş columnstore dizini içeren bir tabloya veri ekler. Bu işlem sırasında aşağıdaki koşullar geçerlidir:

  • Transact-SQL deyimi rowgroup eşiğine ulaştığında, segment S1 içeren rowgroup R1 'i kapatır.

  • Bölüt S1 yerel sözlüğe işaret noktalarıdır.

  • Bu bildirim, yeni rowgroup R2'ye satır eklemeye devam eder.

  • Rowgroup R1 kapatıldığında, D1 yerel sözlüğün da kapatılması gerekmez. D1 sözlüğünde hala kullanılabilir alan varsa, yeni rowgroup R2 için açık bırakıp yeniden kullanabilirsiniz.

Adım 2

Transact-SQL deyimi, yeni rowgroup R2'yi kapatmadan önce anormal veya iptal edilirse, aşağıdaki şartlar uygulanır:

  • Dış işlemden bağımsız olarak gerçekleştirilen alt işlemlerde columnstore meta veri değişiklikleri yapılır.

  • Bu noktada, rowgroup R1, sistem tablosunda "yapım aşamasında" veya görünmez bir durumda devam ediyorsa ve segment S1, D1 sözlüğüne başvurur.

  • Sistem tablosunda D1 sözlüğü için oluşturulan satır yok. Bunun nedeni Transact-SQL deyiminin var olan satırı kapatma olanağı olmamasıdır. Bu nedenle, var olan satır devam ettirir.

Adım 3

Tipik bir durumda, Transact-SQL deyiminden sonra demet taşıyıcısı arka plan işi başlarsa, arka plan görevi görünmez rowgroup R1 ve segmenti S1. Yeni bir Transact-SQL deyimi şimdi başlatılmış ve yeni bir yerel sözlük gerektiren yeni bir kesimi olan rowgroup R3 Bunun nedeni, columnstore 'in bellekteki durumunun, kullanılan sözlük kimliklerini takip eder. Bu nedenle,Not Bu adımdaki koşul, yaygın bir durumdur. Bu nedenle, bozulma olmaz.

Adım 4

SQL Server 'da, kayıt taşıyıcısı görev geçerli olmadan (ve adım 3 ' te açıklandığı gibi gerçekleştirildiğinde) önce, D1 sözlüğüNotlar

  • Bu olay aşağıdaki nedenlerden biriyle gerçekleşir:

    • SQL Server 'ın bellek aşırı yüklemesi ve D1 sözlüğünün bellek içi içeriği bellekten çıkarıldı.

    • SQL Server 'ın örneği yeniden başlatılır.

    • Kümelenmiş columnstore dizinini içeren veritabanı çevrimdışı duruma gelir ve çevrimiçi duruma gelir.

  • Bu olaylardan herhangi biri gerçekleşdikten ve SQL Server bellek içi yapıları yeniden yüklediğinde, bir, D1 ve iç KIMLIğIN bulunduğu bir kayıt olmaz. Bunun nedeni, Transact-SQL deyimi bittiğinde veya gizleme sırasında, D1 sözlüğünün sistem tablolarında tutulmadığı için kullanılır.

  • Bu noktada demet taşıyıcısı arka plan görevi başlarsa, adım 3 ' te açıklanan koşullar uygulandığından hata oluşmaz.

  • Başlık taşıyıcı arkaplan görevinin başlangıcından önce yeni bir rowgroup R3 oluşturulursa, SQL Server yeni sözlüğe aynı iç KIMLIĞI atar ve rowgroup R3 'de segment S3 için bir başvuru sözlüğüne başvurur.

  • Bir önceki eylemden sonra demet taşıyıcısı arka plan görevi başlatıldığında, bu, görünmez rowgroup R1 ve onun kesimlerini yeni bir sözlükle birlikte bırakır. Bu, demet taşıyıcısı yeni sözlüğün D1 ve özgün sözlüğün S1 başvurularının aynı olduğunu dikkate aldığı için oluşur.Not Bu koşul oluştuğunda, rowgroup R3 içeriğini sorgulamazsınız.

Çözüm

Sorun ilk olarak SQL Server için aşağıdaki toplu güncelleştirmelerde düzeltilmiştir:

SQL Server 2014 SP1toplu güncelleştirme 1, SQL Server 2014 için toplu güncelleştirme 8Bu sorunla ilgili düzeltme, aşağıdaki genel dağıtım sürümü (GDR) güncelleştirmelerinde de bulunmaktadır:

SQL Server 2014 QFE için güvenlik güncelleştirmesi  Bu güncelleştirme, toplu güncelleştirme 8, bu önemli düzeltme ve gerekli MS15-058 güvenlik güncelleştirmelerini içerir.SQL Server 2014 GDR için güvenlik güncelleştirmesi  Bu güncelleştirme, MS15-058 aracılığıyla bu önemli düzeltmeyi ve toplu güvenlik düzeltmelerini içerir.SQL Server 2014 Service Pack 1 GDR için güvenlikle ilgili olmayan güncelleştirme  Bu güncelleştirme yalnızca bu önemli düzeltmeyi içerir.

Her bir SQL Server toplu güncelleştirmesi, önceki toplu güncelleştirmeyle birlikte gelen tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. En son SQL Server güncelleştirmelerini görün:

Ek Bilgi

Hata iletileriŞu anda etkilenmiş bir veritabanında, bu düzeltmeyi uyguladıktan sonra DBCC CHECKDB 'yi çalıştırırsanız, aşağıdaki hata iletisini alırsınız:

İleti 5289, düzey 16, durum 1, satır 1 kümelenmiş columnstore dizini ' cci ' 't ' 'b Verileri yedekten geri yükleyin.

Şu anda etkilenmiş veritabanında, bu düzeltmeyi uyguladıktan sonra etkilenen tabloları tarayan bir sorgu çalıştırdığınızda, aşağıdaki hata iletisini alırsınız:

İleti 5288, düzey 16, durum 1, satır 1 columnstore dizininde, Sözlükteki veri değerleriyle eşleşmeyen bir veya daha fazla veri değeri vardır. Daha fazla bilgi için lütfen DBCC CHECKDB 'yi çalıştırın.

Bu hataları alırsanız, etkilenmeyen sütunların/RowGroups verilerine toplu dışarı aktararak ve sonra kümelenmiş columnstore dizinini açtıktan veya oluşturduktan sonra verileri yeniden yükleyerek bozulan verileri kaydedebilirsiniz. 5288 hatasını bastırmak ve bozulan RowGroups atlanma eski davranışına dönmek için Izleme bayrağını 10207. Not5288 ve 5289 için bir hata iletisi Eksik D1 sözlüğünden etkilenmeyen rowgroup R3 parçalarını ayıklamak için 10207 izleme bayrağı kullanılır.

Etkilenen veritabanları için sorguColumnstore dizinleri içeren veritabanının bu sorundan etkilenip etkilenmediğini belirlemek için aşağıdaki sorguyu uygulayın:

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 

Notlar

  • Bu sorguyu SQL Server çalıştıran sunucudaki columnstore dizinlerini içeren her veritabanında çalıştırmanız gerekir. Boş bir sonuç kümesi veritabanının etkilenmediğini gösterir.

  • Yeni RowGroups oluşturmaya veya mevcut RowGroups 'un durumunu değiştirmeye yönelik bir etkinlik olmadığında, bu sorguyu bir dönem boyunca yürütün. Örneğin, aşağıdaki etkinlikler RowGroups 'ın durumunu değiştirebilir: Dizin oluşturma, dizin yeniden düzenleme, toplu ekleme, kayıt taşıyıcısı, Delta depolarını sıkıştırmada. Sorguyu yürütmeden önce, izleme bayrağını 634 kullanarak arka plan kayıt taşıyıcısı görevini devre dışı bırakabilirsiniz. Arka plan görevini devre dışı bırakmak için bu komutu kullanın: DBCC TRACEON (634,-1). Sorgu çalışmayı bitirdikten sonra, komut: DBCC TRACEOFF (634,-1)komutunu kullanarak arka plan görevini yeniden etkinleştirmeyi unutmayın. Ayrıca, bu sorgu çalışırken columnstore dizinini kullanan tablolara veri eklemede toplu ekleme/BCP/SELECT ıNTO komutlarının bulunmadığından emin olun. Sorgunun yanlış pozitif sonuçlar döndürmesinden kaçınmak için bu adımları kullanmanız önerilir.

Durum

Microsoft bu sorunun "Uygulandığı öğe" bölümünde listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır.

Daha fazla yardıma mı ihtiyacınız var?

Yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Microsoft Insider 'a katılın

Bu bilgi yardımcı oldu mu?

Çeviri kalitesinden ne kadar memnunsunuz?
Deneyiminizi ne etkiledi?

Geri bildiriminiz için teşekkür ederiz!

×