it-swarm-id.com

Mana yang lebih cepat / terbaik? SELECT * atau SELECT column1, colum2, column3, dll

Saya pernah mendengar itu SELECT * pada umumnya praktik buruk untuk digunakan saat menulis perintah SQL karena lebih efisien untuk SELECT kolom yang Anda butuhkan secara khusus.

Jika saya perlu SELECT setiap kolom dalam sebuah tabel, harus saya gunakan

SELECT * FROM TABLE

atau

SELECT column1, colum2, column3, etc. FROM TABLE

Apakah efisiensi benar-benar penting dalam kasus ini? Saya akan berpikir SELECT * akan lebih optimal secara internal jika Anda benar-benar membutuhkan semua data, tetapi saya mengatakan ini tanpa pemahaman nyata tentang database.

Saya ingin tahu apa praktik terbaik dalam kasus ini.

PEMBARUAN: Saya mungkin harus menentukan bahwa satu-satunya situasi di mana saya benar-benar ingin melakukan SELECT * adalah ketika saya memilih data dari satu tabel di mana saya tahu semua kolom akan selalu perlu diambil, bahkan ketika kolom baru ditambahkan.

Namun, mengingat respons yang saya lihat, ini masih merupakan ide yang buruk dan SELECT * tidak boleh digunakan untuk banyak alasan teknis yang pernah saya pikirkan.

155
Dan Herbert

Salah satu alasan memilih kolom tertentu lebih baik adalah karena meningkatkan kemungkinan SQL Server dapat mengakses data dari indeks daripada meminta kueri data tabel.

Inilah postingan yang saya tulis tentang hal itu: Alasan sebenarnya mengapa kueri pemilihan adalah cakupan indeks yang buruk

Perubahan juga kurang rapuh, karena kode apa pun yang menggunakan data akan mendapatkan struktur data yang sama terlepas dari perubahan yang Anda buat pada skema tabel di masa mendatang.

158
Jon Galloway

Dengan spesifikasi Anda Anda memilih semua kolom, ada sedikit perbedaan saat ini . Namun, sadari bahwa skema database memang berubah. Jika Anda menggunakan SELECT * Anda akan mendapatkan kolom baru yang ditambahkan ke tabel, meskipun kemungkinan besar, kode Anda tidak siap untuk menggunakan atau menyajikan data baru itu. Ini berarti bahwa Anda mengekspos sistem Anda terhadap perubahan kinerja dan fungsi yang tidak terduga.

Anda mungkin bersedia mengabaikan ini sebagai biaya kecil, tetapi sadarilah bahwa kolom yang tidak Anda perlukan tetap harus:

  1. Baca dari basis data
  2. Dikirim melalui jaringan
  3. Marshall ke dalam proses Anda
  4. (untuk teknologi tipe ADO) Disimpan dalam tabel data dalam memori
  5. Diabaikan dan dibuang/dikumpulkan

Item # 1 memiliki banyak biaya tersembunyi termasuk menghilangkan beberapa indeks penutup potensial, menyebabkan pemuatan halaman data (dan cache server meronta-ronta), menimbulkan kunci baris/halaman/tabel yang mungkin dihindari.

Seimbangkan ini dengan penghematan potensial dari menentukan kolom versus * dan satu-satunya potensi penghematan adalah:

  1. Programmer tidak perlu mengunjungi kembali SQL untuk menambahkan kolom
  2. Network-transport SQL lebih kecil/lebih cepat
  3. SQL Server query waktu parse/validasi
  4. Cache paket kueri SQL Server

Untuk item 1, kenyataannya adalah Anda akan menambahkan/mengubah kode untuk menggunakan kolom baru apa pun yang mungkin Anda tambahkan, jadi ini adalah cuci.

Untuk item 2, perbedaannya jarang cukup untuk mendorong Anda ke ukuran paket atau jumlah paket jaringan yang berbeda. Jika Anda sampai pada titik di mana waktu transmisi pernyataan SQL adalah masalah utama, Anda mungkin perlu mengurangi tingkat pernyataan terlebih dahulu.

Untuk item 3, tidak ada penghematan sebagai perluasan dari * _ harus tetap terjadi, yang berarti tetap berkonsultasi dengan skema tabel. Secara realistis, daftar kolom akan dikenakan biaya yang sama karena harus divalidasi terhadap skema. Dengan kata lain ini adalah mencuci lengkap.

Untuk item 4, ketika Anda menentukan kolom tertentu, cache rencana kueri Anda bisa menjadi lebih besar tetapi saja jika Anda berurusan dengan kumpulan kolom yang berbeda (yang tidak apa yang telah Anda tentukan). Dalam hal ini, Anda ingin entri cache berbeda karena Anda menginginkan paket berbeda sesuai kebutuhan.

Jadi, ini semua turun, karena cara Anda menentukan pertanyaan, untuk masalah ketahanan dalam menghadapi modifikasi skema akhirnya. Jika Anda membakar skema ini ke ROM (itu terjadi), maka sebuah * dapat diterima.

Namun, pedoman umum saya adalah bahwa Anda hanya harus memilih kolom yang Anda butuhkan, yang berarti bahwa kadang-kadang itu akan terlihat seperti Anda meminta semuanya, tetapi DBA dan evolusi skema berarti bahwa beberapa kolom baru mungkin muncul yang dapat sangat mempengaruhi permintaan.

Saran saya adalah Anda harus SELALU MEMILIH kolom tertentu . Ingatlah bahwa Anda menjadi baik pada apa yang Anda lakukan berulang kali, jadi biasakan melakukannya dengan benar.

Jika Anda bertanya-tanya mengapa skema dapat berubah tanpa mengubah kode, pikirkan dalam hal pencatatan audit, tanggal efektif/kedaluwarsa dan hal-hal serupa lainnya yang ditambahkan oleh DBA untuk masalah kepatuhan secara sistemik. Sumber lain dari perubahan curang adalah denormalisasi untuk kinerja di tempat lain dalam sistem atau bidang yang ditentukan pengguna.

57
IDisposable

Anda hanya harus memilih kolom yang Anda butuhkan. Bahkan jika Anda membutuhkan semua kolom, masih lebih baik untuk membuat daftar nama kolom sehingga server sql tidak perlu membuat tabel sistem untuk kolom.

Selain itu, aplikasi Anda mungkin rusak jika seseorang menambahkan kolom ke tabel. Program Anda akan mendapatkan kolom yang tidak diharapkan juga dan mungkin tidak tahu cara memprosesnya.

Terlepas dari ini jika tabel memiliki kolom biner maka permintaan akan jauh lebih lambat dan menggunakan lebih banyak sumber daya jaringan.

33
Giorgi

Ada empat alasan utama mengapa select * adalah hal yang buruk:

  1. Alasan praktis paling signifikan adalah bahwa hal itu memaksa pengguna untuk secara ajaib mengetahui urutan kolom yang akan dikembalikan. Lebih baik untuk menjadi eksplisit, yang juga melindungi Anda terhadap perubahan tabel, yang membagi menjadi ...

  2. Jika nama kolom yang Anda gunakan berubah, lebih baik untuk menangkapnya lebih awal (pada titik panggilan SQL) daripada ketika Anda mencoba menggunakan kolom yang sudah tidak ada lagi (atau sudah diubah namanya, dll. )

  3. Mendaftar nama kolom membuat kode Anda jauh lebih terdokumentasi sendiri, dan mungkin lebih mudah dibaca.

  4. Jika Anda mentransfer melalui jaringan (atau bahkan jika tidak), kolom yang tidak Anda butuhkan hanyalah pemborosan.

30
pkh

Menentukan daftar kolom adalah biasanya opsi terbaik karena aplikasi Anda tidak akan terpengaruh jika seseorang menambahkan/memasukkan kolom ke tabel.

9
ilitirit

Menentukan nama kolom pasti lebih cepat - untuk server. Tapi jika

  1. kinerja bukan masalah besar (misalnya, ini adalah basis data konten situs web dengan ratusan, mungkin ribuan - tetapi bukan jutaan - baris di setiap tabel); DAN
  2. tugas Anda adalah membuat banyak aplikasi kecil, serupa (mis. situs web yang dikelola konten yang menghadap publik) menggunakan kerangka kerja umum, daripada membuat aplikasi satu kali yang rumit; DAN
  3. fleksibilitas penting (banyak penyesuaian skema db untuk setiap situs);

maka Anda lebih baik bertahan dengan SELECT *. Dalam kerangka kerja kami, penggunaan SELECT * yang berat memungkinkan kami untuk memperkenalkan bidang konten yang dikelola situs web baru ke sebuah tabel, memberikan semua manfaat CMS (versi, alur kerja/persetujuan, dll.), Sementara hanya menyentuh kode pada suatu beberapa poin, bukannya beberapa lusin poin.

Saya tahu guru DB akan membenci saya untuk ini - silakan, pilih saya - tetapi di dunia saya, waktu pengembang langka dan siklus CPU berlimpah, jadi saya menyesuaikan sesuai apa yang saya simpan dan apa yang saya buang.

