Selama pemilihan SQL, DB akan selalu merujuk ke metadata untuk tabel, terlepas dari apakah itu SELECT * untuk SELECT a, b, c ... Why? Karena disitulah informasi tentang struktur dan tata letak tabel pada sistem berada.
Itu harus membaca informasi ini karena dua alasan. Satu, untuk sekadar menyusun pernyataan. Ini perlu memastikan bahwa Anda menentukan tabel yang ada setidaknya. Selain itu, struktur database mungkin telah berubah sejak terakhir kali sebuah pernyataan dieksekusi.
Sekarang, jelas, metadata DB di-cache di sistem, tetapi masih pemrosesan yang perlu dilakukan.
Selanjutnya, metadata digunakan untuk menghasilkan rencana kueri. Ini terjadi setiap kali pernyataan dikompilasi juga. Sekali lagi, ini berjalan terhadap metadata yang di-cache, tetapi itu selalu dilakukan.
Satu-satunya saat pemrosesan ini tidak selesai adalah ketika DB menggunakan kueri yang telah dikompilasi sebelumnya, atau telah menyimpan kueri sebelumnya ke cache. Ini adalah argumen untuk menggunakan parameter binding daripada SQL literal. "SELECT * FROM TABLE WHERE key = 1" adalah kueri yang berbeda dari "SELECT * FROM TABLE WHERE key =?" dan "1" terikat saat menelepon.
DB sangat bergantung pada cache halaman untuk pekerjaan di sana. Banyak DB modern cukup kecil untuk muat sepenuhnya dalam memori (atau, mungkin harus saya katakan, memori modern cukup besar untuk memuat banyak DB). Maka biaya I / O utama Anda di bagian belakang adalah logging dan flushes halaman.
Namun, jika Anda masih menggunakan disk untuk DB Anda, pengoptimalan utama yang dilakukan oleh banyak sistem adalah dengan mengandalkan data dalam indeks, bukan tabel itu sendiri.
Jika Anda memiliki:
CREATE TABLE customer (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(150) NOT NULL,
city VARCHAR(30),
state VARCHAR(30),
zip VARCHAR(10));
CREATE INDEX k1_customer ON customer(id, name);
Kemudian jika Anda melakukan "SELECT id, name FROM customer WHERE id = 1", kemungkinan besar DB Anda akan menarik data ini dari indeks, bukan dari tabel.
Mengapa? Kemungkinan akan tetap menggunakan indeks untuk memenuhi kueri (vs pemindaian tabel), dan meskipun 'nama' tidak digunakan di klausa where, indeks tersebut akan tetap menjadi opsi terbaik untuk kueri.
Sekarang database memiliki semua data yang dibutuhkan untuk memenuhi kueri, jadi tidak ada alasan untuk membuka halaman tabel itu sendiri. Menggunakan hasil indeks dalam lalu lintas disk yang lebih sedikit karena Anda memiliki kepadatan baris yang lebih tinggi dalam indeks vs tabel pada umumnya.
Ini adalah penjelasan bergelombang tentang teknik optimasi spesifik yang digunakan oleh beberapa database. Banyak yang memiliki beberapa teknik optimasi dan tuning.
Pada akhirnya, SELECT * berguna untuk kueri dinamis yang harus Anda ketik secara manual, saya tidak akan pernah menggunakannya untuk "kode sebenarnya". Identifikasi kolom individual memberi DB lebih banyak informasi yang dapat digunakan untuk mengoptimalkan kueri, dan memberi Anda kontrol yang lebih baik dalam kode Anda terhadap perubahan skema, dll.
SELECTkueri dijalankan / diproses berbeda dari database ke database.