Aracılığıyla paylaş


Azure Synapse Analytics'de ayrılmış SQL havuzu tablolarındaki dizinler

Azure Synapse Analytics'te ayrılmış SQL havuzunda tabloları dizine eklemeye yönelik öneriler ve örnekler.

Dizin türleri

Ayrılmış SQL havuzu, sütun deposu dizinleri, kümelenmiş dizinler ve kümelenmemiş dizinler gibi çeşitli dizin oluşturma seçenekleri ve yığın olarak da bilinen dizin dışı bir seçenek sunar.

Dizin içeren bir tablo oluşturmak için CREATE TABLE (ayrılmış SQL havuzu) belgelerine bakın.

Kümelenmiş sütun-mağaza dizinleri

Varsayılan olarak, ayrılmış SQL havuzu bir tabloda dizin seçenekleri belirtilmediğinde kümelenmiş bir columnstore dizini oluşturur. Kümelenmiş columnstore tabloları hem en yüksek veri sıkıştırma düzeyini hem de en iyi genel sorgu performansını sunar. Kümelenmiş columnstore tabloları genellikle kümelenmiş dizin veya yığın tablolarını daha iyi performans gösterir ve genellikle büyük tablolar için en iyi seçenektir. Bu nedenlerden dolayı, tablonuzun dizinini nasıl oluşturacağınızdan emin olmadığınızda, kümelenmiş sütun deposu en iyi başlangıç noktasıdır.

Kümelenmiş bir columnstore tablosu oluşturmak için CLUSTERED COLUMNSTORE INDEX ifadesini WITH yan tümcesinde belirtin ya da WITH yan tümcesini kullanmayın.

CREATE TABLE myTable
  (  
    id int NOT NULL,  
    lastName varchar(20),  
    zipCode varchar(6)  
  )  
WITH ( CLUSTERED COLUMNSTORE INDEX );

Kümelenmiş columnstore'un iyi bir seçenek olmadığı birkaç senaryo vardır:

  • Columnstore tabloları varchar(max), nvarchar(max) ve varbinary(max) tablolarını desteklemez. Bunun yerine yığın veya kümelenmiş dizini düşünün.
  • Columnstore tabloları, geçici veriler için daha az verimli olabilir. Yığın ve geçici tabloları göz önünde bulundurun.
  • 60 milyondan az satır içeren küçük tablolar. Yığın tablolarını değerlendirin.

Yığın tabloları

Verileri ayrılmış SQL havuzuna geçici olarak eklerken yığın tablosu kullanmanın genel süreci hızlandırdığını fark edebilirsiniz. Bunun nedeni yığınlara yapılan yüklemelerin tabloları dizine almaktan daha hızlı olması ve bazı durumlarda sonraki okumanın önbellekten yapılabilmesidir. Daha fazla dönüştürme çalıştırmadan önce verileri yalnızca hazırlamak için yüklüyorsanız, tabloyu yığın tablosuna yüklemek, verileri kümelenmiş columnstore tablosuna yüklemekten çok daha hızlıdır. Ayrıca, verileri geçici bir tabloya yüklemek, tabloyu kalıcı depolamaya yüklemekten daha hızlı yüklenir. Veri yüklendikten sonra daha hızlı sorgu performansı için tabloda dizinler oluşturabilirsiniz.

Küme columnstore tabloları, 60 milyondan fazla satır olduğunda en iyi sıkıştırmayı elde etmeye başlar. 60 milyondan az satır içeren küçük arama tablolarında daha hızlı sorgu performansı için HEAP veya kümelenmiş dizin kullanmayı göz önünde bulundurun.

Yığın tablosu oluşturmak için WITH yan tümcesinde HEAP'i belirtin.

CREATE TABLE myTable
  (  
    id int NOT NULL,  
    lastName varchar(20),  
    zipCode varchar(6)  
  )  
WITH ( HEAP );

Not

Yığın tablosunda sık sık INSERT, UPDATE veya DELETE işlemleri gerçekleştiriyorsanız, ALTER TABLE komutunu kullanarak bakım zamanlamanıza tablo yeniden oluşturmayı eklemeniz önerilir. Örneğin, ALTER TABLE [SchemaName].[TableName] REBUILD. Bu uygulama, parçalanmanın azalmasını sağlar ve okuma işlemleri sırasında performansı artırır.

