Aracılığıyla paylaş


Columnstore dizinleri - tasarım kılavuzu

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

Columnstore dizinlerini tasarlamaya yönelik üst düzey öneriler. Birkaç iyi tasarım kararı, columnstore dizinlerinin sağlamak üzere tasarlandığı yüksek veri sıkıştırma ve sorgu performansına ulaşmanıza yardımcı olur.

Prerequisites

Bu makalede columnstore mimarisi ve terminolojisi hakkında bilgi sahibi olduğunuz varsayılır. Daha fazla bilgi için bkz. Columnstore dizinleri: Genel Bakış ve Columnstore Dizin Mimarisi.

Veri gereksinimlerinizi öğrenme

Columnstore dizini tasarlamadan önce, veri gereksinimleriniz hakkında mümkün olduğunca çok bilgi edin. Örneğin, şu soruların yanıtlarını düşünün:

  • Tablom ne kadar büyük?
  • Sorgularım çoğunlukla büyük değer aralıklarını tarayan analizler gerçekleştiriyor mu? Columnstore dizinleri, belirli değerleri aramak yerine büyük aralıklı taramalar için iyi çalışacak şekilde tasarlanmıştır.
  • İş yüküm çok fazla güncelleştirme ve silme işlemi gerçekleştiriyor mu? Veriler kararlı olduğunda Columnstore dizinleri iyi çalışır. Sorgular, satırların %10%'dan daha azını güncellemeli ve silmeli.
  • Veri ambarı için olgu ve boyut tablolarım var mı?
  • İşlem iş yükünde analiz gerçekleştirmem gerekiyor mu? Öyleyse, gerçek zamanlı operasyonel analiz için columnstore tasarım kılavuzuna bakın.

Columnstore dizinine ihtiyacınız olmayabilir. Yığınlara veya kümelenmiş dizinlere sahip satır deposu (veya B ağacı) tabloları, verileri arayan, belirli bir değeri arayan veya küçük bir değer aralığındaki sorgular için en iyi performansı gösterir. Büyük aralıklı tablo taramaları yerine çoğunlukla tablo aramaları gerektirme eğiliminde olduklarından, işlem iş yükleriyle rowstore dizinlerini kullanın.

gereksinimleriniz için en iyi columnstore dizinini seçin

Columnstore dizini kümelenmiş veya kümelenmemiş olabilir. Kümelenmiş columnstore dizininde bir veya daha fazla kümelenmemiş B-tree dizini olabilir. Columnstore dizinlerini denemek kolaydır. Eğer bir tabloyu bir columnstore dizini olarak oluşturursanız, columnstore dizinini kaldırarak tabloyu kolayca bir rowstore tablosuna dönüştürebilirsiniz.

Seçenekler ve önerilerin özeti aşağıdadır.

Columnstore seçeneği Ne zaman kullanılacağına ilişkin öneriler Compression
Kümelenmiş sütun deposu dizini Aşağıdakiler için kullanın:

1) Yıldız veya kar tanesi şeması ile geleneksel veri ambarı iş yükü

2) Çok az güncelleştirme ve silme işlemiyle büyük hacimli veriler ekleyen Nesnelerin İnterneti (IOT) iş yükleri.
Ortalama 10x
Sıralı sütun deposu dizini Kümelenmiş columnstore dizini tek bir sıralı koşul sütunu veya sütun kümesi aracılığıyla sorgulandığında kullanın. Bu kılavuz, bir satır deposu kümelenmiş dizini için anahtar sütunları seçmeye benzer, ancak sıkıştırılmış temel satır grupları farklı davranır. Daha fazla bilgi için bkz. CREATE COLUMNSTORE INDEX ve Sıralı columnstore dizinleriyle performans ayarlaması. Ortalama 10x
Kümelenmiş columnstore dizini üzerindeki kümelenmemiş B-ağacı dizinleri Şu şekilde kullanın:

1. Kümelenmiş columnstore dizininde birincil anahtar ve yabancı anahtar kısıtlamalarını zorunlu tutun.