7
Herb Caudill

SELECT * adalah praktik yang buruk bahkan jika kueri tidak dikirim melalui jaringan.

  1. Memilih lebih banyak data daripada yang Anda perlukan membuat kueri menjadi kurang efisien - server harus membaca dan mentransfer data tambahan, sehingga membutuhkan waktu dan menciptakan beban yang tidak perlu pada sistem (tidak hanya jaringan, seperti yang disebutkan lainnya, tetapi juga disk, CPU, dll.) ). Selain itu, server tidak dapat mengoptimalkan kueri sebaik mungkin (misalnya, menggunakan indeks penutup untuk kueri).
  2. Setelah beberapa waktu, struktur tabel Anda mungkin berubah, jadi SELECT * akan mengembalikan kumpulan kolom yang berbeda. Jadi, aplikasi Anda mungkin mendapatkan set data struktur yang tidak terduga dan merusak suatu tempat di hilir. Menyatakan kolom secara eksplisit menjamin bahwa Anda mendapatkan dataset struktur yang diketahui, atau mendapatkan kesalahan yang jelas pada tingkat basis data (seperti 'kolom tidak ditemukan').

Tentu saja, semua ini tidak terlalu menjadi masalah bagi sistem yang kecil dan sederhana.

6
VladV

Dari segi kinerja, SELECT dengan kolom tertentu dapat lebih cepat (tidak perlu membaca semua data). Jika kueri Anda benar-benar menggunakan SEMUA kolom, PILIH dengan parameter eksplisit masih lebih disukai. Perbedaan kecepatan pada dasarnya tidak akan terlihat dan mendekati waktu konstan. Suatu hari skema Anda akan berubah, dan ini adalah asuransi yang baik untuk mencegah masalah karena ini.

4
Yann Ramin

Banyak alasan bagus dijawab di sini sejauh ini, ini satu lagi yang belum disebutkan.

Penamaan kolom secara eksplisit akan membantu Anda dengan pemeliharaan di jalan. Pada titik tertentu Anda akan membuat perubahan atau pemecahan masalah, dan menemukan diri Anda bertanya "di mana sih kolom yang digunakan".

Jika Anda memiliki nama-nama yang tercantum secara eksplisit, maka menemukan setiap referensi ke kolom itu - melalui semua prosedur tersimpan Anda, tampilan, dll - mudah. Cukup buang skrip CREATE untuk skema DB Anda, dan cari teksnya.

4

Anda harus benar-benar hanya memilih bidang yang Anda butuhkan, dan hanya nomor yang diperlukan, yaitu.

SELECT Field1, Field2 FROM SomeTable WHERE --(constraints)

Di luar database, kueri dinamis menjalankan risiko serangan injeksi dan data cacat. Biasanya Anda menyelesaikannya menggunakan prosedur tersimpan atau kueri parameterisasi. Juga (walaupun tidak terlalu banyak masalah) server harus membuat rencana eksekusi setiap kali permintaan dinamis dieksekusi.

4
Matthew Abbott

Masalah dengan "select *" adalah kemungkinan membawa data yang sebenarnya tidak Anda butuhkan. Selama permintaan basis data aktual, kolom yang dipilih tidak benar-benar menambah perhitungan. Apa yang benar-benar "berat" adalah transportasi data kembali ke klien Anda, dan kolom apa pun yang tidak benar-benar Anda butuhkan hanya membuang bandwidth jaringan dan menambah waktu yang Anda tunggu untuk dikembalikan.

Bahkan jika Anda menggunakan semua kolom yang dibawa dari "select * ...", itu hanya untuk saat ini. Jika di masa depan Anda mengubah tata letak tabel/tampilan dan menambahkan lebih banyak kolom, Anda akan mulai memunculkannya dalam pilihan Anda, bahkan jika Anda tidak membutuhkannya.

Poin lain di mana pernyataan "pilih *" buruk adalah pada pembuatan tampilan. Jika Anda membuat tampilan menggunakan "pilih *" dan kemudian menambahkan kolom ke tabel Anda, definisi tampilan dan data yang dikembalikan tidak akan cocok, dan Anda harus mengkompilasi ulang tampilan Anda agar bisa berfungsi lagi.

