Saya memiliki tabel IMO yang sangat besar (~ 137 juta baris) dengan banyak data berulang, banyak NULL
kolom, dan semacamnya.
Saya sedang mempertimbangkan menjelajahi ini menggunakan tabel dengan a COLUMNSTORE INDEX
dan saya memiliki IDENTITY
kolom di tabel asli, yang merupakan satu-satunya kolom saya di mana setiap baris unik.
Haruskah saya mengabaikan kolom ini atau memasukkannya? Saya telah membaca bahwa Anda ingin memasukkan semua baris tabel Anda ke dalam, COLUMNSTORE INDEX
tetapi saya juga membaca bahwa kandidat terbaik adalah kolom dengan banyak baris yang tidak unik.
Apakah ini hanya kandidat yang buruk untuk COLUMNSTORE INDEX
?
Saya menggunakan SQL Server 2012, jadi itu adalah toko kolom nonclustered. Saya hanya mengeksplorasi kemungkinan cara yang lebih baik untuk menyimpan data ini. Pembaruan tidak ada, meskipun baris baru akan ditambahkan secara berkala melalui proses ELT jadi saya mengasumsikan beberapa pekerjaan akan dilakukan di sana. Beberapa orang menambang data ini dan menghasilkan laporan besar, banyak pemindaian baris, membawa server ke perayapan pada waktu yang memaksa kami untuk memuat salinan setiap hari ke server sekunder.
sumber
137 million rows
besar tapi bisa diatur. Sudahkah Anda melihat ke partisi tabel dan meletakkannya di filegroup yang berbeda? Indeks Columnsstore di sql 2012 tidak dapat ditulisi, sehingga Anda akan mengalami masalah - Anda harus membuang dan membuatnya kembali. Saya tidak mengatakan kehendak kolomstore itu buruk, tetapi lebih baik untuk menjelajahi opsi lain juga.Jawaban:
Kolom identitas tidak benar-benar dikompresi dalam Indeks Kolom di SQL Server 2012 atau di SQL Server 2014. Itu semua akan benar-benar tergantung pada beban kerja yang Anda alami. Jika beban kerja Anda akan mencakup kolom identitas, maka Anda dapat memanfaatkan dengan sangat baik penghapusan Segmen.
Dari sudut pandang kompresi - Columnstore akan memberi Anda kompresi yang lebih baik daripada biasanya. Khas. Silakan mengujinya sebelum melanjutkan ke produksi.
Masalah terbesar Anda di SQL Server 2012 akan menjadi implementasi yang sangat lemah dari Mode Batch, dan tidak ada yang dapat Anda lakukan untuk itu.
sumber
Saya tidak tahan untuk tidak bergabung dengan Niko dengan jawaban lain (selamat datang, Niko!). Secara umum, saya setuju dengan Niko bahwa keterbatasan mode batch dalam SQL 2012 (jika Niko tidak akan terhubung ke blognya sendiri, saya akan :)) mungkin menjadi perhatian utama. Tetapi jika Anda bisa hidup dengan itu dan memiliki kontrol penuh atas setiap permintaan yang Anda tulis di meja untuk memeriksanya dengan cermat, kolom toko dapat bekerja untuk Anda di SQL 2012.
Sejauh pertanyaan spesifik Anda tentang kolom identitas, saya menemukan bahwa kolom identitas dikompresi dengan sangat baik dan akan sangat menyarankan untuk memasukkannya ke dalam indeks toko kolom Anda dalam setiap pengujian awal Anda. (Perhatikan bahwa jika kolom identitas juga merupakan indeks berkerumun dari b-tree Anda, itu akan secara otomatis dimasukkan ke dalam indeks penyimpanan kolom non-berkerumun Anda .)
Untuk referensi, berikut adalah ukuran yang saya amati untuk ~ 10MM baris data kolom identitas. The columnstore dimuat untuk kompres eliminasi segmen optimal hingga 26MB (vs 113MB untuk
PAGE
kompresi tabel rowstore), dan bahkan kolomstore dibangun pada b-tree yang dipesan secara acak hanya 40MB. Jadi ini menunjukkan manfaat kompresi yang sangat besar, bahkan melebihi kompresi b-tree terbaik yang ditawarkan SQL dan bahkan jika Anda tidak repot-repot menyelaraskan data Anda untuk penghapusan segmen optimal (yang akan Anda lakukan dengan terlebih dahulu membuat b-tree dan kemudian membangun kolomstore Anda denganMAXDOP
1).Berikut ini skrip lengkap yang saya gunakan jika Anda ingin bermain-main:
sumber