2. Belirli değerleri veya küçük değer aralıklarını arayan sorguları hızlandırın.

3. Belirli satırların güncelleştirmelerini ve silmelerini hızlandırın.
Ortalama 10 kat artı NCI'ler için biraz ek depolama alanı.
Disk tabanlı bir yığın veya B-ağacı dizini üzerinde kümelenmemiş bir sütun deposu dizini Aşağıdakiler için kullanın:

1) Bazı analiz sorguları olan bir OLTP iş yükü. Analiz için oluşturulan B ağacı dizinlerini bırakabilir ve bunları bir kümelenmemiş columnstore diziniyle değiştirebilirsiniz.

2) Verileri ayrı bir veri ambarı'na taşımak için Ayıklama Dönüştürme ve Yükleme (ETL) işlemleri gerçekleştiren birçok geleneksel OLTP iş yükü. OLTP tablolarından bazılarında bir kümelenmemiş columnstore dizini oluşturarak ETL'yi ve ayrı bir veri ambarını ortadan kaldırabilirsiniz.
NCCI, ortalama olarak 10% daha fazla depolama alanı gerektiren ek bir dizindir.
Bellek içi tablo üzerinde sütun deposu dizini Disk tabanlı bir tablodaki kümelenmemiş columnstore dizini için öneriler, temel tablonun bellek içi bir tablo olması haricinde aynıdır. Columnstore dizini ek bir dizindir.

Büyük veri ambarı tabloları için kümelenmiş columnstore dizini kullanma

Kümelenmiş columnstore dizini bir dizinden daha fazlasıdır, birincil tablo depolama alanıdır. Yüksek veri sıkıştırma ve büyük veri ambarı olgu ve boyut tablolarında sorgu performansında önemli bir gelişme sağlar. Kümelenmiş columnstore dizinleri işlem sorguları yerine analiz sorguları için en uygundur çünkü analiz sorguları belirli değerleri aramak yerine çok çeşitli değerlerde işlem gerçekleştirme eğilimindedir.

Aşağıdaki durumlarda kümelenmiş columnstore dizini kullanmayı göz önünde bulundurun:

  • Her bölümün en az bir milyon satırı vardır. Columnstore dizinlerinin her bölümde satır grupları vardır. Tablo her bölümdeki bir satır grubunu dolduramayacak kadar küçükse columnstore sıkıştırma ve sorgu performansı avantajlarından yararlanamayabilirsiniz.
  • Sorgular öncelikli olarak değer aralıklarında analiz gerçekleştirir. Örneğin, bir sütunun ortalama değerini bulmak için sorgunun tüm sütun değerlerini taraması gerekir. Ardından, ortalamayı belirlemek için değerleri toplayarak bir araya getirir.
  • Eklemelerin çoğu, çok az güncelleştirme ve silme işlemiyle büyük hacimli verilerde yer alır. Nesnelerin İnterneti (IOT) gibi birçok iş yükü, çok az güncelleştirme ve silme işlemiyle büyük miktarlarda veri ekler. Bu iş yükleri, kümelenmiş columnstore dizini kullanılarak elde edilen sıkıştırma ve sorgu performansı kazançlarından yararlanabilir.

Aşağıdaki durumlarda kümelenmiş columnstore dizini kullanmayın:

  • Tabloda varchar(max), nvarchar(max)veya varbinary(max) veri türleri gerekir. Ya da columnstore dizinini bu sütunları içermeyecek şekilde tasarlayın (Şunun için geçerlidir: SQL Server 2016 (13.x) ve önceki sürümler).
  • Tablo verileri kalıcı değildir. Verileri hızla depolamanız ve silmeniz gerektiğinde yığın veya geçici tablo kullanmayı göz önünde bulundurun.
  • Tabloda bölüm başına bir milyondan az satır vardır.
  • Tablodaki işlemlerin 10'dan fazla% güncelleştirme ve silme işlemleridir. Çok sayıda güncelleştirme ve silme işlemi parçalanmalara neden olur. Parçalanma, tüm verileri columnstore'a zorlayan ve parçalanmayı kaldıran reorganize adlı bir işlem çalıştırana kadar sıkıştırma hızlarını ve sorgu performansını etkiler. Daha fazla bilgi için bkz. Columnstore dizininde dizin parçalanmasını en aza indirme.

