close

Ciekawostki SQL Server

 

W pierwszym wydaniu “Ciekawostek” przedstawiam interesujący przypadek dotyczący zachowania się kursorów w zależności od zastosowanych opcji.

Przy okazji polecam stronę z ogólnymi poradami dotyczącymi używania kursorów. Mimo tego, że pochodzi z czasów SQL Server 2000, w większości jest nadal aktualna.

Tłumaczenie znajduje się w załączonym pliku, w stopce artykułu.

 

Swój ogromny udział w przygotowaniu treści do Ciekawostek SQL Serwer miał Radek Celuch. Dziękujemy 🙂

 

Pomocne linki:

  1. https://technet.microsoft.com/en-us/library/ms180169%28v=sql.105%29.aspx Opis DECLARE CURSOR dla SQL Server 2008 R2
  2. http://sqlperformance.com/2012/09/t-sql-queries/cursor-options Ciekawy test wpływu opcji kursora na wydajność

Zadanie polega na podaniu różnic i ich przyczyny w wyniku

 

SELECT * FROM blog001 –wynik

 

dla opcji 1, 2 i 3 w poniższym przykładzie?

 

Pytanie bonusowe – jak nazywa się ten efekt?

 

UWAGA!!! Dla pierwszych dwóch osób, które udzielą prawidłowej odpowiedzi jest przewidziana nagroda!  Odpowiedź należy przesłać do Kasi Zając.

 

 

IF OBJECT_ID(‘blog001’) IS NOT NULL DROP TABLE blog001

GO

CREATE TABLE blog001(

                        ID Int IDENTITY(1,1) PRIMARY KEY,

                        Name Char(7000),

                        Salary     Numeric(18,2))

GO

INSERT INTO blog001(Name, Salary) VALUES(‘John’, 1900)

INSERT INTO blog001(Name, Salary) VALUES(‘Ed’,2050)

INSERT INTO blog001(Name, Salary) VALUES(‘Eddy’, 2070)

INSERT INTO blog001(Name, Salary) VALUES(‘Smith’, 2090)

GO

CREATE NONCLUSTERED INDEX ix_Salary ON blog001(Salary)

GO

BEGIN TRAN

DECLARE @ID INT

DECLARE TMP_Cursor CURSOR DYNAMIC –opcja 1

–DECLARE TMP_Cursor CURSOR FAST_FORWARD –opcja 2

–DECLARE TMP_Cursor CURSOR STATIC READ_ONLY FORWARD_ONLY –opcja 3

    FOR SELECT ID

        FROM blog001 WITH(index=ix_Salary)

        WHERE Salary < 3000

                                              

OPEN TMP_Cursor

FETCH NEXT FROM TMP_Cursor INTO @ID

WHILE @@FETCH_STATUS = 0

BEGIN

    –SELECT * FROM blog001 WITH(index=ix_Salary)

    UPDATE blog001

    SET Salary = Salary * 1.1

    WHERE ID = @ID

 

    FETCH NEXT FROM TMP_Cursor INTO @ID

END

CLOSE TMP_Cursor

DEALLOCATE TMP_Cursor

 

SELECT * FROM blog001 –wynik

 

ROLLBACK TRAN

GO

IF OBJECT_ID(‘blog001’) IS NOT NULL DROP TABLE blog001

GO

 

Tłumaczenie