Saya tahu bahwa menulis "pilih *" menggoda, karena saya benar-benar tidak suka menentukan secara manual semua bidang pada kueri saya, tetapi ketika sistem Anda mulai berevolusi, Anda akan melihat bahwa ada baiknya menghabiskan waktu ekstra ini/usaha dalam menentukan bidang daripada menghabiskan lebih banyak waktu dan upaya menghilangkan bug pada tampilan Anda atau mengoptimalkan aplikasi Anda.

3
Alexandre Brasil

Meskipun secara eksplisit daftar kolom bagus untuk kinerja, jangan menjadi gila.

Jadi, jika Anda menggunakan semua data, coba SELECT * untuk kesederhanaan (bayangkan memiliki banyak kolom dan melakukan permintaan GABUNG ... bisa jadi mengerikan). Lalu - ukur. Bandingkan dengan kueri dengan nama kolom yang tercantum secara eksplisit.

Jangan berspekulasi tentang kinerja, kur!

Cantuman eksplisit sangat membantu ketika Anda memiliki beberapa kolom yang berisi data besar (seperti badan tulisan atau artikel), dan tidak memerlukannya dalam kueri yang diberikan. Maka dengan tidak mengembalikannya di server DB jawaban Anda dapat menghemat waktu, bandwidth, dan throughput disk. Hasil kueri Anda juga akan lebih kecil, yang bagus untuk setiap cache kueri.

3
Paweł Hajdan

pasti mendefinisikan kolom, karena SQL Server tidak perlu melakukan pencarian pada kolom untuk menariknya. Jika Anda menentukan kolom, maka SQL dapat melewati langkah itu.

3
Nick Berardi

Itu selalu lebih baik untuk menentukan kolom yang Anda butuhkan, jika Anda memikirkannya satu kali, SQL tidak harus berpikir "wtf is *" setiap kali Anda query. Selain itu, seseorang nanti dapat menambahkan kolom ke tabel yang sebenarnya tidak Anda butuhkan dalam kueri Anda dan Anda akan lebih baik dalam hal itu dengan menentukan semua kolom Anda.

3
BrewinBombers

Pilih sama efisien (dalam hal kecepatan) jika Anda menggunakan * atau kolom.

Perbedaannya adalah tentang memori, bukan kecepatan. Ketika Anda memilih beberapa kolom SQL Server harus mengalokasikan ruang memori untuk melayani Anda permintaan, termasuk semua data untuk semua kolom yang Anda minta, bahkan jika Anda hanya menggunakan salah satunya.

Apa yang penting dalam hal kinerja adalah rencana eksekusi yang pada gilirannya sangat bergantung pada klausa WHERE Anda dan jumlah JOIN, OUTER JOIN, dll ...

Untuk pertanyaan Anda cukup gunakan SELECT *. Jika Anda membutuhkan semua kolom tidak ada perbedaan kinerja.

2
Jorge Córdoba

Hasilnya terlalu besar. Ini lambat untuk menghasilkan dan mengirim hasil dari mesin SQL ke klien.

Sisi klien, sebagai lingkungan pemrograman generik, tidak dan tidak seharusnya dirancang untuk memfilter dan memproses hasilnya (mis. Klausa WHERE, klausa ORDER), karena jumlah baris bisa sangat besar (mis. Puluhan juta baris).

2
kennytm

Memberi nama setiap kolom yang Anda harapkan dalam aplikasi Anda juga memastikan aplikasi Anda tidak akan rusak jika seseorang mengubah tabel, selama kolom Anda masih ada (dalam urutan apa pun).

2
Don

BUKAN lebih cepat untuk menggunakan nama bidang eksplisit versus *, jika dan hanya jika, Anda perlu mendapatkan data untuk semua bidang.

Perangkat lunak klien Anda seharusnya tidak bergantung pada urutan bidang yang dikembalikan, jadi itu juga omong kosong.

Dan itu mungkin (walaupun tidak mungkin) bahwa Anda perlu mendapatkan semua bidang menggunakan * karena Anda belum tahu bidang apa yang ada (pikirkan struktur basis data yang sangat dinamis).

Kerugian lain menggunakan nama bidang eksplisit adalah bahwa jika ada banyak dari mereka dan mereka panjang maka itu membuat membaca kode dan/atau log kueri lebih sulit.

Jadi aturannya adalah: jika Anda membutuhkan semua bidang, gunakan *, jika Anda hanya perlu satu bagian, beri nama secara eksplisit.

2
user9385

Itu tergantung pada versi server DB Anda, tetapi versi SQL modern dapat men-cache rencana itu. Saya akan mengatakan pergi dengan apa pun yang paling dipelihara dengan kode akses data Anda.

1
Keith

Salah satu alasan mengapa lebih baik berlatih mengeja kolom mana yang Anda inginkan adalah karena kemungkinan perubahan di masa depan dalam struktur tabel.

Jika Anda membaca data secara manual menggunakan pendekatan berbasis indeks untuk mengisi struktur data dengan hasil kueri Anda, maka di masa mendatang ketika Anda menambah/menghapus kolom Anda akan sakit kepala mencoba untuk mencari tahu apa yang salah.

Mengenai apa yang lebih cepat, saya akan tunduk kepada orang lain karena keahlian mereka.

1
dpollock

Dan ingat jika Anda memiliki gabungan internal dengan definisi Anda tidak perlu semua kolom karena data di kolom gabungan diulang.

Ini tidak seperti daftar kolom di server SQl sulit atau bahkan memakan waktu. Anda cukup menyeret mereka dari browser objek (Anda bisa mendapatkan semuanya sekaligus dengan menyeret dari kolom Word). Untuk membuat hit kinerja permanen pada sistem Anda (karena ini dapat mengurangi penggunaan indeks dan karena mengirim data yang tidak dibutuhkan melalui jaringan mahal) dan membuatnya lebih mungkin bahwa Anda akan memiliki masalah yang tidak terduga karena perubahan database (kadang-kadang kolom ditambahkan bahwa Anda tidak ingin pengguna melihat misalnya) hanya untuk menghemat kurang dari satu menit waktu pengembangan adalah pandangan pendek dan tidak profesional.

1
HLGEM

Apa yang dikatakan semua orang di atas, ditambah:

Jika Anda berupaya mendapatkan kode yang dapat dibaca yang dapat dibaca, lakukan sesuatu seperti:

PILIH foo, bilah DARI widget;

langsung dibaca dan menunjukkan niat. Jika Anda melakukan panggilan itu, Anda tahu apa yang Anda dapatkan kembali. Jika widget hanya memiliki kolom foo dan bilah, maka memilih * berarti Anda masih harus memikirkan apa yang Anda dapatkan kembali, mengonfirmasi pesanan dipetakan dengan benar, dll. Namun, jika widget memiliki lebih banyak kolom tetapi Anda hanya tertarik pada foo dan bar, maka kode Anda menjadi berantakan ketika Anda meminta wildcard dan kemudian hanya menggunakan sebagian dari apa yang dikembalikan.

1
Faisal

SELECT * diperlukan jika seseorang ingin mendapatkan metadata seperti jumlah kolom.

1
Mark Etable

Untuk menambahkan apa yang dikatakan orang lain, jika semua kolom yang Anda pilih dimasukkan dalam indeks, set hasil Anda akan ditarik dari indeks daripada mencari data tambahan dari SQL.

1
Mike

Seperti kebanyakan masalah, itu tergantung pada apa yang ingin Anda capai. Jika Anda ingin membuat kisi db yang memungkinkan semua kolom dalam tabel apa pun, maka "Pilih *" adalah jawabannya. Namun, jika Anda hanya perlu kolom tertentu dan menambah atau menghapus kolom dari kueri dilakukan jarang, maka tentukan secara individual.

Itu juga tergantung pada jumlah data yang ingin Anda transfer dari server. Jika salah satu kolom didefinisikan sebagai memo, grafik, gumpalan, dll. Dan Anda tidak memerlukan kolom itu, sebaiknya Anda tidak menggunakan "Pilih *" atau Anda akan mendapatkan sejumlah besar data yang tidak Anda perlukan. inginkan dan kinerja Anda dapat menderita.

1
Mark

Apakah masalah efisiensi sangat tergantung pada ukuran dataset produksi Anda (dan tingkat pertumbuhannya). Jika dataset Anda tidak akan sebesar itu, dan mereka tidak akan tumbuh secepat itu, mungkin tidak ada banyak keuntungan kinerja untuk memilih kolom individual.

Dengan kumpulan data yang lebih besar dan laju pertumbuhan data yang lebih cepat, keunggulan kinerja menjadi semakin penting.

Untuk melihat secara grafis apakah ada perbedaan atau tidak, saya akan menyarankan menggunakan penganalisa kueri untuk melihat rencana eksekusi permintaan untuk SELECT * dan SELECT col1, col2, dll. Yang seharusnya memberitahu Anda yang mana dari dua pertanyaan yang lebih efisien. Anda juga dapat menghasilkan beberapa data uji dengan volume yang berbeda-beda untuk melihat waktu yang ditentukan.

0
Scott Lawrence

Akan dibanting karena hal ini, tetapi saya melakukan pemilihan * karena hampir semua data saya diambil dari SQL Server Views yang menggabungkan nilai-nilai yang diperlukan dari beberapa tabel menjadi satu tampilan yang mudah diakses.

Saya kemudian ingin semua kolom dari tampilan yang tidak akan berubah ketika bidang baru ditambahkan ke tabel yang mendasarinya. Ini memiliki manfaat tambahan yang memungkinkan saya mengubah dari mana data berasal. FieldA dalam View dapat dihitung sekaligus dan kemudian saya dapat mengubahnya menjadi statis. Either way menyediakan FieldA kepada saya.

Keindahan ini adalah memungkinkan lapisan data saya untuk mendapatkan dataset. Kemudian melewati mereka ke BL saya yang kemudian dapat membuat objek dari mereka. Aplikasi utama saya hanya tahu dan berinteraksi dengan objek. Saya bahkan membiarkan objek saya untuk membuat sendiri ketika melewati sebuah datarow.

Tentu saja, saya satu-satunya pengembang, jadi itu membantu juga :)

0
klkitchens

Tentukan kolom yang ingin Anda SELECT setiap saat. Tidak ada alasan untuk tidak melakukannya dan peningkatan kinerja tidak sia-sia.

Mereka seharusnya tidak memberikan opsi untuk "SELECT *"

0
cazlab

Jika Anda membutuhkan setiap kolom maka cukup gunakan SELECT * tetapi ingat bahwa urutan berpotensi berubah jadi ketika Anda mengkonsumsi hasilnya akses mereka dengan nama dan bukan dengan indeks.

Saya akan mengabaikan komentar tentang bagaimana * perlu mendapatkan daftar - kemungkinan parsing dan memvalidasi kolom bernama sama dengan waktu pemrosesan jika tidak lebih. Jangan mengoptimalkan secara prematur ;-)

0
DamienG

Perbedaan utama antara keduanya adalah jumlah data yang dikirim bolak-balik. Setiap argumen tentang perbedaan waktu pada dasarnya cacat dalam "select *" dan "select col1, ..., colN" menghasilkan jumlah pekerjaan relatif yang sama dengan yang dilakukan oleh mesin DB. Namun, mentransmisikan 15 kolom per baris vs 5 kolom per baris adalah perbedaan 10 kolom.

0
Jeff Hubbard

Dalam hal efisiensi pelaksanaan, saya tidak mengetahui adanya perbedaan yang signifikan. Tetapi untuk efisiensi programmer saya akan menulis nama bidang karena

  • Anda tahu urutannya jika Anda perlu mengindeks dengan angka, atau jika driver Anda berperilaku lucu pada nilai-nilai gumpalan, dan Anda memerlukan pesanan yang pasti
  • Anda hanya membaca bidang yang Anda butuhkan, jika Anda harus menambahkan lebih banyak bidang
  • Anda mendapatkan galat sql jika Anda salah mengeja atau mengganti nama bidang, bukan nilai kosong dari recordset/baris
  • Anda bisa lebih baik membaca apa yang terjadi.
0
Erik

Saya melihat bahwa beberapa orang tampaknya berpikir bahwa butuh waktu lebih lama untuk menentukan kolom. Karena Anda bisa menyeret daftar kolom dari browser objek, mungkin diperlukan satu menit ekstra untuk menentukan kolom (itu jika Anda memiliki banyak kolom dan perlu meluangkan waktu untuk meletakkannya di baris yang berbeda) dalam kueri. Mengapa orang berpikir itu sangat memakan waktu?

0
HLGEM

Saya selalu merekomendasikan menentukan kolom yang Anda butuhkan, kalau-kalau skema Anda berubah dan Anda tidak perlu kolom tambahan.

Selain itu, kualifikasi nama kolom dengan nama tabel. Ini penting ketika kueri berisi gabungan. Tanpa kualifikasi tabel, sulit untuk mengingat kolom mana yang berasal dari tabel mana, dan menambahkan kolom dengan nama yang sama ke salah satu tabel lainnya dapat memecah kueri Anda.

0
mxsscott

Dari segi kinerja, saya telah melihat komentar bahwa keduanya sama. tetapi aspek kegunaan ada beberapa + dan -'s

Saat Anda menggunakan (pilih *) dalam kueri dan jika seseorang mengubah tabel dan menambahkan bidang baru yang tidak perlu untuk kueri sebelumnya itu adalah overhead yang tidak perlu. Dan bagaimana jika bidang yang baru ditambahkan adalah gumpalan atau bidang gambar ??? waktu respons kueri Anda akan sangat lambat.

Di sisi lain jika Anda menggunakan (pilih col1, col2, ..) dan jika tabel diubah dan menambahkan bidang baru dan jika bidang-bidang tersebut diperlukan dalam hasil yang ditetapkan, Anda selalu perlu mengedit kueri pemilihan Anda setelah perubahan tabel.

Tapi saya sarankan untuk selalu menggunakan pilih col1, col2, ... di kueri Anda dan ubah kueri jika tabel diubah nanti ...

0
Lahiru Cooray

Sangat penting bagi kinerja untuk tidak menggunakan pilih * ketika Anda memiliki gabungan karena definisi setidaknya dua bidang berisi data yang sama. Anda tidak ingin membuang sumber daya jaringan mengirimkan data yang tidak Anda perlukan dari server database ke aplikasi atau server web. Ini mungkin tampak lebih mudah untuk menggunakan pilih * tetapi ini adalah praktik yang buruk. Karena mudah untuk menyeret nama kolom ke dalam kueri, lakukan saja itu.

Masalah lain yang terjadi ketika menggunakan pilih * adalah bahwa ada orang idiot yang memilih untuk menambahkan bidang baru di tengah tabel (selalu praktik yang buruk), jika Anda menggunakan pilih * sebagai dasar untuk menyisipkan maka tiba-tiba urutan kolom Anda mungkin salah dan Anda dapat mencoba memasukkan nomor jaminan sosial ke dalam honorarium (jumlah uang yang dapat dibayarkan pembicara untuk memilih contoh non-acak) yang bisa menjadi hal yang sangat buruk bagi integritas data. Bahkan jika pilih bukan sebuah sisipan, itu terlihat buruk bagi pelanggan ketika data tiba-tiba dalam urutan kata kerja di laporan atau halaman web.

Saya pikir memikirkan keadaan ketika menggunakan pilih * lebih disukai daripada menggunakan daftar kolom. Anda mungkin berpikir itu lebih mudah untuk dipertahankan, tetapi sebenarnya tidak dan akan mengakibatkan aplikasi Anda menjadi lebih lambat tanpa alasan ketika bidang yang tidak Anda butuhkan ditambahkan ke tabel. Anda juga harus menghadapi masalah memperbaiki hal-hal yang tidak akan rusak jika Anda telah menggunakan daftar kolom, sehingga waktu yang Anda simpan tanpa menambahkan kolom digunakan untuk melakukan hal ini.

0
HLGEM

hei, bersikap praktis. gunakan pilih * saat membuat prototipe dan pilih kolom tertentu saat menerapkan dan menggunakan. dari perspektif rencana eksekusi, keduanya relatif identik pada sistem modern. Namun, memilih kolom tertentu membatasi jumlah data yang harus diambil dari disk, disimpan dalam memori dan dikirim melalui jaringan.

akhirnya rencana terbaik adalah memilih kolom tertentu.

0
siculars

Juga ingat perubahan. Hari ini, Select * hanya memilih kolom yang Anda butuhkan, tetapi besok juga dapat memilih kolom varbinary (MAX) yang baru saja saya tambahkan tanpa memberi tahu Anda, dan Anda sekarang juga mengambil kembali semua 3,18 Gigabyte Data Biner yang tidak di meja kemarin.

0
Michael Stum

Mari kita pikirkan mana yang lebih cepat. Jika Anda dapat memilih hanya data yang Anda butuhkan maka itu lebih cepat. Namun dalam pengujian Anda dapat menarik semua data untuk menilai data apa yang dapat disaring berdasarkan kebutuhan bisnis.

0
mikedopp

Ada beberapa kasus di mana SELECT * baik untuk tujuan pemeliharaan, tetapi secara umum harus dihindari.

Ini adalah kasus khusus seperti tampilan atau prosedur tersimpan di mana Anda ingin perubahan dalam tabel yang mendasari untuk menyebar tanpa perlu pergi dan mengubah setiap tampilan dan proc yang disimpan yang menggunakan tabel. Bahkan kemudian, ini dapat menyebabkan masalah itu sendiri, seperti dalam kasus di mana Anda memiliki dua pandangan yang bergabung. Satu tabel yang mendasarinya berubah dan sekarang tampilan menjadi ambigu karena kedua tabel memiliki kolom dengan nama yang sama. (Perhatikan ini bisa terjadi kapan saja Anda tidak memenuhi syarat semua kolom Anda dengan awalan tabel). Bahkan dengan awalan, jika Anda memiliki konstruk seperti:

