Prijavite se pomoću Microsoft naloga
Prijavite se ili kreirajte nalog.
Zdravo,
Izaberite drugi nalog.
Imate više naloga
Odaberite nalog pomoću kojeg želite da se prijavite.

Ovaj članak govori o problemu do kojeg dolazi tokom upita indeksa grupisane kolone u sistemu Microsoft SQL Server 2014. Ovaj članak pruža rešenje ovog problema.

Rezime

Kada koristite upit koji skenira indeks grupisane kolone u sistemu Microsoft SQL Server 2014, možete, pod retkim uslovima, da dobijete delimične rezultate upita. Do ovog problema dolazi kada se pokrene sledeća operacija.

Korak 1

Transact-SQL naredba [INSERT ili BULK-INSERT] umeće podatke u tabelu koja ima grupisani indeks stubičnice. Tokom ove operacije primenjuju se sledeći uslovi:

  • Kada Transact-SQL naredba dostigne prag grupe redova, ona zatvara grupu R1 koja ima segment S1.

  • Segment S1 ukazuje na lokalni rečnik D1.

  • Izjava nastavlja da umeće redove u novu grupu redova R2.

  • Kada je grupa R1 zatvorena, lokalni rečnik D1 takođe ne mora biti zatvoren. Ako rečnik D1 i dalje ima raspoloživi prostor, možete ga ostaviti otvorenim i ponovo ga koristiti za novu grupu reda R2.

2. korak

Ako je Transact-SQL naredba neumesno okončana ili otkazana pre nego što zatvori novu grupu R2, primenjuju se sledeći uslovi:

  • Promene metapodataka u kolonama se dešavaju u podprostorima koji se obavežu nezavisno od vanprelazne transakcije.

  • U ovom trenutku, rowgroup R1 je i dalje u sistemskoj tabeli u "u izgradnji" ili NEVIDLJIVOM stanju, a segment S1 referencira rečnik D1.

  • U sistemskoj tabeli za rečnik D1 nije kreiran red. Do ovoga dolazi zato što Transact-SQL naredba nikada nema mogućnost da zatvori postojeći red. Zbog toga postojeći red i dalje postoji.

Treći korak

U tipičnoj situaciji, ako zadatak pokretača tjula započne nakon završetka Transact-SQL naredbe, zadatak u pozadini uklanja nevidljivu grupu R1 i segment S1. Ako je sada pokrenuta nova Transact-SQL naredba i kreira rowgroup R3 koji ima novi segment S3 koji zahteva novi lokalni rečnik, ne možete ponovo koristiti interni ID rečnika D1. Do ovoga je zato što stanje u memoriji kolone prati ID-ove rečnika koji se koriste. Zbog toga će segment S3 referencirati novi rečnik D2.Napomena Stanje u ovom koraku je uobičajeno stanje. Stoga ne dolazi do korupcije.

4. korak

Ako SQL Server izgubi stanje u memoriji rečnika D1 pre nego što zadatak pokretača tjula stupi na snagu (i izvrši kao što je opisano u Koraku 3), dolazi do problema opisanog u ovom članku.Napomene

  • Do ovog događaja dolazi iz bilo kog od sledećih razloga:

    • SQL Server doživljava preopterećenje memorije, a sadržaj rečnika D1 u memoriji izbacuje se iz memorije.

    • Instanca sql servera se ponovo pokreće.

    • Baza podataka koja sadrži indeks grupisane kolone se odvija van mreže, a zatim se vraća na mrežu.

  • Nakon što se bilo koji od ovih događaja dogodi i SQL Server ponovo učita strukture u memoriji, ne postoji zapis da su rečnik D1 i njegov unutrašnji ID postojali. Do ovoga dolazi zato što rečnik D1 nije zadržan u sistemskim tabelama kada je Transact-SQL naredba završena ili uobražena.

  • Ako zadatak pokretača tjula započne u ovom trenutku, neće doći do grešaka zato što se primenjuju uslovi opisani u koraku 3.

  • Ako se pre početka zadatka u pozadini pokretača tjula (po prethodnoj stavci znaka za nabrajanje) kreira nova grupa R3, SQL Server dodeljuje isti interni ID novom rečniku D1 i referencira rečnik D1 za segment S3 u grupi R3.

  • Kada zadatak pokretača tjula započne nakon prethodne radnje, on ispušta nevidljivu grupu reda R1 i njene segmente S1 zajedno sa novim rečnikom D1. Do ovoga dolazi zato što pokretač tuple smatra da su novi rečnik D1 i originalni rečnik D1 koje S1 reference iste.Napomena Kada dođe do ovog uslova, ne možete da izvršite upit nad sadržajem grupe reda R3.

Rešenje

Problem je prvi put otklonjen u sledećim kumulativnim ispravkama za SQL Server:

Kumulativna ispravka 1 za SQL Server 2014 SP1 Kumulativna ispravka 8 za SQL Server 2014Ispravka za ovaj problem je takođe uključena u sledeće opšte ispravke izdanja distribucije (GDR) :

Bezbednosna ispravka za SQL Server 2014 QFE  Ova ispravka uključuje kumulativnu ispravku 8, ovu važnu ispravku i potrebne bezbednosne ispravke MS15-058.Bezbednosna ispravka za SQL Server 2014 GDR  Ova ispravka uključuje ovu važnu ispravku i kumulativne bezbednosne ispravke kroz MS15-058.Ispravka nesigurnosti za SQL Server 2014 servisni paket 1 GDR  Ova ispravka uključuje samo ovu važnu ispravku.

Svaka nova kumulativna ispravka za SQL Server sadrži sve hitne ispravke i sve bezbednosne ispravke koje su bile uključene u prethodnu kumulativnu ispravku. Pogledajte najnovije kumulativne ispravke za SQL Server:

Više informacija

Poruke o greškamaU trenutno pogođenoj bazi podataka, ako pokrenete DBCC CHECKDB nakon primene ove ispravke, dobijate sledeću poruku o grešci:

Msg 5289, Nivo 16, Stanje 1, Red 1 Grupisana kolona indeks "cci" u tabeli "t" ima jednu ili više vrednosti podataka koje se ne podudaraju sa vrednostima podataka u rečniku. Vratite podatke u prethodno stanje iz rezervne kopije.

U bazi podataka na koju trenutno utiče, kada pokrenete upit koji skenira tabele na koje utiče nakon primene ove ispravke, dobijate sledeću poruku o grešci:

Msg 5288, nivo 16, stanje 1, indeks kolona linije 1 ima jednu ili više vrednosti podataka koje se ne podudaraju sa vrednostima podataka u rečniku. Za više informacija pokrenite DBCC CHECKDB.

Ako dobijete ove greške, možete da sačuvate nekorumpirane podatke tako što ćete masovno izvesti podatke neoštećenih kolona/grupa redova, a zatim ponovo učitati podatke nakon što otpustite ili kreirate indeks grupisane kolone. Trebalo bi da omogućite zastavici "Praćenje" 10207 da biste sprečili grešku 5288 i vratili se na staro ponašanje preskakanja oštećenih grupa redova. Napomena Poruke o greškama 5288 i 5289 generišu se za ovu grupu R3 koja ima segment S3. Zastavica za praćenje 10207 se koristi za izdvajanje segmenata grupe R3 na koje ne utiče rečnik koji nedostaje.

Upit za baze podataka na koje utičeDa biste utvrdili da li na ovaj problem već utiče baza podataka koja sadrži indekse stubičnice:

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 

Napomene

  • Ovaj upit morate da pokrenete u svakoj bazi podataka koja sadrži indekse kolona na serveru na kojem je pokrenut SQL Server. Prazan skup rezultata ukazuje na to da baza podataka nije pogođena.

  • Izvršite ovaj upit u periodu kada ne postoji aktivnost koja će kreirati nove grupe redova ili promeniti stanje postojećih grupa redova. Na primer, sledeće aktivnosti mogu da izmene stanje grupa redova: izrada indeksa, reorganizacija indeksa, masovno umetanje, kombinovanje premeštača koji komprimuje delta skladišta. Pre nego što izvršite upit, možete da onemogućite zadatak pokretača pozadine pomoću zastavice za praćenje 634. Koristite ovu komandu da biste onemogućili zadatak u pozadini: DBCC TRACEON ( 634 , -1 ). Kada upit završi sa izvršavanjem, ne zaboravite da ponovo omogućite zadatak u pozadini pomoću komande: DBCC TRACEOFF ( 634 , -1 ). Uverite se i da ne postoje komande BULK INSERT/BCP/SELECT-INTO koje umeću podatke u tabele koje koriste indeks kolona dok je ovaj upit pokrenut. Preporučuje se da koristite ove korake da biste sprečili upit da vrati lažne pozitivne vrednosti.

Status

Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku "Odnosi se na".

Da li vam je potrebna dodatna pomoć?

Želite još opcija?

Istražite pogodnosti pretplate, pregledajte kurseve za obuku, saznajte kako da obezbedite uređaj i još mnogo toga.

Zajednice vam pomažu da postavljate pitanja i odgovarate na pitanja, dajete povratne informacije i čujete mišljenje od stručnjaka sa bogatim znanjem.

Da li su vam ove informacije koristile?

Koliko ste zadovoljni kvalitetom jezika?
Šta je uticalo na vaše iskustvo?
Kada kliknete na dugme Prosledi“, vaše povratne informacije će se koristiti za poboljšanje Microsoft proizvoda i usluga. Vaš IT administrator će moći da prikupi ove podatke. Izjava o privatnosti.

Hvala vam na povratnim informacijama!

×