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.
sql-server
sql-server-2005
marioosh
sumber
sumber
Jawaban:
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 .
sumber
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.
sumber