Apa anatomi indeks kolomstore?

20

Salah satu fitur baru dalam SQL Server 2012 dengan nama kode Denaliadalah indeks Columnstore.

Saya tahu sedikit tentang indeks toko baris lama biasa, seperti struktur b-tree, perbedaan penyimpanan antara level daun dan halaman b-tree, memengaruhi bidang yang disertakan, mengoptimalkan penggunaannya, urutan kunci, dll.

Saya mengalami kesulitan mendapatkan info bagus tentang internal indeks kolomstore.

  • Bagaimana strukturnya?
  • Apakah ada b-tree? Ada struktur lain di tempat?
  • Bagaimana cara mengatur data?
  • Apa jenis operator spesifik yang paling cocok untuk menggunakannya?
  • Adakah anti-pola lain yang harus dihindari saat menggunakannya?

Banyak hal yang dapat saya ketahui tentang mereka pada dasarnya adalah kebalikan dari indeks "normal", yaitu tidak ada pemesanan kunci, tidak ada bidang yang disertakan, HANYA yang tidak tercakup.

Setiap wawasan dihargai.

JNK
sumber
Ada cukup banyak fanout tentang implementasi teknis dari database toko kolom di halaman wikipedia. Saya membayangkan indeks hanya menyimpan struktur data kolom untuk satu kolom bersama dengan kuncinya. Mungkin menggunakan indeks bitmap, mungkin BTree.
ConcernedOfTunbridgeWells
Ini sebenarnya untuk beberapa kolom. Juga saya berasumsi seperti dengan implementasi SS lainnya itu akan sedikit berbeda dari produk lain
JNK
Untuk MySQL tetapi hal yang sama berlaku: developer.bazaarvoice.com/why-columns-are-cool Juga Sybase IQ adalah grand daddy
gbn
3
@ConcernedOfTunbridgeWells - Apakah indeks columnstore menggunakan indeks bitmap? Tidak. Indeks Columnstore menggunakan representasi data eksklusif berdasarkan Vertipaq. Ini tidak sama dengan indeks bitmap dan tidak menggunakannya. Tetapi memiliki beberapa manfaat yang serupa dengan indeks bitmap, seperti mengurangi waktu yang dibutuhkan untuk memfilter pada kolom dengan sejumlah kecil nilai yang berbeda.
Martin Smith
1
Remus Rusanu, anggota tim di Microsoft yang mengembangkan fitur ini, baru saja memposting sebuah artikel tentang ini: Di dalam SQL Server 2012 COLUMNSTORE Indeks
Nick Chammas

Jawaban:

22

Struktur Toko Kolom

Data Columnstore disimpan secara fisik dalam satu segmen atau lebih (unit alokasi LOB reguler) per kolom, dan juga dapat dipartisi dengan cara yang biasa. Setiap segmen berisi sekitar satu juta baris nilai yang sangat dikompresi atau referensi nilai (beberapa teknik kompresi tersedia). Referensi nilai menghubungkan ke entri dalam satu hingga dua kamus hash .

Kamus disematkan dalam memori selama eksekusi kueri, dengan ID nilai data dari segmen yang dilihat dalam kamus setiap kali eksekusi membutuhkan nilai data aktual (pencarian ini ditangguhkan selama mungkin karena alasan kinerja).

Segmen juga memiliki catatan tajuk yang berisi metadata seperti nilai minimum dan maksimum yang disimpan di dalam segmen. Informasi dari header sering dapat digunakan untuk menghilangkan partisi lengkap dari pemrosesan pada waktu eksekusi. Informasi catatan tajuk disimpan dalam struktur akar data LOB yang biasa, sehingga menghilangkan segmen berarti Mesin Penyimpanan dapat melewatkan membaca halaman data LOB dari penyimpanan fisik sepenuhnya. Memaksimalkan potensi untuk eliminasi dapat memerlukan desain yang cermat , termasuk ketergantungan pada urutan indeks berkerumun pada saat indeks Columnstore dibangun.

Operator Paket Tertentu

SQL Server 2012 memperkenalkan mode eksekusi baru yang disebut Batch Mode. Dalam mode ini, paket sekitar 1000 baris dilewatkan di antara operator, secara signifikan meningkatkan efisiensi penggunaan prosesor. Dalam setiap paket, data berbentuk kolom direpresentasikan sebagai vektor. Tidak semua operator paket mendukung operasi mode batch, tetapi contoh dari mereka yang melakukan termasuk Pemindaian Indeks Columnstore, Hash Inner Join, Batch Hash Table Build, Filter Bitmap, Hash Aggregate (bukan skalar agregat), Filter, dan Compute Skalar (untuk proyeksi dan ekspresi evaluasi). Rencana pelaksanaan kueri telah ditingkatkan untuk menunjukkan mode eksekusi yang diperkirakan dan aktual.

Anti-Pola

Ada sejumlah besar pembatasan dalam rilis pertama, termasuk kendala pada tipe data yang diijinkan . Jenis yang paling umum didukung; tipe data yang tidak didukung termasuk DECIMALdengan lebih presisi dari 18 digit, (N)VARCHAR(MAX), UNIQUEIDENTIFIER, jenis CLR, dan (VAR)BINARY.

Penggunaan tipe string , OUTER JOIN, IN,EXISTS , NOT IN, OR, UNION ALLdapat mengakibatkan berkurang secara signifikan kinerja (Row eksekusi Mode), kecuali workarounds bekerja yang biasanya melibatkan penulisan ulang sintaks yang tidak biasa seperti yang ditunjukkan dalam artikel terkait di bagian ini.

Informasi Lebih Lanjut

Remus Rusanu telah membuat blog ikhtisar yang luar biasa di sini .

Paul White
sumber