Kümelenmiş ve kümelenmemiş dizinler

Kümelenmiş dizinler, tek bir satırın hızla alınması gerektiğinde kümelenmiş columnstore tablolarını aşabilir. Yüksek hızda gerçekleştirilmesi gereken tek ya da birkaç satır araması gerektiren sorgular için, kümelenmiş bir dizin veya kümelenmemiş bir ikincil dizin kullanmayı göz önünde bulundurun. Kümelenmiş dizin kullanmanın dezavantajı, yalnızca avantajlı sorguların kümelenmiş dizin sütununda yüksek seçmeli filtre kullanan sorgular olmasıdır. Diğer sütunlarda filtreyi geliştirmek için, diğer sütunlara kümelenmemiş dizin eklenebilir. Ancak, bir tabloya eklenen her dizin, yüklere hem alan hem de işlem süresi ekler.

Kümelenmiş dizin tablosu oluşturmak için WITH yan tümcesinde CLUSTERED INDEX değerini belirtin:

CREATE TABLE myTable
  (  
    id int NOT NULL,  
    lastName varchar(20),  
    zipCode varchar(6)  
  )  
WITH ( CLUSTERED INDEX (id) );

Tabloya kümelenmemiş dizin eklemek için aşağıdaki söz dizimini kullanın:

CREATE INDEX zipCodeIndex ON myTable (zipCode);

Kümelenmiş columnstore dizinlerini iyileştirme

Kümelenmiş columnstore tabloları verileri segmentler halinde düzenler. Columnstore tablolarında en iyi sorgu performansına ulaşmak için segment kalitesinin yüksek olması çok önemlidir. Segment kalitesi, sıkıştırılmış satır grubu içindeki satır sayısıyla ölçülebilir. Segment kalitesi, sıkıştırılmış satır grubu başına en az 100-K satır bulunduğu ve satır grubu başına satır sayısı 1.048.576 satıra yaklaştıkça performans elde edildiği ve bir satır grubunun içerebileceği en fazla satır olduğu durumlarda en uygun değerdir.

Sisteminize, satır grubu başına ortalama satırları hesaplamak ve alt-optimal küme sütun deposu dizinlerini tanımlamak için aşağıdaki görünümü oluşturabilir ve kullanabilirsiniz. Bu görünümdeki son sütun, dizinlerinizi yeniden oluşturmak için kullanılabilecek bir SQL deyimi oluşturur.

CREATE VIEW dbo.vColumnstoreDensity
AS
SELECT
        GETDATE()                                                               AS [execution_date]
