Indeks toko kolom berkerumun dan kunci asing

18

Saya kinerja menyetel gudang data menggunakan indeks. Saya cukup baru untuk SQL Server 2014.Microsoft menjelaskan hal berikut:

"Kami melihat indeks columnstore berkerumun sebagai standar untuk menyimpan tabel fakta pergudangan data besar, dan berharap itu akan digunakan dalam sebagian besar skenario penyimpanan data. Karena indeks columnstore berkerumun dapat diperbarui, beban kerja Anda dapat melakukan sejumlah besar penyisipan, memperbarui, dan hapus operasi. " http://msdn.microsoft.com/en-us/library/gg492088.aspx

Namun jika Anda membaca lebih lanjut dalam dokumentasi Anda akan menemukan di bawah batasan dan batasan:

"Tidak dapat memiliki batasan unik, batasan kunci primer, atau batasan kunci asing."

Ini banyak membingungkan saya! Ini adalah praktik yang baik (tidak wajib) untuk memiliki kunci asing di gudang data karena berbagai alasan (integritas data, hubungan yang terlihat untuk lapisan semantik ...)

Jadi Microsoft menganjurkan indeks kolomstore berkerumun untuk skenario gudang data; Namun, tidak dapat menangani hubungan kunci asing ?!

Apakah saya benar dalam hal ini? Pendekatan lain mana yang akan Anda sarankan? Di masa lalu, saya telah menggunakan indeks columnstore nonclustered dalam skenario data warehouse, dengan drop dan membangun kembali untuk memuat data. Namun SQL Server 2014 lalu menambahkan tidak ada nilai baru nyata untuk gudang data ??

OverflowStack
sumber
Ketika fitur ini matang, Anda akan melihat semakin banyak fitur ini menjadi didukung (heck, pada tahun 2012, indeks kolom toko hanya dibaca!). Sementara itu, Anda ditawari trade-off - performa hebat dengan keterbatasan, atau sama tua yang sama. Saya juga tidak percaya mereka bermaksud bahwa itu berarti bahwa setiap tabel di DW Anda harus berkerumun indeks kolom toko dan bahwa tidak ada tabel harus memiliki kendala - mungkin ada sejumlah tabel di DW yang akan memberi Anda pukulan besar untuk uang
Aaron Bertrand
3
Waspadalah - ini bisa menangani gabungan. Hubungan FK sama sekali tidak diperlukan untuk bergabung. Itu ada untuk menangani integritas referensial - yang bagus untuk dimiliki tetapi dalam data warehouse BISA dihilangkan. Beresiko, ya, tetapi juga dengan kenaikan kinerja.
TomTom
8
Juga - "tidak ada nilai baru nyata"? Maksud Anda bisa ditulis dan dikelompokkan tidak terdengar seperti peningkatan bagi Anda? Memiliki pengguna dapat meminta data secara real time alih-alih menunggu setetes dan membangun kembali untuk mendapatkan lebih banyak data saat ini sepertinya bukan hal yang baik untuk pengguna Anda dan lebih sedikit perawatan untuk Anda? mengangkat bahu
Aaron Bertrand
Anda dapat memiliki indeks (unik) dengan membuat tampilan yang diindeks. Sepertinya infrastruktur untuk pemeliharaan indeks sudah ada. Hanya saja indeks normal belum (belum) diterapkan.
usr
@ AaronBertrand Dalam skenario DWH dengan tabel fakta dengan kunci asing, indeks Clumned Columnstore tidak berfungsi. Ini sangat berbeda dengan Microsoft yang mengharapkan ini sebagai standar untuk menyimpan tabel fakta besar. Saya harap Anda bisa membuktikan saya salah ...? Karena saya suka SQL Server.
OverflowStack

Jawaban:

13

Anda punya banyak pertanyaan di sini:

T: (Kekurangan kunci asing) banyak membingungkan saya! Ini adalah praktik yang baik (tidak wajib) untuk memiliki Fk di DWH karena berbagai alasan (integritas data, hubungan terlihat untuk lapisan semantik, ....)

A: Benar, biasanya merupakan praktik yang baik untuk memiliki kunci asing di gudang data. Namun, indeks kolomstore berkerumun belum mendukung itu.

T: Jadi MS mengadvokasi indeks toko Clustered Column untuk skenario DWH, Namun tidak dapat menangani hubungan FK ?!

A: Microsoft memberi Anda alat. Terserah Anda bagaimana Anda menggunakan alat-alat itu.

Jika tantangan terbesar Anda adalah kurangnya integritas data di gudang data Anda, maka alat yang Anda inginkan adalah tabel konvensional dengan kunci asing.

Jika tantangan terbesar Anda adalah kinerja kueri, dan Anda bersedia untuk memeriksa integritas data Anda sendiri sebagai bagian dari proses pemuatan, maka alat yang Anda inginkan dikelompokkan indeks toko kolom.

T: Namun SQL 2014 daripada menambahkan tidak ada nilai baru nyata untuk DWH ??

