Apakah menambahkan indeks pada kolom bit secara signifikan memperlambat sisipan?

11

Saya punya meja dengan sekitar 1 juta hingga 5 juta catatan. Sebagian kecil dari catatan itu memiliki satu kolom bit yang disetel ke 'BENAR'. Perlu cepat menemukan catatan itu. Saya pikir indeks itu dapat mempercepat pencarian di kolom ini, tetapi saya takut tentang INSERT. Karena itu pertanyaanku.

Database berfungsi seperti semacam gudang data, jadi ada banyak SELECT dan kecil (hingga 10-20 per hari) tetapi INSERT yang cukup besar (hingga 200 ribu catatan sekaligus). Saya takut waktu yang lebih lama dari impor ke database.

marioosh
sumber
5
Apa versi SQL Server? Jika 2008+ kedengarannya seperti indeks yang difilter, maka itu yang Anda butuhkan.
Martin Smith
SQL Server 2005
marioosh
1
Anda dapat membagi tabel (tambahkan tabel baru dengan hanya satu kolom, PK dari tabel, yang akan diisi hanya dengan baris-baris yang kolom bitnya benar - pada akhirnya Anda bahkan dapat menghapus kolom bit.) Diindeks lihat akan bekerja, juga pada tahun 2005, dengan kurangnya indeks parsial.
ypercubeᵀᴹ
hati-hati penuh dengan Indexed View, seperti yang Anda sebutkan Anda memiliki 10-20 insert besar per hari, pemeliharaan tampilan Indexed mungkin melampaui manfaat dari peningkatan kinerja. Saya tidak berpikir ada "fitur di luar kotak" dari SQL 2005 yang dapat Anda manfaatkan untuk memperbaiki situasi Anda. tetapi jika Anda mencantumkan struktur tabel saat ini dan indeks yang ada, kami mungkin menemukan beberapa desain alternatif.
Anup Shah

Jawaban:

8

Indeks pada bit untuk 1 juta rekaman tidak berguna. Pengoptimal tidak akan pernah menggunakannya, Anda hanya akan membayar untuk mempertahankannya. Alternatif yang jauh lebih baik adalah menambahkan bit ini sebagai kunci paling kiri pada indeks berkerumun.

Tetapi saya akan membuat blind shot dalam gelap dan menebak bahwa apa yang Anda miliki adalah pola antrian: catatan dijatuhkan di tabel dengan bit diatur ke 'BENAR' (mis. 'Needsprocessing = true') dan kemudian proses latar belakang terlihat untuk catatan ini, lakukan pemrosesan, dan perbarui bit ke FALSE. Ini adalah pola yang ada di mana-mana, juga dikenal sebagai 'pola resep bencana kinerja'. Saya akan merekomendasikan menjatuhkan catatan ke tabel dan menjatuhkan pemberitahuan (bisa sesederhana ID catatan yang baru dimasukkan), pada saat yang sama, ke dalam antrian . Lihat Menggunakan Tabel sebagai Antrian .

Remus Rusanu
sumber
1
Saya tidak melihat ada gunanya meletakkan kolom bit di sisi paling kiri karena kita tidak tahu kolom filter lain dengan kardinalitas tinggi yang mungkin dimiliki pengguna. sejauh ini saya telah melihat kolom BIT adalah pilihan terakhir dalam indeks berkerumun. tapi ya, +1 untuk referensi yang bagus dari "Menggunakan Tabel sebagai Antrian".
Anup Shah
2
Sebenarnya saya menjalankan tes dan ya itu akan menggunakan indeks. Buat tabel (Identitas id, bit myBit) tambahkan 100 baris di mana bit adalah 0 dan 2000000 di mana bit adalah 1. Pastikan statistik diperbarui (jika perlu) dan jalankan kueri di myBit = 0 dan indeks akan digunakan.
Kenneth Fisher
@KennethFisher kecuali bahwa dalam pola kecepatan tinggi tipuan memasukkan TRUE / perbarui ke FALSE segera statistik akan selalu usang. Jika Anda lebih suka bermain roulette Rusia dengan pengoptimal daripada melakukan desain yang jelas, Anda akan mendapatkan apa yang pantas Anda dapatkan ...
Remus Rusanu
"tidak akan pernah menggunakannya" pernyataan itu berlaku untuk 99% kasus, tetapi kita tidak tahu kasus OP mana yang masuk. Saya telah berhasil mengindeks sedikit. Ada kasus penggunaan.
usr
pertanyaan - apakah jawabannya di sini salah, khususnya> "Saat Anda mengindeks bidang bit (atau rentang sempit), Anda hanya mengurangi set kerja dengan jumlah baris yang cocok dengan nilai itu. Jika Anda memiliki sejumlah kecil baris yang cocok dengan itu akan mengurangi set kerja Anda banyak . Untuk sejumlah besar baris dengan distribusi 50/50, itu mungkin memberi Anda sedikit keuntungan kinerja vs menjaga indeks tetap up to date. " Dalam hal ini, indeks pada bit yang cocok dengan 1% dari catatan akan meniadakan kebutuhan untuk memindai 99% dari 1 juta untuk peningkatan yang signifikan?
drzaus
2

Seperti @MartinSmith katakan jika Anda pernah meng-upgrade ke SQL 2008 maka indeks yang disaring akan menjadi solusi yang sempurna. Namun dalam waktu yang berarti sebagai kasus umum, indeks APAPUN yang ditambahkan akan menambah waktu muat Anda. Indeks kecil kurang dari yang besar.

Satu hal yang akan saya lihat adalah jika Anda memiliki indeks yang sudah ada yang dapat dimodifikasi. Mengasumsikan kueri yang ada menggunakan indeks yang diberikan kemudian menambahkan kolom bit pada akhir indeks itu harus memiliki efek minimal pada sisipan dan efek positif yang Anda lihat pada kueri Anda.

Hal berikutnya yang harus dilihat adalah "Apakah saya sudah memiliki banyak indeks?" Tidak ada aturan yang keras dan cepat untuk apa "banyak" tapi saya biasanya pergi dengan aturan 10 indeks adalah batas kecuali saya BENAR-BENAR membutuhkan yang baru.

Pikiran terakhir, uji itu pada contoh uji. Siapkan tabel dengan beberapa juta baris, jalankan beban Anda di atasnya, tambahkan indeks Anda lalu jalankan lagi beban Anda dan lihat apakah Anda melihat peningkatan yang signifikan dalam waktu buka.

Hanya Anda yang benar-benar dapat memutuskan apa yang "signifikan". Saya memiliki mesin di mana menambahkan 5 menit ke waktu buka adalah "signifikan" dan yang lain di mana saya dapat dengan aman melihat peningkatan beberapa jam.

EDIT:

Pilihan lain adalah mempartisi meja Anda. Anda mungkin harus menggunakan tampilan yang dipartisi jika Anda tidak menggunakan edisi Perusahaan tetapi meskipun demikian itu akan membantu. Anda menempatkan bit 0 Anda di satu partisi dan bit 1 Anda di partisi lain. Dengan asumsi Anda hanya memasukkan satu versi atau yang lain maka Anda bahkan dapat mempercepat sisipan Anda.

Kenneth Fisher
sumber