,       DB_Name()                                                               AS [database_name]
,       s.name                                                                  AS [schema_name]
,       t.name                                                                  AS [table_name]
,       MAX(p.partition_number)                                                 AS [table_partition_count]
,       SUM(rg.[total_rows])                                                    AS [row_count_total]
,       SUM(rg.[total_rows])/COUNT(DISTINCT rg.[distribution_id])               AS [row_count_per_distribution_MAX]
,       CEILING((SUM(rg.[total_rows])*1.0/COUNT(DISTINCT rg.[distribution_id]))/1048576) AS [rowgroup_per_distribution_MAX]
,       SUM(CASE WHEN rg.[State] = 0 THEN 1                   ELSE 0    END)    AS [INVISIBLE_rowgroup_count]
,       SUM(CASE WHEN rg.[State] = 0 THEN rg.[total_rows]     ELSE 0    END)    AS [INVISIBLE_rowgroup_rows]
,       MIN(CASE WHEN rg.[State] = 0 THEN rg.[total_rows]     ELSE NULL END)    AS [INVISIBLE_rowgroup_rows_MIN]
,       MAX(CASE WHEN rg.[State] = 0 THEN rg.[total_rows]     ELSE NULL END)    AS [INVISIBLE_rowgroup_rows_MAX]
,       AVG(CASE WHEN rg.[State] = 0 THEN rg.[total_rows]     ELSE NULL END)    AS [INVISIBLE_rowgroup_rows_AVG]
,       SUM(CASE WHEN rg.[State] = 1 THEN 1                   ELSE 0    END)    AS [OPEN_rowgroup_count]
,       SUM(CASE WHEN rg.[State] = 1 THEN rg.[total_rows]     ELSE 0    END)    AS [OPEN_rowgroup_rows]
,       MIN(CASE WHEN rg.[State] = 1 THEN rg.[total_rows]     ELSE NULL END)    AS [OPEN_rowgroup_rows_MIN]
,       MAX(CASE WHEN rg.[State] = 1 THEN rg.[total_rows]     ELSE NULL END)    AS [OPEN_rowgroup_rows_MAX]
,       AVG(CASE WHEN rg.[State] = 1 THEN rg.[total_rows]     ELSE NULL END)    AS [OPEN_rowgroup_rows_AVG]
,       SUM(CASE WHEN rg.[State] = 2 THEN 1                   ELSE 0    END)    AS [CLOSED_rowgroup_count]
,       SUM(CASE WHEN rg.[State] = 2 THEN rg.[total_rows]     ELSE 0    END)    AS [CLOSED_rowgroup_rows]
,       MIN(CASE WHEN rg.[State] = 2 THEN rg.[total_rows]     ELSE NULL END)    AS [CLOSED_rowgroup_rows_MIN]
,       MAX(CASE WHEN rg.[State] = 2 THEN rg.[total_rows]     ELSE NULL END)    AS [CLOSED_rowgroup_rows_MAX]
,       AVG(CASE WHEN rg.[State] = 2 THEN rg.[total_rows]     ELSE NULL END)    AS [CLOSED_rowgroup_rows_AVG]
,       SUM(CASE WHEN rg.[State] = 3 THEN 1                   ELSE 0    END)    AS [COMPRESSED_rowgroup_count]
,       SUM(CASE WHEN rg.[State] = 3 THEN rg.[total_rows]     ELSE 0    END)    AS [COMPRESSED_rowgroup_rows]
,       SUM(CASE WHEN rg.[State] = 3 THEN rg.[deleted_rows]   ELSE 0    END)    AS [COMPRESSED_rowgroup_rows_DELETED]
,       MIN(CASE WHEN rg.[State] = 3 THEN rg.[total_rows]     ELSE NULL END)    AS [COMPRESSED_rowgroup_rows_MIN]
,       MAX(CASE WHEN rg.[State] = 3 THEN rg.[total_rows]     ELSE NULL END)    AS [COMPRESSED_rowgroup_rows_MAX]
,       AVG(CASE WHEN rg.[State] = 3 THEN rg.[total_rows]     ELSE NULL END)    AS [COMPRESSED_rowgroup_rows_AVG]
,       'ALTER INDEX ALL ON ' + s.name + '.' + t.NAME + ' REBUILD;'             AS [Rebuild_Index_SQL]
FROM    sys.[dm_pdw_nodes_db_column_store_row_group_physical_stats] rg
JOIN    sys.[pdw_nodes_tables] nt                   ON  rg.[object_id]          = nt.[object_id]
                                                    AND rg.[pdw_node_id]        = nt.[pdw_node_id]
                                                    AND rg.[distribution_id]    = nt.[distribution_id]
JOIN    sys.[pdw_permanent_table_mappings] mp                 ON  nt.[name]               = mp.[physical_name]
JOIN    sys.[tables] t                              ON  mp.[object_id]  = t.[object_id]
JOIN    sys.[schemas] s                             ON t.[schema_id]    = s.[schema_id]
JOIN    sys.[partitions] p                          ON P.object_id      = t.object_id
GROUP BY
        s.[name]
,       t.[name];

Görünümü oluşturduğunuza göre, bu sorguyu çalıştırarak 100 K'den az satıra sahip satır gruplarına sahip tabloları tanımlayın. Daha uygun segment kalitesi arıyorsanız 100 K eşiğini artırmak isteyebilirsiniz.

SELECT    *
FROM    [dbo].[vColumnstoreDensity]
WHERE    COMPRESSED_rowgroup_rows_AVG < 100000
        OR INVISIBLE_rowgroup_rows_AVG < 100000;

Sorguyu çalıştırdıktan sonra verilere bakmaya ve sonuçlarınızı analiz etmeye başlayabilirsiniz. Bu tabloda, satır grubu çözümlemenizde nelerin aranacakları açıklanmaktadır.