A: Untungnya, clustered columnstore bukan satu-satunya fitur baru di SQL Server 2014. Sebagai contoh, periksa penduga kardinalitas baru.

T: Mengapa saya begitu marah dan pahit tentang cara fitur favorit saya diimplementasikan?

A: Anda menangkap saya - Anda tidak benar-benar mengajukan pertanyaan itu - tetapi saya tetap akan menjawabnya. Selamat datang di dunia perangkat lunak pihak ketiga di mana tidak semua dibangun sesuai dengan spesifikasi persis Anda. Jika Anda merasa bersemangat tentang perubahan yang ingin Anda lihat dalam produk Microsoft, lihat Connect.Microsoft.com . Ini adalah proses umpan balik mereka di mana Anda dapat mengirimkan perubahan, orang lain dapat memilihnya, dan kemudian tim produk membacanya dan memberi tahu Anda mengapa mereka tidak akan menerapkannya. Terkadang. Sebagian besar waktu mereka hanya menandainya sebagai "tidak akan diperbaiki, bekerja pada mesin saya" tapi hei, kadang-kadang Anda mendapatkan jawaban.

Brent Ozar
sumber
"Benar, biasanya merupakan praktik yang baik untuk memiliki kunci asing di gudang data" -> SQLCAT - Top 10 Praktik Terbaik untuk Membangun Gudang Data Relasional Skala Besar ... "Buat indeks yang tidak dikelompokkan untuk setiap kunci asing." -> Tidak ada yang tentang menegakkan hubungan FK yang disebutkan dalam tautan, dan non-CI berlebihan karena kolom kolom, jadi akan menunjukkan tidak perlu untuk FK pada tabel fakta, apakah Anda setuju? Tertarik dengan pemikiran Anda tentang ini.
Adrian Torrie
1
... dan untuk dimensi: "Hindari memaksakan hubungan kunci asing antara fakta dan tabel dimensi, untuk memungkinkan pemuatan data yang lebih cepat. Anda dapat membuat batasan kunci asing dengan NOCHECK untuk mendokumentasikan hubungan; tetapi jangan memaksakannya. Pastikan integritas data melalui Transform Lookups, atau lakukan pemeriksaan integritas data pada sumber data "
Adrian Torrie
6

Saya bisa mengerti bahwa Anda merasakan beberapa bagian yang biasa Anda lewatkan. Tapi itu hanya karena mereka hilang.

Meskipun demikian, SQL Server berhasil digunakan ketika Foreign Keys hanya sebuah konsep (yang kami terapkan melalui pemicu pada masa itu), bukan implementasi fisik seperti kendala. Integritas Deklaratif Referensi ada setidaknya di SQL Server 7.0, tetapi jauh lebih lemah daripada implementasi saat ini.

Mengenai nilai Indeks ColumnStore Clustered itu memberikan indeks dan baris dapat diperbarui. Anda mungkin menemukan diskusi ini berharga: http://sqlwithmanoj.com/2014/07/24/maintaining-uniqueness-with-clustered-columnstore-index-sql-server-2014/

Manoj menunjukkan bahwa ada cara untuk membuat Tampilan Terindeks / Terwujud di atas tabel ini, dengan Clustering Key sebagai PK (kolom 1 dari tabel / tampilan). Apakah itu cocok untuk Anda, tentu saja, adalah keputusan yang harus Anda buat.

Tapi, seperti komentar Aaron Bertrand dan TomTom, ini semua tentang kinerja yang lebih baik. Jika Anda dapat mengelola masalah lain yang menjadi perhatian Anda (dan saya percaya bahwa mereka dapat dikelola) maka Anda mendapatkan beberapa manfaat. Jadi gunakan ColumnStore untuk apa yang dapat Anda lakukan dan kelola sendiri fitur yang hilang.

RLF
sumber
2

Pertanyaan ini berkaitan dengan SQL 2014, tetapi saya ingin memberikan informasi tambahan mengingat perubahan yang dibuat dalam SQL 2016 ke kolom indeks, karena mungkin sulit untuk memilah keterbatasan dalam versi yang berbeda dan pertanyaan ini masih muncul cukup tinggi di Google:

Untuk SQL 2016, Microsoft menjelaskan metode untuk menggunakan indeks btree nonclustered (yang sekarang dapat ditambahkan sebagai indeks sekunder pada tabelstore berkerumun kolom) untuk menegakkan batasan kunci asing, asalkan kendala ditambahkan sebelum indeks kolomstore: https: // docs .microsoft.com / en-us / sql / relational-databases / indexes / columnstore-indexes-design-guidance

Niko Neugebauer juga memiliki posting blog tentang ini; sebenarnya mungkin untuk secara langsung membuat batasan unik / asing pada tabel columnstore (saya telah menerapkan pendekatan ini dalam pekerjaan saya): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- lebih-clustered-columnstore-perbaikan-di-sql-server-2016 /

heksalm
sumber