Daha fazla bilgi için, veri ambarında Columnstore dizinleribölümüne bakın.

Büyük veri ambarı tabloları için sıralı sütun deposu dizini kullanma

Columnstore dizinlerinin erişilebilirliği için bkz. Columnstore dizinleri: Genel Bakış.

Aşağıdaki senaryolarda sıralı bir columnstore dizini kullanmayı göz önünde bulundurun:

  • Veriler nispeten statik olduğunda (sık yazma ve silme işlemleri olmadan) ve sıralı columnstore dizin anahtarı statik olduğunda, sıralı columnstore dizinleri analitik iş yükleri için sıralı olmayan columnstore dizinlerine veya satır deposu dizinlerine göre önemli performans avantajları sağlayabilir.
  • Sıralı columnstore dizin anahtarının ilk sütunundaki farklı değerler ne kadar çok olursa, performans artışı o kadar iyi olabilir. Bunun nedeni, dize verileri için iyileştirilmiş segment elemedir. Daha fazla bilgi için bkz. bölüm eleme.
  • Sık sorgulanan ve özellikle anahtarın ilk sütunu olmak üzere segment elemesinden yararlanabilecek sıralı bir columnstore dizin anahtarı seçin. Tablodaki diğer sütunlarda segment eleme nedeniyle performans artışları daha az tahmin edilebilir.
  • Yalnızca en son analiz verilerinin, örneğin son 15 saniyenin, sorgulanması gereken kullanım örneklerinde, sıralı columnstore dizinleri eski verilerin segmentlerini elemek için kullanılabilir. Sıralı sütun deposu verilerinin anahtarındaki ilk sütun, eklenen veya oluşturulan tarih/saat gibi tarih/saat verileri olmalıdır. Segment eleme, sıralı bir columnstore dizininde, sıralanmamış bir columnstore dizinine göre daha etkili olacaktır.
  • GUID verilerine sahip anahtarları içeren tablolarda sıralı columnstore dizinleri kullanmayı düşünün; burada benzersiz belirleyici veri türü artık segment elemeiçin kullanılabilir.

Sıralı columnstore dizini şu senaryolarda o kadar etkili olmayabilir:

  • Diğer columnstore dizinlerine benzer şekilde, yüksek oranda ekleme etkinliği aşırı depolama G/Ç'sine neden olabilir.
  • Yazma işlemlerinin yoğun olduğu iş yüklerinde, tuple taşıyıcısı tarafından gerçekleştirilen satır grubu bakımı nedeniyle segment eliminasyonu kalitesi zamanla azalmaktadır. Bu, ALTER INDEX REORGANIZEile columnstore dizininin düzenli bakımıyla azaltılabilir.

Tablo aramalarını daha verimli hale getirmek için kümelenmemiş B-ağacı dizinleri ekleyin

SQL Server 2016(13.x) sürümünden başlayarak kümelenmiş bir columnstore dizininde ikincil dizinler olarak kümelenmemiş B ağacı veya satır deposu dizinleri oluşturabilirsiniz. Kümelenmemiş B ağacı dizini, sütun deposu dizininde değişiklikler meydana geldikçe güncellenir. Bu, avantajınıza kullanabileceğiniz güçlü bir özelliktir.

İkincil B ağacı dizinini kullanarak, tüm satırları taramadan belirli satırları verimli bir şekilde arayabilirsiniz. Diğer seçenekler de kullanılabilir duruma gelir. Örneğin, B ağaç dizininde UNIQUE kısıtlaması kullanarak birincil veya yabancı anahtar kısıtlaması uygulayabilirsiniz. Benzersiz olmayan bir değer B ağacı dizinine eklenemediğinden, SQL Server değeri columnstore'a ekleyemez.