Sütun Bu verileri nasıl kullanabilirsiniz?
[table_partition_count] Tablo bölümlenmişse, daha yüksek Açık satır grubu sayısı görmeyi bekleyebilirsiniz. Dağılımdaki her bölümün teoride kendisiyle ilişkilendirilmiş açık bir satır grubu olabilir. Bunu analizinize dahil edin. Bölümlenmiş küçük bir tablo, sıkıştırmayı iyileştireceğinden bölümleme tamamen kaldırılarak iyileştirilebilir.
[satır_sayısı_toplam] Tablo için toplam satır sayısı. Örneğin, sıkıştırılmış durumdaki satırların yüzdesini hesaplamak için bu değeri kullanabilirsiniz.
[dağıtım başına maksimum satır sayısı] Tüm satırlar eşit olarak dağıtılırsa, bu değer dağıtım başına hedef satır sayısı olacaktır. Bu değeri compressed_rowgroup_count ile karşılaştırın.
[SIKIŞTIRILMIŞ_satırgrubu_satırlar] Tablo için sütun deposu (columnstore) biçimindeki satırların toplam sayısı.
[COMPRESSED_rowgroup_rows_AVG] Ortalama satır sayısı bir satır grubu için satır üst sınırından önemli ölçüde azsa, verileri yeniden sıkıştırmak için CTAS veya ALTER INDEX REBUILD kullanmayı göz önünde bulundurun
[COMPRESSED_rowgroup_count] Columnstore biçimindeki satır gruplarının sayısı. Bu sayı tabloya göre çok yüksekse, sütun deposu yoğunluğunun düşük olduğunu gösteren bir göstergedir.
[COMPRESSED_rowgroup_rows_DELETED] Satırlar columnstore biçiminde mantıksal olarak silinir. Sayı tablo boyutuna göre yüksekse, sorunları fiziksel olarak ortadan kaldırdığı için bölümü yeniden oluşturmayı veya dizini yeniden yapılandırmayı düşünün.
"[SIKIŞTIRILMIŞ_sıra_grubu_satırları_MIN]" Bunu, columnstore'nuzdaki satır gruplarının değer aralığını anlamak için AVG ve MAX sütunlarıyla birlikte kullanın. Yük eşiğinin üzerindeki düşük bir sayı (bölüme hizalı dağıtım başına 102.400), veri yükünde iyileştirmelerin kullanılabilir olduğunu gösterir
[COMPRESSED_rowgroup_rows_MAX] Yukarıdaki gibi
[OPEN_rowgroup_count] Açık satır grupları normaldir. Her tablo dağıtımı başına makul bir şekilde bir açık satır grubu (60) beklenir. Aşırı sayılar bölümler arasında veri yüklenmesini önerir. Sağlam olduğundan emin olmak için bölümleme stratejisini iki kez kontrol edin
[OPEN_rowgroup_rows] Her satır grubunda en fazla 1.048.576 satır olabilir. Açık satır gruplarının şu anda ne kadar dolu olduğunu görmek için bu değeri kullanın
[OPEN_rowgroup_rows_MIN] Açık gruplar, verilerin tabloya yavaş yavaş yüklendiğini veya önceki yükün kalan satırları bu satır grubuna aktardığını gösterir. OPEN satır gruplarında ne kadar verinin bulunduğunu görmek için MIN, MAX, AVG sütunlarını kullanın. Küçük tablolar için tüm verilerin %100'ü olabilir! Hangi durumda verilerin columnstore'a zorlanması için ALTER INDEX REBUILD kullanılmalıdır.
[AÇIK_satırgrubu_satırlar_MAKS] Yukarıdaki gibi
[OPEN_rowgroup_rows_AVG] Yukarıdaki gibi
[KAPALI_satırgrubu_satırlar] Kapatılmış sıra grubu sıralarına kontrol amacıyla bakın.
[CLOSED_rowgroup_count] Eğer kapalı satır grupları görülürse, sayıları düşük olmalıdır. Kapalı satır grupları ALTER INDEX kullanılarak sıkıştırılmış satır gruplarına dönüştürülebilir... REORGANIZE komutu. Ancak bu normalde gerekli değildir. Kapalı gruplar, arka plan "öbek taşıyıcı" işlemiyle otomatik olarak columnstore satır gruplarına dönüştürülür.
[KAPALI_satırgrubu_satırlar_MİN] Kapalı satır gruplarının doldurma oranı oldukça yüksek olmalıdır. Kapalı satır grubu için doldurma oranı düşükse, columnstore’un daha fazla analiz edilmesi gerekir.
[CLOSED_satırgrubu_satırlar_MAKS] Yukarıdaki gibi
[CLOSED_rowgroup_rows_AVG] Yukarıdaki gibi
[Rebuild_Index_SQL] Bir tablo için columnstore dizinini yeniden oluşturmak amacıyla SQL komutu.

