SQL Tuning: Klausa EXISTS versus IN
December 17, 2007
Masih mengenai masalah performance tuning pada Oracle SQL Query. Dalam kasus correlated subquery, kita biasa menggunakan IN dan NOT IN. Misalnya
SELECT * FROM tabel1 a
WHERE a.kolom1 NOT IN
( SELECT b.kolom1 FROM tabel2 b)
Dalam kasus yang sama, kita juga bisa menggunakan klausa EXISTS dan NOT EXISTS. Misalnya
SELECT * FROM tabel1 a
WHERE a.kolom1 NOT EXISTS
( SELECT b.kolom1 FROM tabel2 b)
Apa beda dua statement SQL ini? Klausa IN dan NOT IN memeriksa apakah sebuah nilai terdapat dalam list (bisa array, bisa correlated subquery seperti contoh di atas) sedangkan klausa EXISTS dan NOT EXISTS hanya memeriksa keberadaan ada atau tidaknya row pada suatu list. Secara performance, tentu jauh lebih cepat EXISTS daripada IN dalam hal correlated subquery.
Kapan kita menggunakan IN? Sebisa mungkin, gunakan EXISTS, IN digunakan dalam hal seperti misalnya contoh di bawah ini:
SELECT * FROM tabel1 a
WHERE a.kolom1 IN (’1′, ‘2′, ‘3′)
Posted in 












December 18th, 2007 at 10:40 am
setuju
December 18th, 2007 at 9:23 pm
jadi exists lebih aman dalam penggunaan query?
December 19th, 2007 at 7:53 am
#pudakonline:
mungkin kata aman kurang tepat ya, tapi jika hanya untuk memeriksa keberadaan nested select, EXISTS lebih cepat. IN harus membandingkan setiap value terlebih dahulu. kalau EXISTS, ada atau tidak suatu row di dalam list.
March 30th, 2008 at 10:50 am
saya mau tanya mengapa NOT IN tidak disarankan? dan apa kelemahan memekai syntak NOT IN? dan juga selein memakai NOT IN kita dapat menggunakan apa? TERIMA KASIH
March 30th, 2008 at 4:24 pm
Cost-nya lebih banyak daripada memakai NOT EXIST, karena NOT IN harus membandingkan value-nya. Contoh lain NOT EXIST digunakan kalau kita melakukan join 2 tabel tetapi tidak ada value yang ditampilkan.
July 4th, 2008 at 7:47 am
Setelah mencoba di SQL Server 2000, ternyata EXIST tidak dikenali.
WTF!?
July 4th, 2008 at 10:00 am
#dnial:
yak elah, ini kan Oracle, masak ya jalan di SQL Server 2000?
July 4th, 2008 at 1:01 pm
Kan harusnya SQL Query itu standar toh? Kirain SQL Server jugak support EXIST.
Gpp lah pake not in aja.
July 25th, 2008 at 6:56 pm
sya.punya query:
select a.berita_id,a.judul,a.berita,coaleske(count(b.komentar_id),0)as total_komentar
from berita a,komentar b
where a.berita_id=b.berita_id(+)
group by a.berita_id,a.judul,a.berita
order by berita_id desc;
nah query diatas kalo dirubah ke bntuk subquery gmn sntak nya? sya pngen bndgin cost nya! trus ad g referensi yg ngebahas cara ngitung cost dr query yg dieksekusi? dan komponen harga utk eksekusi query, sprti access cost, storage cost?
July 26th, 2008 at 2:12 pm
mas saya mau tanya lagi,,,saya punya query di my sql:
select a.berita_id,a.judul,a.berita,coalesce(b.total_komentar,0)
as total_komentar
from berita a left join
(select berita_id, count(komentar_id)as total_komentar
from komentar group by berita_id)b
using(berita_id)group by a.berita_id order by berita_id desc;
query diatas kalo untuk dioraclenya gimana ,,soalnya aku coba error??
trus aku juga mau tanya, komponen harga untuk eksekusi query itu apa saja….misalnya strorage cost,access cost dan ada ga referensi tang membahas tentang cara ngitung cost dari query yang akan dieksekusi???
contohnya untuk query 1 costnya 50,,aku pengen tau 50 itu dapetnya dari mana????