Saya bekerja pada sistem pelaporan yang akan membutuhkan kueri pemilihan besar, tetapi didasarkan pada database yang hanya diisi sekali. Sistem manajemen basis data adalah Microsoft SQL Server 2017. Mungkin ada cara yang lebih baik untuk merancang sistem seperti ini, tetapi mari kita pendekatan ini secara teoritis.
Secara teoritis:
- Jika kita memiliki database yang sangat besar (150M + baris pada beberapa tabel)
- Dan kita dapat mengasumsikan bahwa basis data hanya akan diisi satu kali.
Bisakah pengindeksan setiap kombinasi kolom yang mungkin memiliki dampak kinerja negatif pada kueri pemilihan?
Jawaban:
Ya, itu akan memengaruhi waktu kompilasi rencana awal karena pengoptimal akan memiliki banyak jalur akses tambahan untuk dipertimbangkan.
Karena Anda menggunakan SQL Server 2017, memuat sekali, dan menjalankan laporan, mengapa tidak menggunakan indeks toko kolom berkerumun saja?
Itu tampaknya menjadi solusi ideal untuk kebutuhan Anda untuk mengindeks setiap kombinasi kolom yang mungkin.
Indeks Columnstore - Ikhtisar
sumber
Jika Anda memiliki N kolom dalam sebuah tabel, setiap kombinasi kolom yang memungkinkan adalah 2 ^ N-1 (menghapus set kosong). Untuk 10 kolom yang berarti 1023 indeks, untuk 20 kolom kita berakhir dengan indeks 1048575 kekalahan. Sebagian besar indeks tidak akan pernah digunakan tetapi harus dipertimbangkan oleh pengoptimal. Mungkin saja pengoptimal akan memilih indeks sub-optimal daripada yang lebih baik. Saya tidak akan mengambil jalan untuk menghasilkan semua jenis indeks, alih-alih mencoba mencari tahu indeks apa yang benar-benar bermanfaat.
EDIT mengoreksi jumlah indeks yang mungkin
Seperti yang ditunjukkan Jeff , ini bahkan lebih buruk daripada 2 ^ N (power-set) karena (3,2,1) jelas berbeda dari (1,2,3). Untuk kolom N kita dapat memilih posisi pertama dalam indeks yang berisi semua kolom dengan cara N. Untuk posisi kedua dengan cara N-1, dll. Karena itu, kita berakhir dengan N! indeks berbeda ukuran penuh. Tak satu pun dari indeks ini dimasukkan oleh indeks lain di set ini. Selain itu, kami tidak dapat menambahkan indeks lain yang lebih pendek sehingga tidak tercakup oleh indeks lengkap apa pun. Oleh karena itu, jumlah indeks adalah N !. Contoh untuk 10 kolom, menjadi 10! = 3628800 indeks dan untuk 20 (drumroll) 2432902008176640000 indeks. Ini adalah angka yang sangat besar, jika kita meletakkan sebuah titik untuk setiap indeks satu mm bagian, itu akan membutuhkan cahaya 94 hari untuk melewati semua titik. Semua dan semua, jangan ;-)
sumber
Tidak.
Tidak praktis untuk mengindeks "segalanya", tetapi Anda dapat mengindeks "sebagian besar" darinya.
Ini masalahnya. Jika tabel memiliki
N
kolom, maka jumlah indeks yang mungkin adalahN!
. Katakanlah sebuah tabel memiliki 10 kolom, maka Anda tidak hanya memiliki10
kemungkinan indeks, tetapi10!
. Itu adalah ... 3.628.800 ... di satu meja. Itu banyak ruang disk, I / O disk, cache, dan mencari waktu.Mengapa? Beberapa alasan:
Indeks Lightwwight biasanya di-cache, sesuatu yang membuat mereka cepat menyala. Jika Anda memiliki 3 juta dari mereka, mereka TIDAK akan di-cache.
Pengoptimal SQL mungkin membutuhkan banyak waktu untuk memutuskan mana yang lebih baik untuk digunakan, khususnya saat menggunakan gabungan.
Pengoptimal SQL dapat menyerah menggunakan algoritma yang komprehensif, dan mencoba algoritma heuristik sebagai gantinya. Ini mungkin "kurang optimal". PostgreSQL, misalnya, memiliki opsi berbeda untuk "kueri tabel kurang dari 8", dan "kueri tabel lebih dari 8".
Indeks seharusnya lebih ringan dari heap. Jika Anda mengindeks semuanya, maka indeks menjadi seberat tumpukan ... sesuatu yang mengalahkan tujuan indeks.
sumber
Tidak, itu mungkin tidak akan berdampak negatif pada
SELECT
kueri, tetapiINSERT
biaya.WHERE
ekspresi kondisi masih tidak akan menggunakan indeks, terutama yang lebih kompleks.sumber