Dizin bakımının etkisi

Görünümdeki sütun Rebuild_Index_SQL , vColumnstoreDensity dizinlerinizi yeniden oluşturmak için kullanılabilecek bir ALTER INDEX REBUILD deyim içerir. Dizinlerinizi yeniden oluştururken, dizininizi yeniden oluşturan oturuma yeterli bellek ayırdığınızdan emin olun. Bunu yapmak için, bu tablodaki dizini yeniden oluşturma izinlerine sahip bir kullanıcının kaynak sınıfını önerilen en düşük değere yükseltin. Bir örnek için, bu makalenin devamında segment kalitesini artırmak için dizinleri yeniden oluşturma bölümüne bakın.

Sıralı kümelenmiş columnstore dizini olan bir tablo için tempdb ALTER INDEX REBUILD kullanarak verileri yeniden sıralar. Yeniden oluşturma işlemleri sırasında tempdb'i izleyin. Daha fazla tempdb alanına ihtiyacınız varsa veritabanı havuzunun ölçeğini büyütün. Dizin yeniden oluşturma işlemi tamamlandıktan sonra ölçeği yeniden azaltma.

Sıralı kümelenmiş columnstore dizini olan bir tablo için ALTER INDEX REORGANIZE verileri yeniden sıralamaz. Verileri yeniden sıralamak için kullanın ALTER INDEX REBUILD.

Sıralı kümelenmiş columnstore dizinler hakkında daha fazla bilgi için, Sıralı Kümelenmiş Columnstore Dizinlerle Performans Ayarlama bölümüne bakın.

Columnstore dizin kalitesinin düşük olmasının nedenleri

Düşük segment kalitesine sahip tablolar belirlediyseniz, kök nedeni belirlemek istiyorsunuz. Aşağıda düşük segment kalitesinin diğer bazı yaygın nedenleri yer almaktadır:

  1. Dizin oluşturulduğunda bellek baskısı
  2. Yüksek hacimli DML işlemleri
  3. Küçük veya damla yük işlemleri
  4. Çok fazla bölüm var

Bu faktörler bir columnstore dizininin satır grubu başına en uygun 1 milyon satırdan önemli ölçüde daha az olmasına neden olabilir. Ayrıca, satırların sıkıştırılmış satır grubu yerine delta satır grubuna gitmesine de neden olabilir.

Not

Columnstore tabloları genellikle tablo başına 1 milyondan fazla satır olana kadar verileri sıkıştırılmış bir columnstore segmentine göndermez. Kümelenmiş columnstore dizini olan bir tabloda sıkıştırma eşiğine (1 milyon satır) uymayan toplam satır sayısına sahip çok sayıda açık satır grubu varsa, bu satır grupları açık kalır ve satır verileri olarak depolanır. Sonuç olarak, bunlar sıkıştırılmadığından dağıtım veritabanı boyutunu artırır. Ayrıca, bu açık satır grupları CCI'den yararlanmayacak ve bakımını yapmak için daha fazla kaynak gerektirecektir. ALTER INDEX REORGANIZEkullanılması tavsiye edilebilir.

Dizin oluşturulduğunda bellek baskısı

Sıkıştırılmış satır grubu başına satır sayısı, satırın genişliği ve satır grubunu işlemek için kullanılabilir bellek miktarıyla doğrudan ilişkilidir. Satırlar bellek baskısı altında sütun deposu tablolarına yazıldığında, sütun deposu segment kalitesi olumsuz etkilenebilir. Bu nedenle en iyi yöntem, columnstore dizin tablolarınıza yazma işlemini gerçekleştiren oturuma mümkün olduğunca çok belleğe erişim vermektir. Bellek ve eşzamanlılık arasında bir denge olduğundan, doğru bellek ayırma yönergeleri tablonuzun her satırındaki verilere, sisteminize ayrılan veri ambarı birimlerine ve tablonuza veri yazan oturuma verebileceğiniz eşzamanlılık yuvalarının sayısına bağlıdır.

Yüksek hacimli DML işlemleri

