sub-query berat

Database dan Structured Query Language

RE: sub-query berat

Postby iwancs » 21 Dec 2010, 16:35

kenapa statement sub query anda lambat, karena :

1. Mungkin ga ada index di tabel beli dan tabel jual, hasilnya tabel beli dan tabel jual akan di scan dari awal sampe akhir untuk setiap kode barang yang mau ditampilkan.


2. karena sub querynya kaya gini :
Code: Select all
  1. select sum(beli.qty) from beli where beli.kode_brg = b.kode_brg


statement ini bakal diulang2 terus untuk setiap record yang ditampilkan.
kalo tabel beli 1000 row, tabel barang 100 row, maka akan ada scanning row tabel beli sejumlah 100 x 1000 (tanpa index). Coba tambahin tabel barang sampe 1 juta row :help:. hmmmm bobo dulu ah....


maaph newbie banyak omong....:D


Penjelasan yang bagus dan lebih mengena

Iwan CS
iwancs
Junior Member
 
Posts: 5
Joined: 27 Oct 2010, 22:23

RE: sub-query berat

Postby ndoenk » 22 Dec 2010, 13:49

@DE : iyo gan, keliwatan di tabel jualnya, tapi mksdnya kemarin, pengen 1 detik ae, tapi 5 detik, menurut user wes gpp, jadi ya wes,[hr]
iwancs wrote:Hmm... coba kode diubah jadi gini deh, aku soalnya gak ada SQL Express, jadi cuman bayangin doang

Code: Select all
  1. SELECT b.kode_brg, b.nama_brg, sum_beli - sum_jual AS sisa

  2. FROM barang b

  3. LEFT JOIN (select beli.kode_brg, sum(beli.qty) FROM beli GROUP BY beli.kode_brg) sum_beli on sum_beli.kode_brg = b.kode_brg

  4. LEFT JOIN (select jual.kode_brg, sum(jual.qty) FROM jual GROUP BY jual.kode_brg) sum_jual on sum_jual.kode_brg = b.kode_brg



Dengan cara ini bisa juga di lakukan filtering terhadap tabel beli dan jual misalnya untuk rentang waktu tertentu sehingga jumlah data yang di ambil lebih sedikit. Saya gak tau yah di sqlexpress perintah yang setara dengan COALESCE, mungkin isnull, intinya pada sum_beli - sum_jual dipastikan selalu ada nilai, jika sum_beli atau sum_jual null, maka di set nilainya adalah 0.

Teoriku seh, kalo pada query penanya itu di ibaratnya load tabel barang dulu, kemudian setiap record di buatkan query untuk mendapatkan jumlah beli dan jumlah jual, sedangkan pada query ku, tabel yang di load adalah tabel barang, tabel beli dan tabel jual yang sudah di filter dan sudah di sum, berarti sudah di lakukan optimasi sehingga data tabel yang di hasilkan sudah tinggal sedikit.
Kalo di bayangkan jika di tabel beli ada 1000 record, maka setelah di lakukan query select sum(qty) from beli maka hasilnya tinggal sejumlah kode_brg, dan jumlah yang sedikit ini kemudian di left join terhadap tabel barang yang juga sedikit.
Untuk membuktikannya bisa di coba kecepatan antara sebelum dan sesudah di index.

Index menurutku yang penting ada di kode_brg dari tabel barang saja. Sebenernya juga penting di tabel beli dan jual untuk primary key nya di index

Semoga cukup jelas

Iwan Cahyadi Sugeng



kok eror mbah,
Code: Select all
  1. Msg 8155, Level 16, State 2, Line 1

  2. No column was specified for column 2 of 'sum_beli'.

  3. Msg 8155, Level 16, State 2, Line 1

  4. No column was specified for column 2 of 'sum_jual'.

  5. Msg 207, Level 16, State 1, Line 1

  6. Invalid column name 'sum_beli'.

  7. Msg 207, Level 16, State 1, Line 1

  8. Invalid column name 'sum_jual'.

ndoenk
Junior Member
 
Posts: 9
Joined: 24 May 2010, 17:02

RE: sub-query berat

Postby iwancs » 22 Dec 2010, 20:22

sori ada yang kurang, coba yang ini
Code: Select all
  1. SELECT b.kode_brg, b.nama_brg, sum_beli.qty - sum_jual.qty AS sisa

  2. FROM barang b

  3. LEFT JOIN (select beli.kode_brg, sum(beli.qty) qty FROM beli GROUP BY beli.kode_brg) sum_beli on sum_beli.kode_brg = b.kode_brg

  4. LEFT JOIN (select jual.kode_brg, sum(jual.qty) qty FROM jual GROUP BY jual.kode_brg) sum_jual on sum_jual.kode_brg = b.kode_brg



Iwan Cahyadi Sugeng

kok eror mbah,
Code: Select all
  1. Msg 8155, Level 16, State 2, Line 1

  2. No column was specified for column 2 of 'sum_beli'.

  3. Msg 8155, Level 16, State 2, Line 1

  4. No column was specified for column 2 of 'sum_jual'.

  5. Msg 207, Level 16, State 1, Line 1

  6. Invalid column name 'sum_beli'.

  7. Msg 207, Level 16, State 1, Line 1

  8. Invalid column name 'sum_jual'.


iwancs
Junior Member
 
Posts: 5
Joined: 27 Oct 2010, 22:23

Previous

Who is online

Users browsing this forum: No registered users and 1 guest

cron