SQL Tuning: Klausa EXISTS versus IN

Posted by: on Dec 17, 2007 | 10 Comments

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′)

10 Comments

  1. budi
    December 18, 2007

    setuju

    Reply
  2. pudakonline
    December 18, 2007

    jadi exists lebih aman dalam penggunaan query?

    Reply
  3. Galih Satria
    December 19, 2007

    #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.

    Reply
  4. dewi
    March 30, 2008

    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

    Reply
  5. Galih Satria
    March 30, 2008

    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.

    Reply
  6. dnial
    July 4, 2008

    Setelah mencoba di SQL Server 2000, ternyata EXIST tidak dikenali.
    WTF!?

    Reply
  7. Galih Satria
    July 4, 2008

    #dnial:
    yak elah, ini kan Oracle, masak ya jalan di SQL Server 2000?

    Reply
  8. dnial
    July 4, 2008

    Kan harusnya SQL Query itu standar toh? Kirain SQL Server jugak support EXIST.

    Gpp lah pake not in aja.

    Reply
  9. harry
    July 25, 2008

    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?

    Reply
  10. harry
    July 26, 2008

    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????

    Reply

Leave a Reply

Switch to our mobile site