Rabu, 29 September 2010

Meningkatkan Performa Stored Procedure

Kita lebih sering menggunakan stored procedure dibandingkan query yang panjang pada arsitektur client-server. Client hanya akan mengirimkan nama stored procedure(dan parameter) ke server. Hal ini akan memperingan kinerja dari transfer antara client dan server serta menampik isu-isu keamanan(menyembunyikan object data).

Dengan seringnya pemakaian strored procedure, maka kita juga perlu memperhatikan pembuatan stored procedure agar semakin efektif. Berikut ada beberapa tips dalam pembuatan stored procedure:

1. Pergunakanlah statement SET NO COUNT ON
Ketika kita melakukan query SELECT atau DML pada sql maka SQL akan mengembalikan jumlah rows affected. Dengan SET NO COUNT ON, jumlah rows affected tidak akan muncul lagi. Hal ini akan mengurangi traffic pada network.

2. Pergunakanlah nama schema dan objectnya
Pada stored procedure mempergunakan nama schema sebelum kita melakukan query suatu object akan mempermudah SQL Server dalam mencari object yang ingin dituju. Dengan ini SQL Server akan mencari object lebih cepat.
contoh:
SELECT * FROM   dbo.mst_books 


3. Jangan mempergunakan awalan "SP_" pada nama stored procedure
Awalan "SP_" digunakan oleh nama stored procedure pada system. SQL Server akan mencari stored procedure dengan awalan "SP_" pada database master terlebih dahulu. Pencarian ini akan memakan waktu dan jika stored procedure yang dibuat oleh user sama dengan stored procedure pada database master, maka stored procedure yang dibuat oleh user tidak akan pernah dieksekusi.


4. Pergunakanlah stored procedure sp_executesql daripada statement EXECUTE
Menggunakan sp_executesql membuat dynamic query kita dapat digunakan kembali. Ketika kita mengubah parameter pada sp_executesql, SQL Server akan menggunakan execution plan yang sama dengan sebelumnya. Sebagai contoh :
DECLARE
 @Query VARCHAR(100) 
DECLARE @Age INT 

SET @Age = 19 
SET @Query = 'SELECT * FROM dbo.mst_mahasiswa WHERE Age = ' + 
             CONVERT(VARCHAR(3), @Age) 

EXEC (@Query)



Pada contoh diatas, query diatas tidak reusable. Ketika kita mengganti age dengan 20, SQL Server tidak akan menggunakan execution plan yang sama dengan query sebelumnya.


DECLARE @Query NVARCHAR(100)

SET @Query = N'SELECT * FROM dbo.mst_mahasiswa WHERE Age = @Age'

EXECUTE Sp_executesql @Query, N'@Age int', @Age = 19  

EXECUTE Sp_executesql @Query, N'@Age int', @Age = 20

Dengan sp_executesql, SQL Server akan menggunakan execution plan yang sama, dimana itu akan mempercepat proses kerja SQL.



5Pergunakanlah IF EXISTS(SELECT 1) daripada (SELECT *)
Untuk mengecek apakah ada suatu record dalam suatu table, lebih baik kita menggunakan IF EXISTS(SELECT 1) daripada IF EXISTS(SELECT *). Hasil dari internal query SELECT * akan berarti sama saja dengan SELECT 1, karena dua-duanya akan berarti true. Untuk meminimalis proses maka kita tidak memerlukan record set yang komplit. Contoh :



IF EXISTS (SELECT 1 
           FROM   sysobjects 
           WHERE  name = 'mst_mahasiswa' 
                  AND TYPE = 'U') 



6Hindari mempergunakan SQL Cursors 
Cursor menggunakan banyak resource dalam memposisikan record dalam record set dan ini sangat mengurangi performa. Jika kita ingin memproses record satu persatu dalam loop, kita bisa menggunakan kalusa WHILE. Contoh :



DECLARE @temp_table TABLE (
  id        INT IDENTITY(1, 1),
  policy_no VARCHAR(50))
DECLARE @counter INT
DECLARE @max_record INT

INSERT INTO @temp_table
            (policy_no)
SELECT TOP 10 pr_policyno
FROM   mst_rule

SELECT @max_record = COUNT(*)
FROM   @temp_table

SET @counter=1

WHILE @counter <= @max_record
  BEGIN
      SELECT *
      FROM   @temp_table
      WHERE  id = @counter

      SET @counter=@counter + 1
  END 



7Usahakan membuat transaksi sependek mungkin
Jika suatu transaksi memiliki kemampuan untuk mengunci suatu object maka dengan transaksi yang pendek, waktu lock pada suatu object di database akan pendek. Semakin panjang waktu transaksi, maka waktu lock pada suatu object juga akan semakin panjang. Dalam beberapa kasus, lock juga bisa menimbulkan deathlock.



8. Kembalikanlah integer value sebagai return value daripada mengembalikan integer yang merupakan bagian record set.
Menggunakan statement return integer akan mempercepat proses karena SQL tidak perlu membuat record set untuk dikembalikan ke client.


Semoga beberapa tips berikut membantu teman-teman dalam pembuatan stored procedure yang lebih cepat. ^_^

Selasa, 28 September 2010

Eksekusi Query berulang kali

Sesekali kita ingin mengeksekusi query secara berulang-ulang, entah itu untuk testing atau untuk keperluan mengumpulkan data. Pertama kali saya menggunakan metode looping(while) untuk melakukan query berulang-ulang. Sampai akhirnya saya menemukan suatu cara dengan syntax GO, berikut contohnya :

CREATE TABLE dbo.data 
  ( 
     id    INT IDENTITY (1, 1), 
     ratio DECIMAL(19, 3) 
  ) 

GO 

INSERT INTO dbo.data (ratio) VALUES(Rand()) 

GO 20 


Yah dengan query ini setidaknya saya menghemat waktu saya daripada membuat query looping. Selamat mencoba, thanks.

Jumat, 24 September 2010

Menyimpan script yang sering dipakai dengan Template Explorer (MSSQL 2005)


Ketika kita melakukan development atau monitoring sesuatu pekerjaan, kita secara tidak sadar menggunakan berulang script tertentu. Untuk memudahkan penyimpanan dan pemanggilan script tersebut kita dapat menyimpannya di Template Explorer. Template Explorer menampilkan SQL Script yang kita simpan dalam bentuk tree dan dapat dikelompokan.

Template Explorer sendiri secara default menyimpan SQL Script yang membantu kita untuk membuat object di database. Data-data dari template explorer disimpan di Users Documents and Settings\ "User Name"\Application Data\Microsoft\Microsoft SQL Server\100\Tools\Shell\Templates.
Terdapat beberapa template yang berguna untuk membuat object seperti database, table, view, index, stored procedure, trigger, statistic, dan function. Selain itu ada template yang berguna untuk memanage server dengan membuat properti tambahan seperti linked servers, login, roles, user, dan template untuk Analysis Services dan SQL Server Compact 3.5 SP1.

Untuk membuka Template Explorer bisa dipilih dari menu View -> Template Explorer atau dengan menekan Ctrl + Alt + T. Setelah Template Explorer terbuka, kita bisa klik kanan di "SQL Server Templates" dan klik New -> Folder atau New -> Template. Jangan lupa di save ya ^_^