Pertanyaan dan jawaban dari milis sql server indo.
Numpang tanya ama temen2 yg tiap hari ber SQL ria.
Melihat ulasan yg diberikan sdr Chiang:
select ...
From (select . . .
From . . .)
where ...
Apakah query tsb diperkenankan jika kita mengacu pada tuning & optimizer?
Kira2 apa solusi selain bentuk query diatas dan apa pertimbangannya ?
Terima kasih sharing nya
On 3/8/11, Mr Kamsul Chiang <kslchiang@yahoo.com> wrote:
> Bro Afri,
> Berikut ini saya kirimkan contoh sederhana core query yang biasanya saya
> gunakan
> untuk mendapatkan kartu stok, tinggal di modifikasi sesuai kebutuhan.
>
> SELECT StockCode, SaldoAwal, QtyIn, QtyOut, SaldoAwal+QtyIn-QtyOut AS
> SaldoAkhir
> FROM (
> SELECT StockCode, Tanggal, SaldoAwal, QtyIn, QtyOut
> FROM (
> SELECT StockCode, Tanggal, Qty AS SaldoAwal, 0 AS QtyIn, 0 AS QtyOut
> FROM tblStockAwal WHERE StockCode = @KodeStock
> UNION ALL
> SELECT StockCode, Tanggal, 0 AS SaldoAwal, Qty AS QtyIn, 0 AS QtyOut
> FROM tblTransTerimaStock WHERE StockCode = @KodeStock
> UNION ALL
> SELECT StockCode, Tanggal, 0 AS SaldoAwal, 0 AS QtyIn, Qty AS QtyOut
> FROM tblTransKeluarStock WHERE StockCode = @KodeStock
> ) AS TableSementaraUntukUrutTanggal
> ORDER BY Tanggal
> ) AS TableHasilKartuStock
>
> Semoga bermanfaat.
>
> Salam
> K.C.
JAWABAN :
Menganalisa execution plan membutuhkan pengertian apa yang dilakukan operator fisikal. Cara paling gampang adalah melihat persentase yang diconsume operator fisikal. Namun bbrp kasus, persentase tersebut sering menyesatkan apalagi bila operator tersebut menyangkut operasi XML. Namun ada bbrp panduan yang sekiranya membantu spot bagian dari execution plan yang membutuhkan perhatian.
1. bila tabel berukuran besar dan terdapat clustered index scan, itu sama saja dengan table scan; kemungkinan yang terjadi adalah select query tidak terdapat filtering (ON, HAVING, WHERE) atau hasil filtering tidak SARG.
2. bila anda menemui bookmark lookup, berarti index yang digunakan tidak mencakup kolom yang ditampilkan dalam SELECT list. Sangat mudah utk fix problem ini dengan mengubah/create covering index (index yg menyertakan kolom di dalam SELECT list).
3. bila anda menemui komponen Nested Loop; itu bisa berarti buruk ataupun baik. Bila anda amati, nested loop akan me-look up pada inner table/index berdasarkan input pada outer table/index. Yang buruk adalah begitu besar jumlah row yang harus di-retrieve pada inner table/index.
4. Sebisa mungkin hindari akses tabel bbrp kali; anda bisa melihat sympton tersebut dari execution plan; dan most cases anda bisa akali dengan penggunaan OUTER APPLY, CROSS JOIN, GROUPING SETS, Common Table Expression dan fitur2 T-SQL lainnya. Fitur-fitur 'kaya' tersebut sudah ada dari SQL Server 2005. Itu merupakan salah satu alasan kenapa perlu upgrade dari SQL Server 2000 ke 2005/2008/2008R2.
5. biasanya bagian SQL ORDER BY/GROUP BY/DISTINCT menyebabkan timbulnya sorting operation di dalam execution plan. Sorting operation ada 2 macam, index sorting/implisit sort atau explisit sort dengan munculnya SORT operator. Index sorting memiliki performa lebih baik ketimbang explisit sort.
Penggunaan HINT pada dasarnya "memaksa" optimizer untuk execute execution plan yang disodorkan oleh user. Bila seseorang kurang mengerti "pesan" dari execution plan dalam analisa problem performance, penggunaan HINT tidak banyak berpengaruh.