KB3067257 – FIX: osalised tulemid kobardatud veergude toonindeksi päringus SQL Server 2014

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

Selles artiklis käsitletakse probleemi, mis ilmneb Microsoft SQL Server 2014 kobartulppdiagrammi indeksi päringu ajal. Selles artiklis antakse sellele probleemile lahendus .

Kokkuvõte

Kui kasutate päringut, mis skannib microsoft SQL Server 2014 kobartulppdiagrammi indeksit, võite harvadel juhtudel saada osalisi päringutulemeid.

See probleem ilmneb, kui käivitatakse järgmine toiming.

1. toiming

Transact-SQL-lause [INSERT või BULK-INSERT] lisab andmed tabelisse, mis sisaldab kobartulpaindeksit. Selle toimingu käigus kehtivad järgmised tingimused:

  • Kui Transact-SQL-lause jõuab rearühma läveni, suleb see rearühma R1, millel on segment S1.
  • Segment S1 osutab kohalikule sõnastikule D1.
  • Lause lisab endiselt ridu uude rearühma R2.
  • Kui rearühm R1 on suletud, ei pea kohalikku sõnastikku D1 ka sulgema. Kui sõnastikus D1 on veel vaba ruumi, saate selle lahti jätta ja seda uue rearühma R2 jaoks uuesti kasutada.

2. toiming

Kui Transact-SQL-lause lõpeb ebanormaalselt või tühistatakse enne uue rearühma R2 sulgemist, kehtivad järgmised tingimused.

  • Columnstore'i metaandmete muudatused toimuvad alamtransaktsioonides, mis tehakse välisest tehingust sõltumatult.
  • Rearühm R1 püsib süsteemitabelis "ehituse all" või NÄHTAMATUs olekus ning segmendi S1 viitab sõnastikule D1.
  • Süsteemitabelis pole sõnastiku D1 jaoks rida loodud. Selle põhjuseks on see, et Transact-SQL-lausel pole kunagi võimalust olemasolevat rida sulgeda. Seetõttu jääb olemasolev rida alles.

3. toiming

Tüüpilises olukorras, kui kordse liigutaja tausttoiming algab pärast Transact-SQL-lause lõppu, eemaldab tausttoiming nähtamatud rearühma R1 ja S1. Kui uus Transact-SQL-lause on nüüd käivitatud ja loob rearühma R3, millel on uus S3-segment, mis nõuab uut kohalikku sõnastikku, ei saa te sõnastiku D1 sisemist ID-d uuesti kasutada. Selle põhjuseks on see, et veerusalve mälu olek jälgib kasutatavate sõnastiku ID-sid. Seetõttu viitab segment S3 uuele sõnastikule D2.

Märkus. Selle etapi tingimus on levinud tingimus. Seetõttu korruptsioone ei esine.

4. toiming

Kui SQL Server kaotab sõnastiku D1 mälusoleku enne kordse teisaldustoimingu jõustumist (ja 3. juhises kirjeldatud viisil), ilmneb selles artiklis kirjeldatud probleem.

Märkmed

  • See sündmus ilmneb järgmistel põhjustel.

    • SQL Server ilmneb mälu ülekoormus ja sõnastiku D1 mälusisest sisu eemaldatakse mälust.
    • SQL Server eksemplar taaskäivitatakse.
    • Kobartulppdiagrammide indeksit sisaldav andmebaas läheb ühenduseta režiimi ja seejärel võrku tagasi.
  • Pärast mõne sellise sündmuse toimumist ja SQL Server mälusisesed struktuurid uuesti laadida, puudub kirje sõnastiku D1 ja selle sisemise ID kohta. Selle põhjuseks on see, et sõnastikku D1 ei säilitatud süsteemitabelites Transact-SQL-lause lõpetamisel või ühendamisel.

  • Kui kordse liigutaja tausttoiming algab sellest hetkest, ei teki tõrkeid, kuna kehtivad 3. juhises kirjeldatud tingimused.

  • Kui uus rearühm R3 luuakse enne kordse teisaldaja tausttoimingu käivitumist (eelmise täpploendiüksuse kohta), määrab SQL Server uuele sõnastikule D1 sama sisemise ID ja viitab rearühma R3 lõigu S3 sõnastikule D1.

  • Kui kordse liigutaja tausttoiming algab pärast eelmist toimingut, kukutab see koos uue sõnastikuga D1 nähtamatu rearühma R1 ja selle segmendid S1. Põhjus on selles, et kordse teisaldaja leiab, et uus sõnastik D1 ja algne sõnastik D1, mis S1 viited on samad.

    Märkus. Selle tingimuse ilmnemisel ei saa te esitada päringut rearühma R3 sisu kohta.

