Penyimpanan Columnstore di Big Data
Kebanyakan dari database tradisional menyimpan data dalam bentuk record. Setiap record mencakup beberapa field yang mengandung value yang saling berelasi satu sama lain. Di dalam database relasional, record disebut dengan baris dan field disebut sebagai kolom. Berikut adalah table yang biasa ada di database pada umumnya:
Pendekatan ini berjalan dengan baik ketika kita sedang mencari beberapa atau banyak informasi di dalam sebuah record atau baris. Namun, table jenis ini menjadi tidak optimal ketika sebuah table memiliki banyak kolom, dan untuk mencari informasi yang diinginkan, hanya satu hingga tiga kolom dari data yang dibutuhkan. Di dalam kasus ini, Database Management System (DBMS) seperti MS SQL akan membaca setiap page dengan semua kolom yang ada dan akan mengembalikan data yang dibutuhkan saja. Hal ini dapat mengakibatkan pembacaan data yang berlebihan, dan mengakibatkan berkurangnya produktivitas. Masalah yang lain timbul ketika kita ingin menghitung rata-rata value dari sebuah kolom di dalam sebuah table karena DBMS tetap akan membaca semua data di dalam table dan melewatkan informasi lainnya untuk mendapatkan hanya satu kolom informasi yang dibutuhkan yang sebenarnya dapat disimpan dengan mudah untuk setiap baris.
Apa yang dilakukan columnstore adalah sesuai namanya. Dibandingkan dengan menyimpan data di dalam kumpulan record atau baris, data disimpan ke dalam kumpulan kolom. Dengan cara itu, ketika kita ingin menghitung rata-rata value dari sebuah kolom, kita hanya perlu untuk membaca data yang memiliki informasi kolom tersebut dan bukan membaca semua data di setiap baris. Berikut adalah contoh data yang disimpan ke dalam kolom:
Salah satu software database relasional dengan menggunakan column-based yang paling terkenal adalah Sybase IQ. Sybase IQ didirikan pada tahun 1990-an dan sekarang ini dimiliki oleh SAP. Seiring dengan berjalannya waktu, lebih banyak produk bermunculan yang kemudian mengubah dunia Business Intelligence (BI) dan Big Data. Diantaranya yang paling terkenal adalah Vertica, ParAccel, Kognito, Infobright, dan SAND.
Berikut ini adalah beberapa alasan kenapa columnstore index dapat meningkatkan performa dari query:
- Data yang dikompresi dengan baik. Dengan index columnstore, data dengan kolom yang sama disimpan secara berdekatan dan biasanya akan memiliki value yang mirip atau berulang, yang biasanya akan lebih mudah dan efektif untuk dikompresi dibandingkan dengan index rowstore. Kompresi columnstore tidak sama dengan kompresi rowstore yang ada di SQL Server 2008; data dikompresi menggunakan algoritma kompresi VertiPaq. Data yang dikompresi dengan baik akan meningkatkan performa karena membutuhkan operasi disk I/O yang lebih sedikit pula. Selain itu, kompresi columnstore juga menyebabkan lebih banyak data yang dapat masuk ke dalam memori.
- Operasi I/O yang berkurang. Di dalam rowstore, SQL Server akan selalu membaca seluruh kolom di setiap baris, termasuk kolom-kolom yang tidak dibutuhkan di dalam query. Karena query join biasanya hanya menggunakan 10% hingga 15% dari setiap kolom, menggunakan columnstore untuk membaca kolom-kolom tersebut dapat menghemat 85% hingga 90% operasi di dalam disk I/O.
- Batch processing. Mode eksekusi batch yang baru memproses data di dalam batch-batch yang mengakibatkan proses lebih efisien untuk jumlah data yang besar.
- Peningkatan penggunaan buffer pool. Memiliki data yang sangat terkompresi dan hanya membaca kolom yang diperlukan akan meningkatkan penggunaan kumpulan buffer, karena lebih banyak data dapat disimpan dalam memori.
- Pengeliminasian segmen. Seperti yang telah disebutkan sebelumnya, indeks columnstore dibagi menjadi beberapa segmen. SQL Server memelihara metadata yang berisi nilai minimum dan maksimum kolom di setiap segmen. Nilai-nilai ini diperiksa oleh mesin penyimpanan dan dibandingkan dengan kondisi filter query untuk menghindari segmen yang tidak diperlukan.
Manfaat lain adalah bahwa indeks columnstore juga lebih fleksibel daripada agregat. Jika sebuah query berubah, indeks columnstore masih akan berfungsi, sedangkan agregat prebuilt mungkin tidak mendukungnya lagi.
Adapun keterbatasan dari columnstore index yang terlihat nyata adalah pada SQL Server 2012 di mana datanya tidak dapat di perbarui. Dengan kata lain, tidak ada INSERT, DELETE, UPDATE, MERGE atau operasi pembaruan lainnya diizinkan. Tidak dapat memperbarui data mungkin terlihat seperti kerugian besar, tetapi hal tersebut bukan masalah besar, karena target untuk teknologi ini adalah data warehouse yang biasanya read-only dan mungkin hanya memerlukan pembaruan sehari sekali. Beberapa solusi untuk memperbarui data menggunakan columnstore index dijelaskan di bagian selanjutnya. Menurut Microsoft, columnstore index yang dapat diperbarui telah direncanakan untuk SQL Server di masa yang akan datang.
Keterbatasan yang lain adalah bahwa columnstore index merupakan indeks yang tidak ter-cluster, yang artinya masih membutuhkan table utama yang dapat berupa clustered index atau sebuah heap. Hal tersebut dapat menyebabkan adanya data yang duplikat. Microsoft mengatakan jika keterbatasan ini akan hilang dalam rilis SQL Server di masa yang akan datang, yang akan memiliki columnstore index sebagai table utama.
Selain itu, beberapa tipe data juga tidak di perbolehkan. Menurut SQL Server 2012 RCO Books Online (BOL), tipe data yang tidak dapat digunakan pada columnstore index sebagai berikut:
- binary dan varbinary
- ntext, text, dan image
- varchar (max) dan nvarchar (max)
- uniqueidentifier
- rowversion (and timestamp)
- sql_variant
- decimal (and numeric) dengan presisi lebih besar dari 18 digit
- datetimeoffset dengan skala lebih besar dari 2
- CRL types (hierarchyid dan spatial types)
- xml
Kesimpulannya, baik rowstore dan columnstrore index memiliki keuntungan dan keterbatasan masing-masing. Sebuah table column-oriented sangat bagus untuk analitik tetapi sangat buruk untuk beban kerja transaksional yang tradisional, yang akan berkerja dengan baik dengan rowstore index. (Christina, Tiffany)
Referensi
https://www.infoq.com/articles/SQL-Server-ColumnStore/
https://blog.pythian.com/why-column-stores/
https://www.itprotoday.com/sql-server/improve-performance-data-warehouse-queries-columnstore-indexes