Kurzor v MS SQL
Popis
Príkaz jazyka SQL
V jednotlivých aplikačných rozhraniach (API) sa spravidla kurzory delia do následujúcich štyroch typov:
- Statické kurzory
- Kurzory riadené sadov kľúčov
- Dynamické kurzory
- Rýchle kurzory typu „iba dopredu“
Presný spôsob implementácie uvedených typov kurzorov a ich názvy sa medzi jednotlivými rozhraniami API a objektovými modelmi môžu mierne líšiť. Ich základné vlastnosti sú ale v podstate rovnaké.
Rôzne typy kurzorov sa líšia najmä v možnosti rolovania (posuvu) a takzvanej citlivosti voči zmenám v databáze vykonaných počas životnosti kurzora.
Statické kurzory
Statický kurzor predstavuje akúsi „snímku“ databázy v jednom časovom okamžiku. Tento typ kurzora je často označovaný ako snímková sada záznamov (snapshot).
Po vytvorení statického kurzoru sa celá sada záznamov v podstate vygeneruje v akejsi dočasnej tabuľke. Po tomto vytvorení sa údaje obsiahnuté v kurzore nezmenia.
Kurzory riadené sadou kľúčov
Pod pojmom sada kľúčov sa myslí množina hodnôt, ktorá jednoznačne identifikuje jednotlivé riadky v databáze.
Tento typ kurzora má nasledujúce významné vlastnosti:
- Vyžaduje k svojej činnosti jedinečný index na dodatočnej tabuľke – Pri otvorení kurzora sa vytvorí tabuľka (temporary) so všetkými kľúčmi, ktoré jednoznačne identifikujú riadky dát, podľa ktorých sa vyhľadávajú požadované riadky dát kurzora.
- Vlastné načítanie dát sa vykonáva podľa hodnoty kľúča až v okamžiku zadania príkazu FETCH – Dáta požadovaného riadku sú maximálne aktuálne a odpovedajú stavu pri jeho načítaní
- Tieto kurzory sú citlivé voči zmenám vykonaných v tých riadkoch, ktoré sú súčasťou sady kľúčov, a to aj voči ich odstráneniu
- Nie sú citlivé voči novým riadkom, pridaným do tabuľky po vytvorení kurzoru – Kurzor používa pre vyhľadávanie stále rovnakú sadu kľúčov, ktorá vznikla v okamžiku jeho otvorenia. Tým je pevne daná množina riadkov, s ktorou bude kurzor pracovať.
- Tento typ kurzora je možné využiť ako základ pre kurzor, ktorý vykonáva aktualizáciu dát
- Kurzor musí pracovať nad jedinečným indexom - tabuľky, nad ktorými sa deklaruje kurzor, musia obsahovať unikátny index
Dynamické kurzory
- Je typ kurzora, ktorý je citlivý voči všetkým zmenám v podkladových dátach – je citlivý voči pridaným, aktualizovaným ako aj odstráneným záznamom
- Neefektívny voči paralelnému prístupu – Dáta sú dlho otvorené, čím vznikajú kolízie s ostatnými užívateľmi
- Vysoká réžia – s každým príkazom FETCH sa kurzor v podstate zostavuje znovu - to znamená, že sa opäť vykonáva definovaný príkaz SELECT. Z tejto vlastnosti vyplýva vysoká náročnosť najmä pri spracovávaní rozsiahlych množín dát.
- Kurzor môže pracovať nad neunikátnym indexom – tento spôsob používania sa vo všeobecnosti nedoporučuje, pretože kurzor nevie určiť pozíciu v podkladových dátach (môže dôjsť k zacykleniu)
Tento typ kurzora je nutné používať „opatrne“ a iba v nevyhnutných prípadoch. Najvhodnejšie je použiť tento typ kurzora pre podkladové tabuľky, ktoré nie sú príliš rozsiahle. Kompenzáciou za réžiu pri príkaze FETCH, kedy sa opätovne zostavuje SELECT, môže byť vlastnosť daného RDBMS. Pri zostavovaní SELECT-u častokrát budú všetky dáta v cache pamäti (v závislosti od záťaže a dostupných zdrojov), t.j. že dynamický kurzor môže z veľkej časti bežať priamo v pamäti RAM.
Rýchle kurzory typu „iba dopredu“
Tento typ kurzora sa v literatúre bežne označuje aj pojmom „požiarna hadica“ (Fire Hose Cursor).
Najprv sa musí otvoriť, behom spracovania dát je možné sa posúvať iba vpred a nakoniec ho dealokujeme (bez zatvorenia). Za určitých podmienok sa tento typ kurzora aicky prevádza na typ iného kurzora (statický, dynamický, riadený sadou kľúčov).
Kurzor je určený iba pre operácie čítania, v inom prípade bude aicky prevedený na iný typ.
Pozri aj
SQL kurzor