SQL Tuning: Klausa EXISTS versus IN

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

Author: Galih Satriaji

Bookaholic, Workaholic. Chubby. That's me!

10 thoughts

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

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

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

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *