Pernyataan Kasus versus pernyataan if yang dikodekan

Apa yang lebih efisien - menangani pernyataan kasus di sql atau menangani data yang sama menggunakan pernyataan if dalam kode. Saya bertanya karena kolega saya memiliki pertanyaan besar yang berisi banyak pernyataan kasus. Saya menyarankan dia untuk menghilangkan stres dari DB dengan mengkodekan pernyataan kasus. Menurut saya ini lebih efisien...tetapi mengapa?


person Eric    schedule 11.03.2010    source sumber
comment
Ini tidak jelas. Biasanya orang akan menyarankan Anda untuk menangani kueri data DB dalam database, dan ingat bahwa Anda dapat mengalami banyak masalah saat mencoba mempertahankan pola db dalam kode (grup/serikat/perbedaan) untuk itulah dbs dibuat...   -  person Adriaan Stander    schedule 12.03.2010
comment
Menurut saya Anda harus lebih menargetkan pertanyaan ini pada pengembang DB, tag sql tunggal saja tidak cukup, jenis basis data SQL apa yang Anda gunakan?   -  person AnthonyWJones    schedule 12.03.2010


Jawaban (5)


Ada pertanyaan mendasar yang tidak ditanyakan di sini: Apa yang sebenarnya dilakukan oleh pernyataan CASE ini?

Lupakan kinerja sebentar. Jika CASE hanya digunakan untuk mengubah hasil akhir kueri, dan sebenarnya dimungkinkan untuk mengganti fungsi yang sama dengan if atau select case di ASP, maka itu mungkin berarti kueri/prosedur database mencoba melakukan hal-hal yang UI harus bertanggung jawab, seperti pemformatan. Persoalan pemisahan kepentingan lebih serius dibandingkan persoalan kinerja apa pun yang mungkin terjadi.

Jika Anda memiliki pertanyaan seperti ini:

SELECT InvoiceID, InvoiceDate,
    CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...

Ini konyol, karena UI, atau lapisan apa pun yang melakukan pemetaan data ke domain, harus mengetahui cara mengonversi status dalam database ke deskripsi yang sesuai. Tidak masuk akal untuk memasukkan logika ini ke dalam kueri itu sendiri.

Di sisi lain, jika konstruksi CASE merupakan bagian penting dari kueri, seperti:

SELECT
    SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
    SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
FROM ...

Jangan coba-coba memindahkan logika semacam ini ke UI, karena databasenya jauh lebih baik dalam hal itu. Dan CASE secara semantik merupakan bagian dari kueri ("hitung total jumlah yang dibayar dan belum dibayar untuk x"), ia tidak mengambil alih fungsi UI apa pun.

Khawatirkan terlebih dahulu tentang di mana logika sebenarnya berada berdasarkan apa yang ingin dicapainya. Masalah kinerja hanya boleh didiskusikan jika Anda benar-benar melihat masalah kinerja yang signifikan.

person Aaronaught    schedule 12.03.2010
comment
Jawaban yang bagus! Sangat membantu! Persis apa yang saya cari. - person Eric; 12.03.2010
comment
Meskipun ini adalah jawaban yang bagus dan sangat benar, saya rasa jawaban ini tidak pernah benar-benar menjawab pertanyaan. Tampaknya semua itu jauh lebih penting, tetapi ini agak bersinggungan dengan pembicaraan UI dan menghindari pertanyaan tersebut. Dan Anda menyatakan ... memperhatikan masalah kinerja yang signifikan, selain menjalankan benchmark dan pengujian, mengajukan pertanyaan Mana yang lebih efisien dari mereka yang sudah mengetahuinya mungkin merupakan cara terbaik. - person Sean_A91; 15.09.2018
comment
Sudah lama tidak bertemu, tapi terima kasih atas penjelasan yang bagus ini! Membantu saya memilah beberapa hal;) - person Daniel; 18.11.2019

CASE pernyataan lebih disukai karena:

  • SQL: Ini adalah standar ANSI, membuatnya portabel untuk database lain tanpa perlu perubahan
  • mereka mendukung "hubungan arus pendek"
person OMG Ponies    schedule 11.03.2010

Menurut pengalaman saya, server basis data kami JAUH lebih besar daripada server aplikasi kami dan biasanya berada di bawah 30% dalam keadaan menganggur. Minta database mengelola data, lalu minta klien melakukan iterasi melalui resultSet. Praktik yang lebih baik adalah membuat database hanya mengembalikan data yang Anda perlukan (jika Anda dapat menentukannya terlebih dahulu).

person northpole    schedule 11.03.2010

Anda harus menanyakan (memfilter dan mengurutkan) data dalam database, dan menyerahkan presentasi ke tingkat presentasi. Hal ini disebabkan oleh dua alasan utama:

  • Basis data dibuat untuk menyaring dan mengurutkan data
  • Anda ingin menarik jumlah data paling sedikit melalui kabel dari DB jika diperlukan
person Keith Adler    schedule 11.03.2010

Saat saya membaca, di sini pertanyaan dasarnya adalah apakah CASE lebih baik daripada IF di SQL. Jawabannya juga tergantung pada kedalaman kondisi Anda. Menemukan artikel bagus di sini. Mungkin bermanfaat bagi seseorang. http://www.4guysfromrolla.com/webtech/102704-1.shtml

person Ram Dwivedi    schedule 08.01.2014
comment
itu cukup bagus! Sayangnya itu tidak menjelaskan apa pun tentang performanya. - person Zoltán Süle; 24.09.2020