Columnstore dizininde bir B-ağacı dizini kullanmayı şu durumlarda değerlendirin:

  • Belirli değerleri veya küçük değer aralıklarını arayan sorgular çalıştırın.
  • Birincil anahtar veya yabancı anahtar kısıtlaması gibi bir kısıtlamayı zorunlu tutun.
  • Güncelleştirme ve silme işlemlerini verimli bir şekilde gerçekleştirin. B ağacı dizini, bir tablonun tam tablosunu veya bölümünü taramadan güncelleştirmeler ve silmeler için belirli satırları hızla bulabilir.
  • B ağacı dizinini depolamak için ek depolama alanınız var.

Gerçek zamanlı analiz için kümelenmemiş columnstore dizini kullanma

SQL Server 2016(13.x) sürümünden başlayarak, satır deposu disk tabanlı bir tabloda veya bellek içi OLTP tablosunda kümelenmemiş bir columnstore dizininiz olabilir. Bu işlem tablosunda analizi gerçek zamanlı olarak çalıştırmayı mümkün kılar. Temel tabelada işlemler devam ederken columnstore dizininde analiz yapabilirsiniz. Bir tablo her iki dizini de yönettiğinden, değişiklikler hem satır deposu hem de columnstore dizinlerinde gerçek zamanlı olarak kullanılabilir.

Bir columnstore dizini, rowstore dizinine göre 10 kat daha iyi veri sıkıştırması elde ettiğinden, yalnızca az miktarda ek depolamaya ihtiyaç duyar. Örneğin, sıkıştırılmış satır deposu tablosu 20 GB alıyorsa, columnstore dizini ek 2 GB gerektirebilir. Gereken ek alan, kümelenmemiş columnstore dizinindeki sütun sayısına da bağlıdır.

Aşağıdakiler için kümelenmemiş columnstore dizini kullanmayı göz önünde bulundurun:

  • İşlemsel satır deposu tablosunda analizi gerçek zamanlı olarak çalıştırın. Analiz için tasarlanmış mevcut B ağacı dizinlerini, kümelenmemiş bir columnstore diziniyle değiştirebilirsiniz.

  • Ayrı bir veri ambarı gereksinimini ortadan kaldırın. Geleneksel olarak şirketler işlemleri bir satır deposu tablosunda çalıştırır ve sonra analiz çalıştırmak için verileri ayrı bir veri ambarı içine yükler. Birçok iş yükü için işlem tablolarında bir kümelenmemiş columnstore dizini oluşturarak yükleme işlemini ve ayrı veri ambarını ortadan kaldırabilirsiniz.

SQL Server 2016 (13.x), bu senaryo için çeşitli stratejiler sunar. OLTP uygulamanızda değişiklik olmadan bir kümelenmemiş columnstore dizinini etkinleştirebildiğiniz için bunu kolayca deneyebilirsiniz.

Ek işlem kaynakları eklemek için, analizi okunabilir bir ikincil kaynak üzerinde çalıştırabilirsiniz. Okunabilir bir ikincil kullanmak, işlem iş yükünün ve analiz iş yükünün işlenmesini birbirinden ayırır.

Daha fazla bilgi için bkz. Gerçek zamanlı operasyonel analiz için Columnstore kullanmaya başlama

En iyi columnstore dizinini seçme hakkında daha fazla bilgi için Sunil Agarwal'ın blogu Hangi columnstore dizini iş yüküm için uygun?.

Veri yönetimi ve sorgu performansı için tablo bölümlerini kullanma

Columnstore dizinleri, verileri yönetmek ve arşivlemenin iyi bir yolu olan bölümlendirmeyi destekler. Bölümleme, işlemleri bir veya daha fazla bölümle sınırlayarak sorgu performansını da artırır.

Verilerin yönetilmesini kolaylaştırmak için bölümleri kullanma

Büyük tablolar için veri aralıklarını yönetmenin tek pratik yolu bölümleri kullanmaktır. Satır deposu tabloları için bölümlerin avantajları, columnstore dizinleri için de geçerlidir.

