//
you're reading...
Programming

Operasi Row-By-Row Tanpa Cursor di SQL Server

Beberapa waktu lalu saya perlu membuat sebuah trigger yang melakukan operasi Row-by-row. Akan tetapi, penggunaan cursor ternyata tidak bijak, karena performa nya payah. Trus gimana donk? Berikut ini contoh salah satu solusinya :

  1. Sediakan 1 variabel sebagai row number dan 1 variabel untuk flag (jika diperlukan)
  2. Dapatkan row pertama dengan memilih nilai minimum dari suatu query (SELECT MIN ...) atau baris teratas dari query terurut (SELECT TOP 1 ... ORDER BY ... ASC)
  3. Jika row pertama bukan null, set nilai variabel flag tadi menjadi true. Set row number dengan field hasil select
  4. Looping selama nilai flag adalah true
  5. Lakukan operasi yg diinginkan di dalam looping tersebut.
  6. Untuk mendapatkan row berikutnya, seperti pada langkah 2, pilih nilai minimum dari dari suatu query atau baris teratas dari query terurut. Bedanya, nilai tersebut harus lebih besar dari nilai sekarang (row number yang telah didapatkan pada langkah 3.) cth : SELECT MIN ... WHERE ... > @rowNumber
  7. Jika row berikutnya null, set nilai variabel flag menjadi false, agar kita dapat keluar dari looping.

Contoh kode
__________________________________

--Deklarasi variabel
DECLARE
@id VARCHAR(25),
@ada CHAR(1), --flag
@curId VARCHAR(25); --current row ID

--Dapatkan row pertama
SELECT TOP 1 @id = LOGIN
FROM USER
ORDER BY LOGIN;

--Set nilai flag
IF ISNULL(@id, 0) <> 0 SET @ada = '1';

--Loop
WHILE @ada = '1'
BEGIN

    --Lakukan operasi yang diinginkan di sini
    --...
    --...

    --Set row Number (row ID) saat ini.
    SET @curId = @id;
    SET @id = '';

    --Dapatkan baris berikutnya
    SELECT TOP 1 @id = LOGIN
    FROM USER
    WHERE LOGIN > @curId
    ORDER BY LOGIN;

    --Set nilai flag untuk keluar loop
    IF (ISNULL(@id, 0) = 0) OR (@id = '')
    SET @ada = '0';

END; --End loop

__________________________________

Catatan :

  • Untuk row ID (row number), gunakan tipe integer.
  • Untuk keluar dari loop, dapat pula menggunakan perintah BREAK

Referensi : sql-server-performance

Diskusi

Belum ada komentar.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: