2. Kursory w SQL Server
Marek Adamczuk
marek.adamczuk@gmail.com
3. O mnie
• Przez 15 lat tworzę i wdrażam oprogramowanie klasy
ERP
• Z SQL Server znam się od wersji 6.5
• Aktualnie: Samozatrudniony, blisko związany z Grupą
Skłodowscy (branża: doradztwo podatkowe)
• MCP (od 1999), MSCE, MCDBA, MCTS
• W latach 2009-2011 MVP w kategorii SQL Server
• Prelegent (MTS, C2C, SQL Day, PLSSUG). Na SQL Day
nieprzerwanie od 2009 roku
• W wolnym czasie: tenis, gitara klasyczna i skrzypce
SQLDay 2012
4. O sesji
• Dlaczego kursory są złe?
• Kiedy kursory nie są złe?
• Kursory SQL rozebrane na czynniki pierwsze
–
–
–
–
LOCAL/GLOBAL?
STATIC/DYNAMIC/KEYSET?
SCROLL/FORWARD_ONLY?
READ_ONLY/SCROLL_LOCKS/OPTIMISTIC?
• Kursory API – jak to działa?
SQLDay 2013
5. Co to jest kursor?
• Resultset – wynik zapytania!
– Przystosowany do przetwarzania rekord po rekordzie,
zazwyczaj w pętli
– Można się po nim poruszać (przewijać)
– Może być edytowalny
SQLDay 2013
6. Dlaczego kursory są złe?
• Są znacznie wolniejsze niż przetwarzanie zbiorów, bo:
–
–
–
–
Operacje wykonywane są w pętli
Wymagają wielu drobnych operacji
Czasami przy każdym odczycie odświeżają wynik
Zajmują zasoby serwera
SQLDay 2013
7. Kiedy kursory nie są złe?
• Przy bardzo skomplikowanych obliczeniach
• Przy zagadnieniach iteracyjnych, w których kolejna
iteracja zależy od wyników poprzedniej
• Modyfikujemy dużo danych na tabeli o bardzo
intensywnym wielodostępie
SQLDay 2013
8. Lokalny czy globalny?
• Jak to działa?
– Automatyka DEALLOCATE
– Lokalny – „widziany” tylko przez bieżący zakres (tak jak
zmienna)
– Globalny – „widziany” przez całe połączenie
• DEFAULT:
– Opcja bazy CURSOR_DEFAULT (LOCAL/GLOBAL)
– DEAULT DEFAULTU: GLOBAL!
• Jak to obejrzeć?
– sys.dm_exec_cursors()
SQLDay 2013
9. Aktualność rezultatu
• Opcje: LOCAL, KEYSET, GLOBAL
• LOCAL: cały rezultat zapamiętany od razu przy OPEN,
modyfikacji nie widać
• GLOBAL: każdy rekord odświeżany przy fetch
• KEYSET: zapamiętane klucze, pola niekluczowe
odświeżane
SQLDay 2013
12. Kursory API
• Specjalne API do dostępu kursorowego
• Procedury (NIEUDOKUMENTOWANE):
–
–
–
–
sp_cursoropen
sp_cursorfetch
sp_cursor
sp_cursorclose
• Używane automatycznie przez ADO/OLEDB gdy
zdefiniujemy kursor po stronie serwera
• Na profilerze – RPC:Starting, RPC:Completed
• http://www.kaifa6.com/v/CSDNSQLDaimaShouce/sp_cur
sor.htm
SQLDay 2013
13. NASI SPONSORZY I PARTNERZY
Organizacja: Polskie Stowarzyszenie Użytkowników SQL Server - PLSSUG
Produkcja: DATA MASTER Maciej Pilecki