adat b 3 elméleti Flashcards
Kurzor
Rekordhalmaz és egy ezen mozgó iterátor
kliens oldali kurzor
a rekordhalmazt a szerver visszaküldi a kliensnek, amely a kliens oldalon, a kliens erőforrásaival dolgozza fel azt, tipikusan végigiterál rajtuk
szerver oldali kurzor
az eredmény rekordhalmaz túl nagy, ezért a szerver oldalon iterálunk és a kliens olyan ütemben kapja meg a rekordokat a hálózaton keresztül, ahogy ténylegesen felhasználja őket. Ez folyamatos, de kis mértékű hálózati forgalmat eredményez
kurzorok helyes használata:
- probléma jellege miatt a hagyományos procedurális megközelítéssel, rekordonkénti feldolgozással sokkal könnyebben és átláthatóbban oldható meg, mint sql dml segítségével, vagy nem is oldható meg máshogy
- a teljesítmény a kis várható rekorszám vagy egyéb alkalmazás-specifikus körülmény miatt nem kritikus
NE használjunk kurzort olyan esetben,
- amikor a feladat áttekinthető módon megoldható a standard halmaz-alapú SQL DML utasításokkal,
- vagy ha a rekordhalmaz várhatóan nagy méretű
Analitikus függvények és ablakozás
A rekordok egy csoportja, partíció alapján számolt értékeket csoportosítás nélkül is lekérdezhetővé teszik. A csoportosított és nem csoportosított lekérdezések lehetőségei egyszerre használhatók ki.
kurzorok típusai:
a forrás pontossága szempontjából:
- STATIC
- KEYSET
- DYNAMIC
- STATIC: a kurzor megnyitáskor a rekordhalaz tempdb adatbázis táblájaként jön létre, ezzel leválik a forrásról, és a forrás esetleges futás közbeni változásai már nem látszanak benne
- KEYSET: a létrehozás után beszúrt rekordok nem látszanak, de a meglévő rekordok változásai igen
- DYNAMIC: minden változás látszik
kurzorok típusai:
A kurzor láthatósága szempontjából:
- LOCAL
- GLOBAL
- LOCAL: a kurzor csak abban a kötegben tárolt eljárásban vagy triggerben elérhető (hivatkozható), melyben létrehozták
- GLOBAL: a kurzor az aktív kapcsolat bármelyik kötegéből, tárolt eljárásból vagy triggerből elérhető
Lényegesebb analitikus függvények:
- FIRST_VALUE, LAST_VALUE OVER
- ROW_NUMBERS() OVER
- LAG(kifejezés, [offset], [default]) OVER …
- PERCENT_RANK() OVER …
- FIRST_VALUE, LAST_VALUE OVER … a rendezett lista/partíció első/utolsó rekordjából számított kifejezés
- ROW_NUMBERS() OVER … a rendezett lista minden rekordjához egy futú sorszámot ad
- LAG(kifejezés, [offset], [default]) OVER … a rendezett lista aktuális rekordja előtti offset számú rekord alapján számítja a kifejezést. Jól használható idősorok elemzéséhez
- PERCENT_RANK() OVER … a rendezett lista minden rekordjához megadja a rendezési feltétel alapján számított rangot, tehát a relatív pozíciót 0 éa 1 közötti szám formájában
kurzorok típusai:
a mutató mozgathatóságának szempontjából:
- FORWARD ONLY
- SCROLL
a mutató mozgathatóságának szempontjából:
- FORWARD ONLY: csak előre mozgatható (csak a FETCH NEXT alkalmazható)
- SCROLL: szabadon mozgatható: ekkor a FETCH FIRST, LAST, PRIOR, NEXT, RELATIVE ABSOLUTE, bármelyike alkalmazható
A #temp táblából az EmployeeID oszlop, az első ertek a partícióból amiben Employee-val paricionálunk és ertek szerint rendezünk, az ertek-hez tartozó OrderDate ugyan abból a partícióból
SELECT DISTINCT EmployeeID,
FIRST_VALUE(ertek) OVER(PARTITION BY EmployeeID ORDER BY ertek DESC) AS max_ertek,
FIRST_VALUE(OrderDate) OVER(PARTITION BY EmployeeID ORDER BY ertek DESC) max_datum,
FIRST_VALUE(ertek) OVER(PARTITION BY EmployeeID ORDER BY ertek ASC) AS min_ertek,
FIRST_VALUE(OrderDate) OVER(PARTITION BY EmployeeID ORDER BY ertek ASC) min_datum
FROM #temp;
Kurzor használatának fontosabb lépései
DECLARE cursor_emp CURSOR FAST_FORWARD FOR
SELECT EmployeeID, LastName, Address FROM Employees ORDER BY LastName
OPEN cursor_emp;
FETCH NEXT FROM cursor_emp INTO @emp_id, @emp_name, @address;
…
CLOSE cursor_emp;
DEALLOCATE cursor_emp;