Šiame straipsnyje aptariama problema, kylanti sankaupos columnstore indekso užklausoje "Microsoft SQL Server 2014". Šiame straipsnyje pateikiama šios problemos sprendimo būdas.
Suvestinė
Kai naudojate užklausą, kuri nuskaito sankaupos columnstore indeksą "Microsoft SQL Server" 2014, dalyje retais sąlygomis galite gauti dalinio užklausos rezultatus. Ši problema kyla, kai vykdoma ši operacija.
1 veiksmas
Transact-SQL sakinys [įterpimas arba masinis įterpimas] įterpia duomenis į lentelę, kurioje yra Jungtinė columnstore indeksas. Atliekant šią operaciją taikomos šios sąlygos:
-
Kai Transact-SQL sakinys pasiekia rowgroup ribą, ji uždaro rowgroup R1, kuriame yra segmento S1.
-
Segmento S1 nukreipia į vietinį žodyną D1.
-
Sakinys ir toliau Įterpią eilutes į naują rowgroup R2.
-
Uždarius rowgroup R1, vietinis žodynas D1 taip pat neturi būti uždarytas. Jei žodynas D1 vis dar turi laisvą vietą, galite palikti jį atidarytą ir pakartotinai naudoti naujai rowgroup R2.
2 veiksmas
Jei Transact-SQL sakinys baigėsi neįprastai arba atšauktas prieš jį uždarius naują rowgroup R2, taikomos šios sąlygos:
-
Columnstore metaduomenų pokyčiai įvyksta antrinėje operacijoje, kuri padaro nepriklausomai nuo išorinės operacijos.
-
Šiuo metu rowgroup R1 išlieka sistemos lentelėje "kuriamas" arba nematoma būsena ir segmento S1 nuorodos žodynas D1.
-
Žodyne D1 yra "System" lentelėje nėra sukurtos eilutės. Taip yra todėl, kad Transact-SQL sakinys niekada neturi galimybės uždaryti esamą eilutę. Todėl esama eilutė išlieka.
3 veiksmas
Įprastoje situacijoje, jei įrašas mover foninė užduotis prasidės po Transact-SQL sakinio pabaigos, foninė užduotis pašalina nematomą rowgroup R1 ir segmento S1. Jei naujas Transact-SQL sakinys pradedamas dabar ir sukuria rowgroup R3, kuriame yra naujas segmentas S3, kuriam reikia naujo vietinio žodyno, negalima pakartotinai naudoti vidinio žodyno D1. Taip yra todėl, kad "columnstore" atminties būsena stebi naudojamus žodyno ID. Todėl segmentas S3 nurodys naują žodyną D2.Pastaba Šio veiksmo sąlyga yra bendroji sąlyga. Todėl nėra korupcijos.
4 veiksmas
Jei "SQL Server" praranda žodyno D1 atminties būseną prieš įsigaliojant "reikšmių rinkinio neleistinas Mover" (ir atlieka kaip aprašyta 3 veiksme), įvyksta šiame straipsnyje aprašyta problema.Pastabos
-
Šis įvykis kyla dėl bet kurios iš šių priežasčių:
-
"SQL Server" patiria atminties perkrova, o "Dictionary D1" atminties turinys yra iškeltas iš atminties.
-
Iš naujo paleidžiamas SQL serverio egzempliorius.
-
Duomenų bazė, kurioje yra Jungtinė columnstore indeksas, atsijungia ir vėl grįžta internete.
-
-
Kai bet kuris iš šių įvykių įvyksta ir "SQL Server" Perkrovimai atminties struktūrų, nėra įrašo, kad žodynas D1 ir jo vidinis ID egzistavo. Taip yra todėl, kad "Transact-SQL" sakinys nebuvo paliktas "System" lentelėse, kai buvo nutrauktas arba conceled žodynas D1.
-
Jei įrašo mover foninė užduotis pradedama šiuo klausimu, nėra klaidų, nes taikomos 3 veiksme aprašytos sąlygos.
-
Jei naujas rowgroup R3 sukuriamas, kol bus paleista "reikšmių rinkinio neleistinas Mover" foninė užduotis (už ankstesnio ženklelio elemento), "SQL Server" priskiria tą patį vidinį ID naujam žodynui D1, o "rowgroup R3.
-
Kai "reikšmių rinkinio neleistinas Mover" foninė užduotis pradedama po ankstesnio veiksmo, ji sukuria nematomą rowgroup R1 ir jos segmentų S1 kartu su nauju žodynu D1. Taip nutinka dėl to, kad "reikšmių rinkinio neleistinas Mover" mano, kad naujas žodynas D1 ir originalus žodynas D1 S1 nuorodos yra tos pačios.Pastaba Kai iškyla ši sąlyga, negalite pateikti užklausos rowgroup R3 turinio.
Sprendimas
Problema pirmą kartą išspręsta Šiame kaupiamųjų naujinimų SQL Server:
Kaupiamasis naujinimas 1 SQL serverio 2014 SP1 KAUPIAMASIS naujinimas 8 SQL Server 2014Ši problema taip pat yra įtraukta į šį bendrąjį platinimo leidimą (GDR) naujinimus:
"SQL Server 2014 QFE" saugos naujinimas Šiame naujinime yra Kaupiamasis naujinimas 8, šis svarbus pataisymas ir būtini MS15 – 058 saugos naujinimai."SQL Server 2014 GDR" saugos naujinimas Šiame naujinime yra šios svarbios pataisos ir kaupiamosios saugos pataisos naudojant "MS15-058".Ne saugos naujinimas, skirtas "SQL Server" 2014 1 pakeitimų paketo GDR Šiame naujinime yra tik šis svarbus pataisymas.
Kiekvienas naujas Kaupiamasis naujinimas, skirtas "SQL Server", yra visos karštosios pataisos ir visos saugos pataisos, kurios buvo pridėtos prie ankstesnio kaupiamojo naujinimo. Peržiūrėkite naujausius kaupiamuosius SQL serverio naujinimus:
Daugiau informacijos
Klaidų pranešimaiŠiuo metu paveiktoje duomenų bazėje, jei vykdote DBCC CHECKDB po to, kai pritaikote šią pataisą, gaunate tokį klaidos pranešimą:
MSG 5289, Level 16, 1 valstybė, 1 linija Jungtinė columnstore index "CCI" lentelėje "t" turi vieną ar daugiau duomenų reikšmių, kurios nesutampa su duomenų reikšmėmis žodyne. Atkurkite duomenis iš atsarginės kopijos.
Šiuo metu paveiktoje duomenų bazėje paleidus užklausą, kuri nuskaito paveiktas lenteles pritaikius šią pataisą, gaunate šį klaidos pranešimą:
MSG 5288, lygis 16, 1 valstybė, 1 linijos columnstore indeksas turi vieną ar daugiau duomenų reikšmių, kurios nesutampa su duomenų reikšmėmis žodyne. Norėdami gauti daugiau informacijos, vykdykite DBCC CHECKDB.
Jei gaunate šias klaidas, galite įrašyti nesugadintus duomenis masiškai eksportuodami nepakitusios stulpelių/rowgroups duomenis ir tada iš naujo Įkeliant duomenis po to, kai nuvilksite ar sukursite sugrupuotą columnstore indeksą. Turite įgalinti sekimo vėliavėlę 10207, jei norite nerodyti 5288 klaidos, ir grįžti prie seno sugadintų rowgroups veikimo veiksmų. Pastaba. Klaidos pranešimas 5288 ir 5289 sugeneruojami šiai rowgroup R3, kuriame yra segmentas S3. Sekimo vėliavėlė "10207" naudojama norint išskleisti rowgroup R3 segmentus, kuriems neturi įtakos trūkstamas žodynas D1.
Paveiktų duomenų bazių užklausaNorėdami nustatyti, ar duomenų bazė, kurioje yra columnstore rodyklės, jau veikia ši problema, vykdykite šią užklausą:
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
Pastabos
-
Turite vykdyti šią užklausą prieš kiekvieną duomenų bazę, kurioje serveryje, kuriame veikia "SQL Server", yra columnstore rodyklės. Tuščias rezultatų rinkinys nurodo, kad duomenų bazė neturi įtakos.
-
Vykdyti šią užklausą laikotarpiu, kai nėra veiklos, kuri sukurs naujas rowgroups arba pakeis esamų rowgroups būseną. Pvz., toliau nurodyta veikla gali modifikuoti rowgroups būseną: index Komponavimo versija, indekso pertvarkymas, masinis įterpimas, įrašas mover Glaudinant Delta parduotuves. Prieš atlikdami užklausą, galite išjungti fono įrašo Mover užduotį naudodami sekimo vėliavėlę 634. Naudokite šią komandą Norėdami išjungti fono užduotį: DBCC TRACEON (634,-1). Kai užklausa baigiama vykdyti, neužmirškite iš naujo įgalinti foninę užduotį naudodami komandą: DBCC TRACEOFF (634,-1). Be to, įsitikinkite, kad nėra MASINIO įterpimo/BCP/SELECT-INTO komandų įterpiant duomenis į lenteles, kurios naudoja columnstore indeksą, kol vykdoma ši užklausa. Rekomenduojama naudoti šiuos veiksmus, kad užklausa negrįžtų į neteisingus teigiamus rezultatus.
Statusą
"Microsoft" patvirtino, kad tai yra "Microsoft" produktų, išvardytų skyriuje "taikoma", problema.