13
NASI SPONSORZY I PARTNERZY

SQLDay2013_MarekAdamczuk_Kursory

Embed Size (px)

Citation preview

Page 1: SQLDay2013_MarekAdamczuk_Kursory

NASI SPONSORZY I PARTNERZY

Page 2: SQLDay2013_MarekAdamczuk_Kursory

Kursory w SQL Server

Marek Adamczuk

[email protected]

Page 3: SQLDay2013_MarekAdamczuk_Kursory

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

Page 4: SQLDay2013_MarekAdamczuk_Kursory

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

Page 5: SQLDay2013_MarekAdamczuk_Kursory

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

Page 6: SQLDay2013_MarekAdamczuk_Kursory

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

Page 7: SQLDay2013_MarekAdamczuk_Kursory

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

Page 8: SQLDay2013_MarekAdamczuk_Kursory

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

Page 9: SQLDay2013_MarekAdamczuk_Kursory

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

Page 10: SQLDay2013_MarekAdamczuk_Kursory

Edytowalność/współbieżność

• OPCJE: READ_ONLY, SCROLL_LOCKS, OPTIMISTIC

• DEFAULT: to zależy

– Samego zapytania

– Istnienia kluczy

SQLDay 2013

Page 11: SQLDay2013_MarekAdamczuk_Kursory

Nawigacja

• OPCJE: FORWARD_ONLY, SCROLL

• FETCH:

– NEXT

– PRIOR

– RELATIVE @n

– ABSOLUTE @n

SQLDay 2013

Page 12: SQLDay2013_MarekAdamczuk_Kursory

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_cursor.htm

SQLDay 2013

Page 13: SQLDay2013_MarekAdamczuk_Kursory

NASI SPONSORZY I PARTNERZY

Organizacja: Polskie Stowarzyszenie Użytkowników SQL Server - PLSSUGProdukcja: DATA MASTER Maciej Pilecki