Satırları güncelleştiren ve silebilen yüksek hacimli DML işlemleri columnstore'da verimsizliğe neden olabilir. Bu, özellikle satır grubundaki satırların çoğu değiştirildiğinde geçerlidir.

  • Sıkıştırılmış satır grubundaki bir satırı sildiğinizde yalnızca ilgili satır mantıksal olarak silinmiş şekilde kabul edilir. Bölüm veya tablo yeniden oluşturulana kadar ilgili satır, sıkıştırılmış satır grubunda kalır.
  • Satır eklemek, satırı delta satır grubu olarak adlandırılan bir iç satır deposu tablosuna ekler. Eklenen satır, delta satır grubu doluncaya ve kapalı olarak işaretleninceye kadar columnstore’a dönüştürülmez. Satır grupları en fazla 1.048.576 satır kapasitesine ulaştıktan sonra kapatılır.
  • Columnstore biçimindeki bir satırı güncelleştirmek, mantıksal silme ve ardından ekleme olarak işlenir. Eklenen satır, delta deposu olarak bilinen yerde depolanabilir.

102.400 satırdan fazla olan ve bölüme hizalanmış dağıtımlar için toplu işlem eşiğini aşan güncelleme ve ekleme işlemleri doğrudan columnstore formatına gider. Ancak, eşit bir dağıtım varsayarsak, bunun gerçekleşmesi için tek bir işlemde 6,144 milyondan fazla satır değiştirmeniz gerekir. Belirli bir bölümle hizalanmış dağılımın satır sayısı 102.400'den azsa, satırlar delta deposuna aktarılır ve satır grubunun kapanması için yeterli sayıda satır eklenene veya değiştirene kadar ya da dizin yeniden oluşturulana kadar orada kalır.

Küçük veya damla yük işlemleri

Ayrılmış SQL havuzuna akan küçük yükler bazen damla yükler olarak da bilinir. Bunlar genellikle sistem tarafından alınan neredeyse sabit bir veri akışını temsil ederler. Ancak, bu akış neredeyse sürekli olduğundan satır hacmi özellikle büyük değildir. Çoğu zaman veriler, columnstore biçimine doğrudan yükleme için gereken eşiğin önemli ölçüde altındadır.

Bu gibi durumlarda, verileri önce Azure blob depolamaya almak ve yüklemeden önce birikmesine izin vermek genellikle daha iyidir. Bu teknik genellikle mikro toplu işlem olarak bilinir.

Çok fazla bölüm var

Dikkate alınması gereken bir diğer şey de bölümlemenin kümelenmiş columnstore tablolarınız üzerindeki etkisidir. Bölümlemeden önce ayrılmış SQL havuzu verilerinizi zaten 60 veritabanına böler. Bölümleme, verilerinizi daha da böler. Verilerinizi bölümlerseniz, kümelenmiş columnstore dizininden yararlanmak için her bölümün en az 1 milyon satıra ihtiyacı olduğunu düşünün. Tablonuzu 100 bölüme bölerseniz, kümelenmiş columnstore dizininden (60 dağıtım 100 bölüm 1 milyon satır) yararlanmak için tablonuzun en az 6 milyar satıra ihtiyacı vardır. 100 bölümlü tablonuzda 6 milyar satır yoksa, bölüm sayısını azaltın veya bunun yerine yığın tablosu kullanmayı göz önünde bulundurun.

Tablolarınız bazı verilerle yüklendikten sonra, daha az uygun kümelenmiş columnstore dizinlerine sahip tabloları tanımlamak ve yeniden oluşturmak için aşağıdaki adımları izleyin.

Segment kalitesini geliştirmek için dizinleri yeniden oluşturma

1. Adım: Doğru kaynak sınıfını kullanan kullanıcıyı tanımlama veya oluşturma

Segment kalitesini hemen geliştirmenin hızlı yollarından biri dizini yeniden oluşturmaktır. Yukarıdaki görünüm tarafından döndürülen SQL, dizinlerinizi yeniden oluşturmak için kullanılabilen ALTER INDEX REBUILD deyimini içerir. Dizinlerinizi yeniden oluştururken, dizininizi yeniden oluşturan oturuma yeterli bellek ayırdığınızdan emin olun. Bunu yapmak için, bu tablodaki dizini yeniden oluşturma izinlerine sahip bir kullanıcının kaynak sınıfını önerilen en düşük değere yükseltin.

