Trying tobe SQL geek's

See also: Other Geeks@INDC

April 2008 - Posts

Faktor yang harus diperhatikan pada saat melakukan performance tuning

Ada beberapa hal yang harus diperhatikan apabila kita akan melakukan performance tuning terhadap suatu database, hal-hal tersebut antara lain:

 

  1. Buat kesepakatan dengan user, sampai sejauh mana user akan menerima hasil dari proses tuning yang kita lakukan terhadap suatu database. Hal ini perlu untuk kita, sebagai executor, dalam pelaksaan proses tuning dalam database. Mengapa demikian? Apabila kita melaksanakan proses tuning pada database, tentunya harapannya adalah adanya peningkatan performance dari database tersebut. Untuk itulah maka perlu adanya satu batasan berupa kesepakatan dengan user database, jangan sampai suatu proses tuning database tidak di accept oleh user karena user merasa performance database yang telah kita lakukan tuning tidak significant perubahannya.
  2. Identifikasi terlebih dahulu area-area mana saja pada database yang paling critical, apabila kita tidak segera melakukan tuning terhadap database tersebut, atau dengan kata lain prioritaskan proses tuning pada area-area yang dianggap paling critical.
  3. Identifikasi bottleneck yang ada dalam sebuah atau beberapa query. Biasanya hanya karena sebuah query yang jelek menyebabkan performance menjadi turun secara keseluruhan.
  4. Jika memungkinkan, review terlebih dahulu design dari database  yang akan kita tuning, apakah sudah bagus, sebelum kita melakukan tuning pada query-query terhadap database tersebut, karena apabila kita melakukan query tuning tetapi dari sisi design database  kurang bagus, maka tuning pada query akan tidak optimal, bahkan mungkin tidak ada impact sama sekali.
  5. Pelajari strategi index yang sudah berjalan pada database yang akan kita tuning, dan lakukan improvement terlebih dulu pada area index ini.
  6. Jika kita rasakan index yang ada sudah optimal, lakukan identifikasi fragmentation level dari index yang ada, dan pastikan index statistic selalu up-to-date.
  7. Pelajari bagaimana cara kerja query optimizer, pelajari dan test beberapa bentuk tipe JOIN.
  8. Hindari penggunaan sub-query (select in select).
  9. Selalu gunakan UNION ALL daripada UNION, apabila memang ada operasi yang membutuhkan UNION
  10. Evaluasi penggunaan trigger yang berdampak pada performance.
  11. Hindari penggunaan SELECT ...... INTO sampai dengan kita yakin bahwa user yang terhubung ke database hanya kita sendiri atau proses yang kita lakukan hanya memerlukan waktu yang tidak lama. Jika sangat terpaksa gunakan INSERT .......SELECT.
  12. Gunakan SET NOCOUNT ON dalam semua modular code kita (Stored Procedure), untuk mengurangi informasi yang diberikan server ke client dan untuk mengurangi beban network.
  13. Jika memungkinkan, gantu semua query yang merupakan inline query menjadi stored procedure yang berparameter
  14. Jika memungkinkan, gunakan temporary table untuk mengurangi jumlah record pada saat query. Jika temporary table tersebut di join dengan permanent table, buat index di dalam temporary table tersebut.
  15. Optimalkan penggunaan loop, pindahkan semua proses yang tidak memerlukan pengulangan keluar loop.
  16. Jangan gunakan cursor jika memang tidak sangat terpaksa, TSQL tidak dioptimalkan untuk memproses 1 record dalam satu waktu
Share this post: | | | |
Posted: Apr 28 2008, 09:16 AM by dkusdeni | with 2 comment(s)
Filed under:
Menghapus semua data dalam table pada sebuah database
Pernahkah anda merasa seperti wasting time untuk mengosongkan data sebuah database?Apalagi pada database tersebut banyak table yang di-reference dan ter-reference dengan table lainnya, tentunya anda harus menelusuri terlebih dahulu semua constraint yang ada dalam database tersebut, karena sebuah parent table tidak akan bisa dihapus datanya apabila data dalam parent table tersebut sudah di reference oleh child table-nya, dan constraint yang ada tidak memperbolehkan penghapusan secara cascade.

Dari kasus diatas bagaimana cara tercepat untuk melakukan penghapusan data pada sebuah database?

Kita lakukan dengan sedikit logic/algoritma sederhana dalam melakukan penghapusan ini.

Pertama, kita lakukan query terhadap system objects untuk me-list down semua user table yang ada pada database yang akan kita kosongkan datanya. Dalam Microsoft SQL Server 2005 ada system view yang fungsinya untuk menampilkan semua user table yang ada dalam sebuah database, kita gunakan view INFORMATION_SCHEMA.TABLES.

SELECT Table_Name FROM INFORMATION_SCHEMA.TABLES WHERE Table_Type = ‘BASE TABLE'

Query tersebut diatas akan menampilkan semua user table pada database aktif. Apabila kita jalankan query tersebut pada database AdventureWorks, maka SQL akan menampilkan list of user table yang ada pada database AdventureWorks.

Kedua, setelah kita dapatkan list of table tersebut, kita lakukan query untuk men-disable-kan constraint yang ada pada tiap-tiap table tadi. Tentunya supaya bisa terjadi proses looping/pengulangan untuk tiap-tiap table yang ada pada sebuah database tadi, maka kita harus tampung list of table tadi dalam sebuah cursor.

DECLARE cTable CURSOR FOR SELECT Table_Name FROM INFORMATION_SCHEMA.TABLES WHERE Table_Type = ‘BASE TABLE'

Script tersebut akan membuat sebuah cursor yang isinya adalah list of table dalam sebuah database aktif tadi.

Ketiga, kita harus lakukan sebuah loop dari cursor tadi untuk men-generate sebuat script query yang fungsinya untuk men-disable-kan constraint-constraint yang ada pada list of table tadi, kemudian script hasil generated tadi kita execute.

DECLARE @Query NVARCHAR(4000)

DECLARE @TableName SYSNAME

DECLARE cTable CURSOR FOR SELECT Table_Schema + ‘.' + Table_Name FROM INFORMATION_SCHEMA.TABLES WHERE Table_Type = 'BASE TABLE'

OPEN cTable

FETCH NEXT FROM cTable INTO @TableName

WHILE @@FETCH_STATUS = 0

BEGIN

        SET @Query = ‘ALTER TABLE ‘+@TableName+' NOCHECK CONSTRAINT ALL'

        EXEC sp_executesql @Query

        FETCH NEXT FROM cTable INTO @TableName

END

SET @Query = ‘ALTER TABLE ‘+@TableName+' NOCHECK CONSTRAINT ALL'

EXEC sp_executesql @Query

CLOSE cTable

Script diatas akan men-disable semua constraint yang ada pada tiap-tiap table yang akan kita kosongkan datanya.

Keempat, setelah kita men-disable-kan semua constraint, kita tinggal generate script untuk melakukan proses delete pada tiap-tiap table tadi dengan melakukan looping/pengulangan pada cursor yang tadi sudah kita buat.

OPEN cTable

FETCH NEXT FROM cTable INTO @TableName

WHILE @@FETCH_STATUS = 0

BEGIN

        SET @Query = ‘DELETE ‘+@TableName

        EXEC sp_executesql @Query

        FETCH NEXT FROM cTable INTO @TableName

END

SET @Query = ‘DELETE ‘+@TableName

EXEC sp_executesql @Query

CLOSE cTable

Script diatas akan menghapus semua user table tadi.

Kelima, setelah kita disable-kan constraint dan menghapus data yang ada pada tiap-tiap table, tentunya kita harus me-enable-kan kembali constraint yang ada pada tiap-tiap table tadi.

OPEN cTable

FETCH NEXT FROM cTable INTO @TableName

WHILE @@FETCH_STATUS = 0

BEGIN

        SET @Query = ‘ALTER TABLE ‘+@TableName + ‘ WITH CHECK CHECK CONSTRAINT ALL'

        EXEC sp_executesql @Query

        FETCH NEXT FROM cTable INTO @TableName

END

SET @Query = ‘ALTER TABLE ‘+@TableName + ‘ WITH CHECK CHECK CONSTRAINT ALL'

EXEC sp_executesql @Query

CLOSE cTable

DEALLOCATE cTable

Script diatas akan kembali me-enable-kan semua constraint yang ada pada tiap-tiap table.


Step by step diatas adalah step by step detailnya, sebetulnya proses looping/pengulangan bisa dilakukan hanya sekali saja, dimana proses generate scriptnya langsung ada 3, yaitu, untuk men-disable-kan constraint, men-delete data dan me-enable-kan kembali constraint.

Script lengkap dari artikel diatas (stored procedure) bisa didownload disini.

Kesimpulan, dengan sedikit bantuan system objects yang ada dalam database, kita bisa melakukan suatu trik tertentu yang bisa diaplikasikan pada database kita.

 

Share this post: | | | |
Posted: Apr 25 2008, 02:25 PM by dkusdeni | with 2 comment(s)
Filed under:
SQL Server Best Practice yang berhubungan dengan Database Files
  1. Simpan file data dan log dalam disk yang terpisah.
  2. Buat minimal 1 secondary filegroup di tiap-tiap database untuk memisahkan antara data system dan data aplikasi. Buat secondary filegroup tadi sebagai primary filegroup, sehingga setiap object yang di create tanpa menyebutkan filegroupnya akan disimpan dalam secondary filegroup tadi.
  3. Buat beberapa file database untuk tiap-tiap filegroup database, jangan gunakan 1 file database untuk beberapa filegroup.
  4. Jika memungkinkan pisahkan filegroup untuk data-data yang hanya memerlukan operasi read only dengan filegroup yang berisi data-data yang memerlukan operasi read-write. Dan tandai filegroup yang berisi data static menjadi READ-ONLY
  5. Jika filegroup sudah tidak terpakai, lebih baik di remove, karena akan membantu mengurangi resiko pada proses backup dan restore.
  6. Tempatkan tipe data TEXT atau IMAGE pada filegroups yang terpisah
  7. Simpan file backup database dalam disk yang berbeda dengan disk tempat menyimpan database, apabila backup database tersebut disimpan dalam disk.
  8. Jika ada table yang sangat besar, pertimbangkan untuk menggunakan table dan index partitioning.
  9. Hindari penggunakan autogrowth pada database, usahakan selalu hitung capacity planning untuk setiap database yang kita buat. Jika sangat terpaksa harus gunakan autogrowth, pastikan tempat di disk available ketika database butuh growth dan tetapkan batasan maksimalnya.
Share this post: | | | |
Posted: Apr 23 2008, 08:42 AM by dkusdeni | with 4 comment(s)
Filed under: