Saya hanya penasaran.
Katakanlah Anda memiliki tabel 1 juta catatan / baris.
select order_value from store.orders
Apakah itu membuat perbedaan apakah tabel itu memiliki 1 bidang, 2 bidang, atau 100 bidang, dalam waktu permintaan aktual? Maksud saya semua bidang selain "order_value."
Saat ini saya sedang mendorong data ke gudang data. Kadang-kadang saya membuang bidang ke tabel yang "dapat digunakan di masa depan, suatu hari nanti" - tetapi mereka tidak ditanyai saat ini, oleh apa pun. Apakah bidang 'asing' ini memengaruhi pernyataan pilih yang tidak menyertakannya, secara langsung atau tidak langsung (tidak * maksud saya)?
sql-server
query-performance
select
pengguna45867
sumber
sumber
Jawaban:
Ini sangat tergantung pada indeks dan tipe data.
Menggunakan database Stack Overflow sebagai contoh, seperti inilah tabel Users:
Ini memiliki PK / CX pada kolom Id. Jadi keseluruhan data tabel diurutkan berdasarkan Id.
Dengan itu sebagai satu-satunya indeks, SQL harus membaca semuanya (tanpa kolom LOB) ke dalam memori jika belum ada di sana.
Waktu statistik dan profil io terlihat seperti ini:
Jika saya menambahkan indeks nonclustered tambahan pada Id saja
Saya sekarang memiliki indeks yang jauh lebih kecil yang memenuhi permintaan saya.
Profil di sini:
Kami dapat melakukan lebih sedikit pembacaan dan menghemat sedikit waktu CPU.
Tanpa informasi lebih lanjut tentang definisi tabel Anda, saya tidak bisa benar-benar mencoba mereproduksi apa yang Anda coba ukur lebih baik.
Ya, ini khusus untuk tabel rowstore. Data disimpan oleh baris pada halaman data. Bahkan jika data lain pada halaman tersebut tidak relevan dengan permintaan Anda, seluruh baris> halaman> indeks tersebut harus dibaca ke dalam memori. Saya tidak akan mengatakan bahwa kolom lainnya "dipindai" sebanyak halaman yang ada di dalamnya dipindai untuk mengambil nilai tunggal yang relevan dengan kueri.
Menggunakan contoh buku telepon ol: bahkan jika Anda hanya membaca nomor telepon, ketika Anda membalik halaman, Anda mengubah nama belakang, nama depan, alamat, dll bersama dengan nomor telepon.
sumber
Itu tergantung, pada struktur tabel dan indeks yang tersedia.
Kasus A: Tabel umum (baris toko), tidak ada indeks aktif
(order_value)
.Satu-satunya rencana pelaksanaan yang mungkin adalah membaca seluruh tabel (yang tentu saja jauh berbeda ketika itu 2 vs 200 kolom, jadi beberapa vs beberapa ribu byte lebar).
Kasus B: Tabel umum, ada indeks pada
(order_value)
atau beberapa indeks lain yang menyertakan kolom itu.Ada rencana yang lebih baik sekarang, pindai seluruh indeks (salah satunya) - yang tentu saja jauh lebih sempit daripada seluruh tabel, hanya beberapa byte. Yang membuat tidak relevan jika tabel memiliki 2 atau 200 kolom. Hanya indeks yang dipindai.
Kasus C: Ini adalah tabel kolom toko.
Seperti namanya, struktur tabel ini berorientasi pada kolom, bukan pada baris. Tidak perlu indeks apa pun, desain tabel itu sendiri cocok untuk membaca seluruh kolom.
sumber