Örneğin, hem rowstore hem de columnstore tablolarında bölmeler kullanılır:

  • Artımlı yedeklemelerin boyutunu denetleyin. Bölümleri yedekleyerek dosya gruplarını ayırabilir ve sonra bunları salt okunur olarak işaretleyebilirsiniz. Bunu yaptığınızda, gelecekteki yedeklemeler salt okunur dosya gruplarını atlar.
  • Eski bir bölümü daha düşük maliyetli bir depolama alanına taşıyarak depolama maliyetlerinden tasarruf edin. Örneğin, bir bölümü daha ucuz bir depolama konumuna taşımak için bölüm değiştirme özelliğini kullanabilirsiniz.
  • İşlemleri bir bölümle sınırlayarak işlemleri verimli bir şekilde gerçekleştirin. Örneğin, dizin bakımı için yalnızca parçalanmış bölümleri hedefleyebilirsiniz.

Ayrıca columnstore diziniyle bölümleme özelliğini kullanarak şunları da kullanabilirsiniz:

  • Depolama maliyetlerinde 30% daha tasarruf edin. Eski bölümleri COLUMNSTORE_ARCHIVE sıkıştırma seçenekleriyle sıkıştırabilirsiniz. Sorgu performansı daha yavaş olabilir ve bölüm seyrek sorgulanırsa kabul edilebilir.

Sorgu performansını geliştirmek için bölümleri kullanma

Bölümleri kullanarak sorgularınızı yalnızca belirli bölümleri tarar ve bu da taranacak satır sayısını sınırlar. Örneğin, dizin yıla göre bölümlenmişse ve sorgu geçen yılın verilerini analiz ediyorsa, yalnızca bir bölümdeki verileri taraması gerekir.

Columnstore dizini için daha az bölüm kullanma

Veri boyutunuz yeterince büyük olmadığı sürece, sütun deposu dizini, satır deposu dizinine kıyasla daha az bölümle en iyi performansı gösterir. Bölüm başına en az bir milyon satırınız yoksa, satırlarınızın çoğu columnstore sıkıştırmasının performans avantajını almadıkları deltastore'ya gidebilir. Örneğin, 10 bölümü olan bir tabloya bir milyon satır yüklerseniz ve her bölüm 100.000 satır alırsa, tüm satırlar delta satır gruplarına gider.

Example:

  • Bir bölüme veya bölümlenmemiş bir tabloya 1.000.000 satır yükleyin. 1.000.000 satır içeren sıkıştırılmış bir satır grubu elde edersiniz. Bu, yüksek veri sıkıştırma ve hızlı sorgu performansı için mükemmeldir.
  • 1.000.000 satırı 10 bölüme eşit olarak yükleyin. Her bir bölüm 100.000 satır alır ve bu, columnstore sıkıştırma için minimum eşik değerinden daha düşüktür. Sonuç olarak columnstore dizininde her birinde 100.000 satır bulunan 10 delta satır grubu olabilir. Delta satır gruplarını bir sütun deposuna (columnstore) zorla yerleştirmenin yolları vardır. Ancak columnstore dizinindeki tek satırlar bunlarsa, sıkıştırılmış satır grupları en iyi sıkıştırma ve sorgu performansı için çok küçüktür.

Bölümleme hakkında daha fazla bilgi için bkz. Sunil Agarwal'ın blog gönderisi, Columnstore dizinimi bölümlemeli miyim?.

Uygun veri sıkıştırma yöntemini seçin

columnstore dizini, veri sıkıştırma için iki seçenek sunar: columnstore sıkıştırma ve arşiv sıkıştırma. Dizini oluştururken sıkıştırma seçeneğini belirleyebilir veya daha sonra ALTER INDEX ... KOMUTUYLAYENIDEN OLUŞTURARAK değiştirebilirsiniz.

En iyi sorgu performansı için columnstore sıkıştırmasını kullanma

