Saya baru-baru ini berdiskusi dengan pengembang lain yang mengklaim kepada saya bahwa GABUNGAN (SQL) tidak berguna. Secara teknis ini benar tetapi ia menambahkan bahwa menggunakan gabungan kurang efisien daripada membuat beberapa permintaan dan tabel tautan dalam kode (C # atau Java).
Baginya bergabung adalah untuk orang-orang malas yang tidak peduli dengan kinerja. Apakah ini benar? Haruskah kita menghindari menggunakan gabungan?
Jawaban:
Tidak, kita harus menghindari pengembang yang memiliki pendapat yang sangat salah.
Dalam banyak kasus, penggabungan basis data adalah beberapa urutan besarnya lebih cepat dari apa pun yang dilakukan melalui klien, karena penggabungan DB pulang pergi, dan DB dapat menggunakan indeks untuk melakukan penggabungan.
Dari atas kepala saya, saya bahkan tidak bisa membayangkan satu skenario di mana bergabung dengan benar akan lebih lambat daripada operasi sisi klien yang setara.Sunting: Ada beberapa kasus yang jarang terjadi di mana kode klien kustom dapat melakukan hal-hal lebih efisien daripada DB langsung bergabung (lihat komentar oleh meriton). Tapi ini sangat pengecualian.
sumber
Kedengarannya bagi saya seperti rekan Anda akan melakukannya dengan baik dengan database-dokumen no-sql atau toko kunci-nilai. Alat itu sendiri sangat bagus dan cocok untuk banyak masalah.
Namun, relasional database sangat dioptimalkan untuk bekerja dengan set. Ada banyak, banyak cara untuk menanyakan data berdasarkan gabungan yang jauh lebih efisien daripada banyak perjalanan pulang-pergi. Di sinilah serbaguna rdbms berasal. Anda dapat mencapai hal yang sama di toko nosql juga, tetapi Anda sering berakhir dengan membangun struktur terpisah yang cocok untuk setiap sifat kueri yang berbeda.
Singkatnya: Saya tidak setuju. Dalam RDBMS, gabungan merupakan hal mendasar . Jika Anda tidak menggunakannya, Anda tidak menggunakannya sebagai RDBMS.
sumber
Yah, dia salah dalam kasus umum.
Basis data dapat mengoptimalkan menggunakan berbagai metode, dibantu oleh petunjuk pengoptimal, indeks tabel, hubungan kunci asing dan mungkin informasi spesifik vendor database lainnya.
sumber
Tidak, seharusnya tidak.
Database secara khusus dirancang untuk memanipulasi set data (jelas ....). Karena itu mereka sangat efisien dalam melakukan ini. Dengan melakukan apa yang pada dasarnya adalah penggabungan manual dalam kode sendiri, ia berusaha mengambil alih peran sesuatu yang dirancang khusus untuk pekerjaan itu. Kemungkinan kodenya pernah seefisien yang ada di basis data sangat jauh.
Sebagai tambahan, tanpa bergabung, apa gunanya menggunakan database? dia mungkin juga hanya menggunakan file teks.
sumber
Jika "malas" didefinisikan sebagai orang yang ingin menulis lebih sedikit kode, maka saya setuju. Jika "malas" didefinisikan sebagai orang yang ingin memiliki alat melakukan apa yang mereka lakukan dengan baik, saya setuju. Jadi jika dia hanya setuju dengan Larry Wall (mengenai atribut programmer yang baik), maka saya setuju dengannya.
sumber
Ummm, bergabung adalah bagaimana database relasional menghubungkan tabel satu sama lain. Saya tidak yakin apa maksudnya.
Bagaimana membuat beberapa panggilan ke database menjadi lebih efisien daripada satu panggilan? Plus mesin sql dioptimalkan untuk melakukan hal semacam ini.
Mungkin rekan kerja Anda terlalu malas untuk belajar SQL.
sumber
Ya kamu harus.
Dan Anda harus menggunakan C ++ daripada C # karena kinerja. C # untuk orang malas.
Tidak tidak Tidak. Anda harus menggunakan C daripada C ++ karena kinerja. C ++ untuk orang malas.
Tidak tidak Tidak. Anda harus menggunakan perakitan alih-alih C karena kinerja. C untuk orang malas.
Ya, saya bercanda. Anda dapat membuat program lebih cepat tanpa bergabung dan Anda dapat membuat program menggunakan lebih sedikit memori tanpa bergabung. TAPI dalam banyak kasus, waktu pengembangan Anda lebih penting daripada waktu dan memori CPU. Berikan sedikit kinerja dan nikmati hidup Anda. Jangan buang waktu Anda untuk sedikit kinerja. Dan katakan padanya, "Mengapa kamu tidak membuat jalan raya langsung dari tempatmu ke kantormu?"
sumber
"Ini benar secara teknis" - demikian pula, basis data SQL tidak berguna: apa gunanya menggunakan satu ketika Anda bisa mendapatkan hasil yang sama dengan menggunakan banyak file CSV, dan menghubungkannya dalam kode? Heck, abstraksi apa pun untuk orang malas, mari kita kembali ke pemrograman kode mesin tepat di perangkat keras! ;)
Juga, pernyataannya tidak benar dalam semua kasus kecuali kasus yang paling berbelit-belit: RDBMS sangat dioptimalkan untuk membuat GABUNGAN cepat . Relasional sistem manajemen database, kan?
sumber
unnecessary
yang agakuseless
dalam kalimat sebelumnya. Mengatakan bahwa bergabung tidak berguna sama sekali tidak benar tanpa teknis yang perlu dipertimbangkan. Bagaimanapun, kesalahpahaman OP dan kolega tentang titik RDBMS tidak biasa: stackoverflow.com/q/5575682/47550Perusahaan terakhir tempat saya bekerja juga tidak menggunakan SQL. Sebagai gantinya mereka memindahkan pekerjaan ini ke lapisan aplikasi yang dirancang untuk menskala secara horizontal. Alasan untuk desain ini adalah untuk menghindari pekerjaan di lapisan basis data. Biasanya database yang menjadi hambatan. Lebih mudah untuk mereplikasi layer aplikasi daripada database. Mungkin ada alasan lain. Tapi ini yang bisa saya ingat sekarang.
Ya, saya setuju bahwa gabungan yang dilakukan pada lapisan aplikasi tidak efisien dibandingkan dengan gabungan yang dilakukan oleh basis data. Lebih banyak komunikasi jaringan juga.
Harap dicatat bahwa saya tidak mengambil sikap keras untuk menghindari bergabungnya SQL.
sumber
Tanpa bergabung, bagaimana Anda akan menghubungkan item pesanan dengan pesanan? Itulah keseluruhan poin dari sistem manajemen basis data relasional. Tanpa bergabung, tidak ada data relasional dan Anda mungkin juga menggunakan file teks untuk memproses data.
Kedengarannya dia tidak mengerti konsepnya jadi dia berusaha membuatnya tampak tidak berguna. Dia tipe orang yang sama yang menganggap excel adalah aplikasi basis data. Tampar dia dengan konyol dan katakan padanya untuk membaca lebih lanjut tentang basis data. Membuat banyak koneksi dan menarik data dan menggabungkan data melalui C # adalah cara yang salah untuk melakukan sesuatu.
sumber
Saya tidak mengerti logika pernyataan "bergabung dalam SQL tidak berguna". Apakah berguna untuk memfilter dan membatasi data sebelum mengerjakannya? Ketika Anda responden lain telah menyatakan ini adalah apa yang dilakukan oleh mesin database, itu harus menjadi apa yang mereka kuasai.
Mungkin seorang programmer malas akan tetap berpegang pada teknologi yang mereka kenal dan menghindari kemungkinan lain karena alasan non teknis.
Saya menyerahkan kepada Anda untuk memutuskan.
sumber
Mari kita perhatikan contoh: tabel dengan catatan faktur, dan tabel terkait dengan catatan item baris faktur. Pertimbangkan kode semu klien:
Jika Anda memiliki 100.000 faktur dengan masing-masing 10 baris, kode ini akan mencari 10 baris faktur dari tabel 1 juta, dan itu akan melakukannya 100.000 kali. Saat ukuran tabel bertambah, jumlah operasi terpilih meningkat, dan biaya setiap operasi pilih meningkat.
Karena komputer cepat, Anda mungkin tidak melihat perbedaan kinerja antara kedua pendekatan jika Anda memiliki beberapa ribu catatan atau lebih sedikit. Karena kenaikan biaya lebih dari linier, karena jumlah catatan meningkat (dalam jutaan, katakanlah), Anda akan mulai melihat perbedaan, dan perbedaannya akan menjadi kurang dapat ditoleransi ketika ukuran kumpulan data bertambah.
Bergabung, bagaimanapun. akan menggunakan indeks tabel dan menggabungkan dua set data. Ini berarti Anda memindai tabel kedua secara efektif sekali daripada mengaksesnya secara acak sebanyak N kali. Jika ada kunci asing yang ditentukan, database sudah memiliki tautan antara catatan terkait yang disimpan secara internal.
Bayangkan melakukan ini sendiri. Anda memiliki daftar siswa dan buku catatan menurut abjad dengan semua laporan nilai siswa (satu halaman per kelas). Buku catatan diurutkan sesuai dengan nama siswa, dalam urutan yang sama dengan daftar. Bagaimana Anda memilih untuk melanjutkan?
Atau:
sumber
Kedengarannya seperti kasus klasik " Saya bisa menulisnya lebih baik ." Dengan kata lain, dia melihat sesuatu yang dia lihat sebagai semacam rasa sakit di leher (menulis banyak gabungan dalam SQL) dan berkata, "Saya yakin saya bisa menulis yang lebih baik dan mendapatkan kinerja yang lebih baik." Anda harus bertanya kepadanya apakah dia a) lebih pintar dan b) lebih berpendidikan daripada orang biasa yang jauh di dalam kode optimasi Oracle atau SQL Server. Kemungkinannya bukan dia.
sumber
Dia tentu saja salah. Meskipun ada pro pasti untuk manipulasi data dalam bahasa seperti C # atau Java, bergabung paling cepat dalam database karena sifat SQL itu sendiri.
SQL terus merinci statistik mengenai data, dan jika Anda telah membuat indeks dengan benar, dapat dengan cepat menemukan satu catatan dalam beberapa juta. Selain fakta bahwa mengapa Anda ingin menyeret semua data Anda ke C # untuk bergabung ketika Anda bisa melakukannya langsung di tingkat basis data?
Pro untuk menggunakan C # ikut bermain ketika Anda perlu melakukan sesuatu secara iteratif. Jika Anda perlu melakukan beberapa fungsi untuk setiap baris, kemungkinan lebih cepat melakukannya dalam C #, jika tidak, menggabungkan data dioptimalkan dalam DB.
sumber
Saya akan mengatakan bahwa saya telah menemukan kasus di mana ia lebih cepat memecah kueri dan melakukan gabungan dalam kode. Yang sedang berkata, hanya dengan satu versi tertentu MySQL yang harus saya lakukan. Yang lainnya, basis data mungkin akan lebih cepat (perhatikan bahwa Anda mungkin harus mengoptimalkan kueri, tetapi itu akan tetap lebih cepat).
sumber
Saya menduga dia memiliki pandangan terbatas tentang apa yang harus digunakan untuk database. Salah satu pendekatan untuk memaksimalkan kinerja adalah membaca seluruh basis data ke dalam memori. Dalam situasi ini, Anda mungkin mendapatkan kinerja yang lebih baik dan Anda mungkin ingin melakukan gabungan jika memori untuk efisiensi. Namun ini tidak benar-benar menggunakan database, sebagai database IMHO.
sumber
MEMORY
mesin) murni dalam memori . Menerapkan kembali fungsi basis data tanpa basis data biasanya merupakan tanda kasus NIH yang parah;)Tidak, tidak hanya digabung dengan lebih baik dalam kode basis data yang ad-hoc C # / Java; tetapi biasanya beberapa teknik penyaringan dapat diterapkan, yang menghasilkan kinerja yang lebih baik.
sumber
Dia salah, bergabung adalah apa yang digunakan programmer yang kompeten. Mungkin ada beberapa kasus terbatas di mana metode yang diusulkannya lebih efisien (dan jika saya mungkin akan menggunakan database Documant) tetapi saya tidak bisa melihatnya jika Anda memiliki jumlah data yang layak. Misalnya, ambil kueri ini:
Asumsikan Anda memiliki 10 juta catatan di table1 dan 1 juta catatan di table2. Asumsikan 9 juta catatan dalam tabel 1 memenuhi klausa di mana. Asumsikan hanya 15 dari mereka ada di table2 juga. Anda dapat menjalankan pernyataan sql ini yang jika diindeks dengan benar akan mengambil milidetik dan mengembalikan 15 catatan di jaringan dengan hanya 1 kolom data. Atau Anda dapat mengirim sepuluh juta catatan dengan 2 kolom data dan secara terpisah mengirim 1 juta catatan lain dengan satu kolom data di seluruh jaringan dan menggabungkannya di server web.
Atau tentu saja Anda dapat menyimpan seluruh isi basis data di server web setiap saat yang benar-benar konyol jika Anda memiliki lebih dari jumlah data yang sepele dan data yang terus berubah. Jika Anda tidak membutuhkan kualitas database relasional maka jangan gunakan itu. Tetapi jika Anda melakukannya, maka gunakan dengan benar.
sumber
Saya sering mendengar argumen ini selama karier saya sebagai pengembang perangkat lunak. Hampir setiap kali dinyatakan, orang yang membuat klaim tidak memiliki banyak pengetahuan tentang sistem basis data relasional, cara kerjanya dan cara sistem tersebut harus digunakan.
Ya, bila digunakan secara tidak benar , bergabung tampaknya tidak berguna atau bahkan berbahaya. Tetapi ketika digunakan dengan cara yang benar, ada banyak potensi implementasi database untuk melakukan optimasi dan untuk "membantu" pengembang mengambil hasil yang benar dengan paling efisien.
Jangan lupa bahwa dengan menggunakan
JOIN
Anda memberi tahu database tentang cara Anda mengharapkan potongan data saling berhubungan dan oleh karena itu memberikan database lebih banyak informasi tentang apa yang Anda coba lakukan dan karenanya membuatnya lebih sesuai dengan kebutuhan Anda.Jadi jawabannya pasti: Tidak,
JOINS
sama sekali tidak berguna!sumber
Ini "secara teknis benar" hanya dalam satu kasus yang tidak sering digunakan dalam aplikasi (ketika semua baris semua tabel dalam gabungan tersebut dikembalikan oleh kueri). Di sebagian besar kueri, hanya sebagian kecil dari baris setiap tabel yang dikembalikan. Mesin database sering menggunakan indeks untuk menghilangkan baris yang tidak diinginkan, kadang-kadang bahkan tanpa membaca baris yang sebenarnya karena dapat menggunakan nilai yang disimpan dalam indeks. Mesin basis data itu sendiri ditulis dalam C, C ++, dll. Dan setidaknya seefisien kode yang ditulis oleh pengembang.
sumber
Kecuali saya benar-benar salah paham, logika dalam pertanyaan itu sangat cacat
Jika ada 20 baris dalam B untuk setiap A, 1000 baris dalam A menyiratkan 20k baris dalam B. Tidak mungkin hanya 100 baris dalam B kecuali ada banyak-banyak tabel "AB" dengan 20k baris dengan berisi pemetaan .
Jadi untuk mendapatkan semua informasi tentang 20 dari 100 baris B peta untuk setiap baris A Anda meja AB juga. Jadi ini bisa berupa:
Jadi "GABUNG" di klien tidak menambah nilai apa pun saat Anda memeriksa data. Bukannya itu bukan ide yang buruk. Jika saya mengambil satu objek dari database daripada mungkin lebih masuk akal untuk memecahnya menjadi set hasil yang terpisah. Untuk panggilan jenis laporan, saya akan meratakannya menjadi hampir selalu.
Bagaimanapun, saya akan mengatakan hampir tidak ada gunanya untuk bergabung silang sebesar ini. Ini contoh yang buruk.
Anda harus BERGABUNG di suatu tempat, dan itulah keahlian RDBMS. Saya tidak ingin bekerja dengan monyet kode klien yang berpikir mereka bisa melakukan yang lebih baik.
Renungan:
Untuk bergabung dalam klien membutuhkan objek persisten seperti DataTables (dalam .net). Jika Anda memiliki satu hasil yang diratakan, ia dapat dikonsumsi melalui sesuatu yang lebih ringan seperti DataReader. Volume tinggi = banyak sumber daya klien yang digunakan untuk menghindari database. GABUNG.
sumber