Aşağıda, bir kullanıcıya kaynak sınıfını artırarak daha fazla bellek ayırma örneği verilmiştir. Kaynak sınıflarıyla çalışmak için bkz . İş yükü yönetimi için kaynak sınıfları.

EXEC sp_addrolemember 'xlargerc', 'LoadUser';

2. Adım: Daha yüksek kaynak sınıfı kullanıcısıyla kümelenmiş columnstore dizinlerini yeniden oluşturma

1. Adımda belirtilen kullanıcı olarak (şu anda daha yüksek bir kaynak sınıfı kullanan) oturum açın ve ALTER INDEX ifadelerini yürütün. Bu kullanıcının, dizinin yeniden oluşturulmakta olduğu tablolar üzerinde ALTER iznine sahip olduğundan emin olun. Bu örneklerde columnstore dizininin tamamının nasıl yeniden derlenmesi veya tek bir bölümün nasıl yeniden derlenmesi gösterilmektedir. Büyük tablolarda, dizinleri tek seferde tek bir bölümü yeniden oluşturmak daha pratiktir.

Alternatif olarak, dizini yeniden oluşturmak yerine CTAS kullanarak tabloyu yeni bir tabloya kopyalayabilirsiniz. En iyi yol hangisidir? Büyük hacimli veriler için CTAS genellikle ALTER INDEX'ten daha hızlıdır. Daha küçük veri hacimleri için ALTER INDEX'in kullanımı daha kolaydır ve tabloyu değiştirmenizi gerektirmez.

-- Rebuild the entire clustered index
ALTER INDEX ALL ON [dbo].[DimProduct] REBUILD;
-- Rebuild a single partition
ALTER INDEX ALL ON [dbo].[FactInternetSales] REBUILD Partition = 5;
-- Rebuild a single partition with archival compression
ALTER INDEX ALL ON [dbo].[FactInternetSales] REBUILD Partition = 5 WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
-- Rebuild a single partition with columnstore compression
ALTER INDEX ALL ON [dbo].[FactInternetSales] REBUILD Partition = 5 WITH (DATA_COMPRESSION = COLUMNSTORE);

Ayrılmış SQL havuzunda dizini yeniden oluşturmak çevrimdışı bir işlemdir. Dizinleri yeniden oluşturma hakkında daha fazla bilgi için Columnstore Indexes Defragmentation ve ALTER INDEX bölümlerindeki ALTER INDEX REBUILD kısmına bakın.

3. Adım: Kümelenmiş columnstore segment kalitesinin iyileştiğini doğrulama

Düşük segment kalitesine sahip tabloyu tanımlayan sorguyu yeniden çalıştırın ve segment kalitesinin iyileştiğini doğrulayın. Segment kalitesi iyiye gitmediyse, tablonuzdaki satırların fazla geniş olması olabilir. Dizinlerinizi yeniden oluştururken daha yüksek bir kaynak sınıfı veya DWU kullanmayı göz önünde bulundurun.

CTAS ve bölüm değiştirme ile dizinleri yeniden oluşturma

Bu örnekte, tablo bölümünü yeniden oluşturmak için CREATE TABLE AS SELECT (CTAS) deyimi ve bölüm değiştirme kullanılır.

-- Step 1: Select the partition of data and write it out to a new table using CTAS
CREATE TABLE [dbo].[FactInternetSales_20000101_20010101]
    WITH    (   DISTRIBUTION = HASH([ProductKey])
            ,   CLUSTERED COLUMNSTORE INDEX
            ,   PARTITION   (   [OrderDateKey] RANGE RIGHT FOR VALUES
                                (20000101,20010101
                                )
                            )
            )
AS
SELECT  *
FROM    [dbo].[FactInternetSales]
WHERE   [OrderDateKey] >= 20000101
AND     [OrderDateKey] <  20010101
;

-- Step 2: Switch IN the rebuilt data with TRUNCATE_TARGET option
ALTER TABLE [dbo].[FactInternetSales_20000101_20010101] SWITCH PARTITION 2 TO  [dbo].[FactInternetSales] PARTITION 2 WITH (TRUNCATE_TARGET = ON);

CTAS kullanarak bölümleri yeniden oluşturma hakkında daha fazla bilgi için Ayrılmış SQL havuzunda bölümleri kullanma bölümüne bakın.

Daha fazla bilgi için, Tablo geliştirme hakkında bkz Tablo geliştirme.