Columnstore sıkıştırması genellikle rowstore dizinlerine göre 10 kat daha iyi sıkıştırma hızları elde eder. Columnstore dizinleri için standart sıkıştırma yöntemidir ve hızlı sorgu performansı sağlar.

En iyi veri sıkıştırması için arşiv sıkıştırmayı kullanma

Arşiv sıkıştırma, sorgu performansı o kadar önemli olmadığında en yüksek sıkıştırma için tasarlanmıştır. Columnstore sıkıştırmasından daha yüksek veri sıkıştırma oranları elde eder, ancak bunun bir fiyatı vardır. Verilerin sıkıştırılması ve açılması daha uzun zaman alır, bu nedenle hızlı sorgulama performansı için uygun değildir.

Satır deposu tablosunu columnstore dizinine dönüştürürken iyileştirmeleri kullanma

Verileriniz zaten bir satır deposu tablosundaysa, CREATE COLUMNSTORE INDEX kullanarak tabloyu kümelenmiş columnstore dizinine dönüştürebilirsiniz. Tablo dönüştürüldükten sonra sorgu performansını geliştirecek birkaç iyileştirme vardır.

Satır grubu kalitesini geliştirmek için MAXDOP kullanma

Bir yığın veya kümelenmiş B ağacı dizinini bir columnstore dizinine dönüştürmek için kullanılabilecek en fazla işlemci sayısını yapılandırabilirsiniz. İşlemcileri yapılandırmak için en yüksek paralellik derecesini (MAXDOP) kullanın.

Büyük miktarda veriniz varsa MAXDOP 1 çok yavaş olabilir. MAXDOP'i 4'a çıkarmak sorunsuz çalışıyor. Bu, en iyi satır sayısına sahip olmayan birkaç satır grubuyla sonuçlanırsa, arka planda birleştirmek için ALTER INDEX REORGANIZE çalıştırabilirsiniz.

B ağacı dizininin sıralı düzenini koru

B ağacı dizini satırları zaten sıralı bir düzende depoladığından, satırlar columnstore dizinine sıkıştırıldığında bu düzenin korunması sorgu performansını artırabilir.

Columnstore dizini verileri sıralamaz, ancak meta verileri kullanarak her satır grubundaki her sütun kesiminin en düşük ve en yüksek değerlerini izler. Bir değer aralığını tararken, satır grubunun ne zaman atlanmış olduğunu hızlı bir şekilde hesaplayabilir. Veriler sıralandığında daha fazla satır grubu atlanabilir.

Dönüştürme sırasında sıralanmış düzeni korumak için:

  • CREATE COLUMNSTORE INDEX deyimini, DROP_EXISTING yan tümcesiyle birlikte kullanın. Bu aynı zamanda dizin adının korunmasını sağlar. Satır deposu dizininin adını zaten kullanan betikleriniz varsa bunları güncelleştirmeniz gerekmez.

    Bu örnek, MyFactTable adlı bir tablodaki kümelenmiş rowstore dizinini kümelenmiş columnstore dizinine dönüştürür. ClusteredIndex_d473567f7ea04d7aafcac5364c241e09dizin adı aynı kalır.

    CREATE CLUSTERED COLUMNSTORE INDEX ClusteredIndex_d473567f7ea04d7aafcac5364c241e09
    ON MyFactTable
    WITH (DROP_EXISTING = ON);
    

Segment eliminasyonunu anlama

Her satır grubu, tablodaki her sütun için bir sütun kesimi içerir. Her sütun kesimi birlikte sıkıştırılır ve fiziksel medyada depolanır.

Bölümleri okumadan hızlı bir şekilde ortadan kaldırmaya olanak sağlamak için her segmente sahip meta veriler vardır. Veri türü seçimleri, columnstore dizinindeki sorgular için sorgu performansı tabanlı ortak filtre koşullarını önemli ölçüde etkileyebilir. Daha fazla bilgi için bkz. bölüm eleme.

Columnstore dizinlerini oluşturmaya ve sürdürmeye yönelik yaygın görevlerin özeti için bkz. İlgili görevler.