Lahendus

Probleem lahendati esmalt järgmistes SQL Server koondvärskendustes:

SQL Server 2014 SP1 koondvärskendus 1
        
         koondvärskendus 8 SQL Server 2014 jaoks
Selle probleemi lahendus sisaldub ka järgmistes üldistes leviväljaande (GDR) värskendustes:

SQL Server 2014 QFE turbevärskendus  
See värskendus sisaldab koondvärskendust 8, seda olulist parandust ja nõutavaid MS15-058 turbevärskendusi.

SQL Server 2014 GDR-i turbevärskendus  
See värskendus sisaldab seda olulist parandust ja kumulatiivseid turbeparandusi MS15-058 kaudu.

SQL Server 2014 hoolduspaketi Service Pack 1 GDR turvalisusega mitteseotud värskendus  
See värskendus sisaldab ainult seda olulist parandust.

Teave SQL Server koondvärskenduste kohta

Iga uus koondvärskendus SQL Server sisaldab kõiki kiirparandusi ja kõiki turbeparandusi, mis olid kaasatud eelmise koondvärskenduse. Vaadake uusimaid SQL Server koondvärskendusi.

      

Veel teavet

Tõrketeated Praegu mõjutatud andmebaasis, kui käivitate DBCC CHECKDB pärast selle paranduse rakendamist, kuvatakse järgmine tõrketeade:

Märkus.

Msg 5289, tase 16, osariik 1, rida 1
Kobartulppdiagrammi indeks "cci" tabelis "t" sisaldab vähemalt ühte andmeväärtust, mis ei vasta sõnastiku andmeväärtustele. Saate andmed varukoopiast taastada.

Kui käivitate päringu, mis skannib mõjutatud tabeleid pärast selle paranduse rakendamist, kuvatakse praegu mõjutatud andmebaasis järgmine tõrketeade:

Märkus.

Msg 5288, tase 16, osariik 1, rida 1
Veeruvaatlusindeks sisaldab ühte või mitut andmeväärtust, mis ei vasta sõnastiku andmeväärtustele. Lisateabe saamiseks käivitage DBCC CHECKDB.

Nende tõrgete korral saate rikkis andmed salvestada, eksportides mõjutatud veergude/rearühmade andmed hulgi ja laadides seejärel andmed pärast kukutamist või kobartulpdiagrammide registri loomist uuesti. Funktsiooni 5288 tõrke tõkestamiseks ja rikutud rearühmade vahelejätmise vana käitumise taastamiseks peaksite lubama jälituslipu 10207.

Märkus Tõrketeated 5288 ja 5289 luuakse selle rearühma R3 jaoks, millel on segment S3. Jälgimislipu 10207 abil ekstraktitakse rearühma R3 segmente, mida puuduv sõnastik D1 ei mõjuta.

Mõjutatud andmebaaside päringTuleb määratleda, kas see probleem juba mõjutab veerusalve indekseid sisaldavat andmebaasi, käivitage järgmine päring:

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 

Märkmed

  • See päring tuleb käivitada kõigi andmebaaside puhul, mis sisaldavad veerusalveindereid serveris, kus töötab SQL Server. Tühi tulemikomplekt näitab, et andmebaasi see ei mõjuta.

  • Käivitage see päring ajal, mil pole tegevusi, mis looks uusi rearühmi või muudaks olemasolevate rearühmade olekut. Näiteks järgmised tegevused võivad muuta rearühmade olekut: registri koostamine, registri ümberkorraldamine, hulgisisestus, deltasalve tihendav kordne teisaldaja.

    Enne päringu käivitamist saate jälituslipu 634 abil taustal töötava kordse teisaldustoimingu keelata. Selle käsu abil saate tausttoimingu keelata: DBCC TRACEON ( 634 , -1 ). Kui päring on käivitatud, ärge unustage tausttoimingut uuesti lubada, kasutades selleks käsku DBCC TRACEOFF ( 634 , -1 ).

    Veenduge ka, et selle päringu töötamise ajal poleks andmete tabelitesse lisamise käske HULGISISESTUS/BCP/SELECT-INTO.

    Nende juhiste abil on soovitatav vältida päringu valepositiivsete tulemite tagastamist.

Olek

Microsoft on kinnitanud, et see on jaotises „Rakenduskoht“ loetletud Microsofti toodete korral esinev probleem.