SELECT A ., B. - Anda dapat memiliki masalah di mana klien sekarang mengalami kesulitan dalam memilih bidang yang tepat.

Secara umum, saya tidak menggunakan SELECT * kecuali saya membuat keputusan desain sadar dan mengandalkan risiko yang terkait menjadi rendah.

0
Cade Roux

SELECT *mungkin boleh saja jika Anda benar-benar membutuhkan semua kolom - tetapi Anda masih harus mencantumkan semuanya secara individual. Anda tentu tidak boleh memilih semua baris dari tabel - bahkan jika aplikasi & DB berada di server atau jaringan yang sama. Mentransfer semua baris akan memakan waktu, terutama ketika jumlah baris bertambah. Anda harus memiliki setidaknya di mana klausa memfilter hasil, dan/atau halaman hasil hanya memilih subset baris yang perlu ditampilkan. Beberapa alat ORM ada tergantung pada bahasa aplikasi yang Anda gunakan untuk membantu dalam pencarian dan paging subset data yang Anda butuhkan. Misalnya, dalam .NET Linq to SQL, Entity Framework, dan nHibernate semua akan membantu Anda dengan ini.

0
bkaid

Gunakan nama bidang tertentu, jadi jika seseorang mengubah tabel pada Anda, Anda tidak mendapatkan hasil yang tidak terduga. Pada subjek: SELALU menentukan nama bidang ketika melakukan penyisipan jadi jika Anda perlu menambahkan kolom nanti, Anda tidak harus kembali dan memperbaiki program Anda dan mengubah database pada saat yang sama dalam rilis produksi.

0
stu

Jika Anda khawatir dengan kecepatan, pastikan Anda menggunakan pernyataan yang sudah disiapkan. Kalau tidak, saya dengan ilitirit bahwa perubahan adalah apa yang Anda lindungi.

/ Allan

0
Allan Wind

Saya menemukan daftar nama kolom sangat penting jika pengembang lain cenderung bekerja dengan kode, atau database cenderung berubah, sehingga Anda selalu mendapatkan data yang konsisten.

0
Sam Cogan

Ini adalah pos lama, tetapi masih valid. Sebagai referensi, saya memiliki permintaan yang sangat rumit yang terdiri dari:

  • 12 tabel
  • 6 Kiri bergabung
  • 9 gabungan batin
  • 108 kolom total pada semua 12 tabel
  • Saya hanya perlu 54 kolom
  • A 4 kolom Pesan Dengan klausa

Ketika saya menjalankan kueri menggunakan Pilih *, dibutuhkan rata-rata 2869 ms. Ketika saya menjalankan kueri menggunakan Pilih, dibutuhkan rata-rata 1513 ms.

Total baris yang dikembalikan adalah 13.949.

Tidak ada keraguan memilih nama kolom berarti kinerja lebih cepat daripada Pilih *

Untuk menanyakan DB secara langsung (seperti pada sqlplus Prompt atau melalui alat administrasi db), pilih * umumnya baik-baik saja - ini menghemat masalah Anda menulis semua kolom.

Di sisi lain, dalam kode aplikasi yang terbaik adalah menghitung kolom. Ini memiliki beberapa manfaat:

  • Kode lebih jelas
  • Anda akan tahu urutan hasil yang akan datang (ini mungkin penting atau tidak penting bagi Anda)
0
Morikal

Ya, itu sangat tergantung pada metrik dan tujuan Anda:

  1. Jika Anda memiliki 250 kolom dan ingin (memang) memilih semuanya, gunakan pilih * jika Anda ingin pulang pada hari yang sama :)
  2. Jika pengkodean Anda membutuhkan fleksibilitas dan tabel yang dibutuhkan kecil, sekali lagi, pilih * membantu Anda membuat kode lebih cepat dan menjaganya lebih mudah.
  3. Jika Anda ingin rekayasa dan kinerja yang tangguh:
    • tulis nama kolom Anda jika hanya beberapa, atau
    • tulis alat yang memungkinkan Anda memilih/membuat nama kolom dengan mudah

Sebagai aturan praktis, ketika saya harus memilih semua kolom, saya akan menggunakan "select *" kecuali saya memiliki alasan yang sangat spesifik untuk melakukan sebaliknya (ditambah, saya pikir lebih cepat pada tabel dengan banyak, banyak kolom)

Dan yang terakhir, namun tidak kalah pentingnya, bagaimana Anda ingin menambahkan atau menghapus kolom pada tabel untuk memengaruhi kode Anda atau pemeliharaannya?

0
Notitze