Ayrılmış SQL havuzundaki columnstore dizinleri için satır grubu kalitesini en üst düzeye çıkarma

Rowgroup kalitesi, bir satır grubundaki satır sayısına göre belirlenir. Kullanılabilir belleği artırmak, bir columnstore dizininin her satır grubuna sıkıştırabileceği satır sayısını en üst düzeye çıkarabilir. Columnstore dizinlerinde sıkıştırma oranlarını ve sorgu performansını geliştirmek için bu yöntemleri kullanın.

Satır grubu boyutunun önemi

Columnstore dizini tek tek satır gruplarının sütun kesimlerini tarayarak tabloyu taradığından, her satır grubundaki satır sayısını en üst düzeye çıkarmak sorgu performansını artırır.

Satır gruplarının satır sayısı yüksek olduğunda, veri sıkıştırması artar, bu da diskten okunacak daha az veri olduğu anlamına gelir.

Satır grupları hakkında daha fazla bilgi için bkz. Columnstore Dizinleri Kılavuzu.

Satır grupları için hedef boyut

En iyi sorgu performansı için amaç, columnstore dizinindeki satır grubu başına satır sayısını en üst düzeye çıkarmaktır. Bir satır grubunun en fazla 1.048.576 satırı olabilir.

Satır grubu başına satır sayısı üst sınırının olmaması sorun değildir. Columnstore dizinleri, satır gruplarının en az 100.000 satırı olduğunda iyi bir performans elde eder.

Satır grupları sıkıştırma sırasında kırpılabilir

Toplu yükleme veya columnstore dizini yeniden oluşturma sırasında, bazen her rowgroup için belirlenen tüm satırları sıkıştırmak için yeterli bellek yoktur. Bellek baskısı olduğunda, columnstore dizinleri rowgroup boyutlarını kırparak columnstore'a sıkıştırmanın başarılı olabilmesini sağlar.

Her satır grubuna en az 10.000 satırı sıkıştırmak için bellek yetersiz olduğunda bir hata oluşturulur.

Toplu yükleme hakkında daha fazla bilgi için bkz. Kümelenmiş columnstore dizinine toplu yükleme.

Rowgroup kalitesini izleme

DMV sys.dm_pdw_nodes_db_column_store_row_group_physical_stats (sys.dm_db_column_store_row_group_physical_stats , satır gruplarındaki satır sayısı ve kırpma varsa kırpma nedeni gibi yararlı bilgileri kullanıma sunan SQL DB ile eşleşen görünüm tanımını içerir).

Satır grubu kırpma hakkında bilgi almak için bu DMV'yi sorgulamanın kullanışlı bir yolu olarak aşağıdaki görünümü oluşturabilirsiniz.

create view dbo.vCS_rg_physical_stats
as
with cte
as
(
select   tb.[name]                    AS [logical_table_name]
,        rg.[row_group_id]            AS [row_group_id]
,        rg.[state]                   AS [state]
,        rg.[state_desc]              AS [state_desc]
,        rg.[total_rows]              AS [total_rows]
,        rg.[trim_reason_desc]        AS trim_reason_desc
,        mp.[physical_name]           AS physical_name
FROM    sys.[schemas] sm
JOIN    sys.[tables] tb               ON  sm.[schema_id]          = tb.[schema_id]
JOIN    sys.[pdw_table_mappings] mp   ON  tb.[object_id]          = mp.[object_id]
JOIN    sys.[pdw_nodes_tables] nt     ON  nt.[name]               = mp.[physical_name]
JOIN    sys.[dm_pdw_nodes_db_column_store_row_group_physical_stats] rg      ON  rg.[object_id]     = nt.[object_id]
                                                                            AND rg.[pdw_node_id]   = nt.[pdw_node_id]
                                        AND rg.[distribution_id]    = nt.[distribution_id]
)
select *
from cte;

trim_reason_desc, satır grubunun kırpılıp kırpılmadığını bildirir (trim_reason_desc = NO_TRIM kırpma olmadığını ve satır grubunun en iyi kalitede olduğunu ifade eder). Aşağıdaki kırpma nedenleri, satır grubunun erken kırpılmış olduğunu gösterir:

  • BULKLOAD: Bu kırpma nedeni, yük için gelen satır toplu işleminin 1 milyondan az satırı olduğunda kullanılır. 100.000'den fazla satır ekleniyorsa (delta deposuna eklemenin aksine) altyapı sıkıştırılmış satır grupları oluşturur ancak kırpma nedenini BULKLOAD olarak ayarlar. Bu senaryoda, toplu iş yükünüzü daha fazla satır içerecek şekilde artırmayı göz önünde bulundurun. Ayrıca bölümleme düzeninizi yeniden değerlendirerek satır gruplarının bölüm sınırlarına yayılamayacak kadar ayrıntılı olmadığından emin olun.
  • MEMORY_LIMITATION: 1 milyon satırlı satır grupları oluşturmak için altyapı için belirli miktarda çalışma belleği gerekir. Yükleme oturumunun kullanılabilir belleği gerekli çalışma belleğinden az olduğunda, satır grupları erken kırpılır. Aşağıdaki bölümlerde gerekli belleği tahmin etme ve daha fazla bellek ayırma işlemleri açıklanmaktadır.
  • DICTIONARY_SIZE: Bu kırpma nedeni, geniş ve/veya yüksek kardinalite dizelerine sahip en az bir dize sütunu olduğundan satır grubu kırpma işleminin gerçekleştiğini gösterir. Sözlük boyutu bellekte 16 MB ile sınırlıdır ve bu sınıra ulaşıldıktan sonra satır grubu sıkıştırılır. Bu durumla karşılaşırsanız sorunlu sütunu ayrı bir tabloda yalıtmayı göz önünde bulundurun.

Bellek gereksinimlerini tahmin etme

En büyük boyuttaki bir satır grubunu columnstore dizininde sıkıştırmak için bellek gereksinimleriyle ilgili bir tahmin görüntülemek için örnek görünüm dbo.vCS_mon_mem_grant oluşturmayı göz önünde bulundurun. Bu sorgu, bir satır grubunun columnstore'da sıkıştırmak için gerektirdiği bellek atamasının boyutunu gösterir.

Bir satır grubunu sıkıştırmak için gereken bellek üst sınırı yaklaşık olarak

  • 72 MB +
  • #rows * #columns * 8 bayt +
  • #rows * #short-string-columns * 32 bayt +
  • sıkıştırma sözlüğü için #long-string-columns * 16 MB

Not

Kısa dize sütunları = 32 bayt dize veri türlerini <, uzun dize sütunları ise 32 bayt dize > veri türlerini kullanır.

Uzun dizeler, metni sıkıştırmak için tasarlanmış bir sıkıştırma yöntemiyle sıkıştırılır. Bu sıkıştırma yöntemi, metin desenlerini depolamak için bir sözlük kullanır. Sözlüğün en büyük boyutu 16 MB'tır. Satır grubundaki her uzun dize sütunu için yalnızca bir sözlük vardır.

Bellek gereksinimlerini azaltmanın yolları

Satır gruplarını columnstore dizinlerine sıkıştırmaya yönelik bellek gereksinimlerini azaltmak için aşağıdaki teknikleri kullanın.

Daha az sütun kullanın

Mümkünse tabloyu daha az sütunla tasarla. Bir satır grubu columnstore içine sıkıştırıldığında, columnstore dizini her sütun kesimini ayrı olarak sıkıştırır.

Bu nedenle, sütun sayısı arttıkça satır grubunu sıkıştırmak için bellek gereksinimleri artar.

Daha az dize sütunu kullanın

Dize veri türlerinin sütunları sayısal ve tarih veri türlerinden daha fazla bellek gerektirir. Bellek gereksinimlerini azaltmak için olgu tablolarından dize sütunlarını kaldırmayı ve bunları daha küçük boyut tablolarına yerleştirmeyi göz önünde bulundurun.

Dize sıkıştırma için ek bellek gereksinimleri:

  • En fazla 32 karakterlik dize veri türleri için değer başına 32 ek bayt gerekebilir.
  • 32 karakterden uzun dize veri türleri sözlük yöntemleri kullanılarak sıkıştırılır. Satır grubundaki her sütunun sözlüğü derlemesi için 16 MB'a kadar daha gerekebilir.

Fazla bölümleme yapmaktan kaçının

Columnstore dizinleri bölüm başına bir veya daha fazla satır grubu oluşturur. Azure Synapse Analytics'teki ayrılmış SQL havuzu için, veriler dağıtıldığı ve her dağıtımın bölümlendiği için bölüm sayısı hızla artar.

Tabloda çok fazla bölüm varsa, satır gruplarını doldurmak için yeterli satır olmayabilir. Satırların olmaması sıkıştırma sırasında bellek baskısı oluşturmaz. Ancak, en iyi columnstore sorgu performansını elde etmeyen satır gruplarına yol açar.

Fazla bölümlemeden kaçınmanın bir diğer nedeni de bölümlenmiş bir tablodaki columnstore dizinine satır yüklemenin bellek yükü olmasıdır.

Bir yükleme sırasında, birçok bölüm gelen satırları alabilir ve her bölüm sıkıştırılacak yeterli satıra sahip olana kadar bellekte tutulur. Çok fazla bölüm olması ek bellek baskısı oluşturur.

Yük sorgusunu basitleştirme

Veritabanı, sorgudaki tüm işleçler arasında bir sorgu için bellek atamasını paylaşır. Bir yük sorgusu karmaşık sıralamalara ve birleştirmelere sahip olduğunda, sıkıştırma için kullanılabilir bellek azalır.

Yük sorgusunu yalnızca sorguyu yüklemeye odaklanacak şekilde tasarla. Verilerde dönüştürmeleri çalıştırmanız gerekiyorsa bunları yükleme sorgusundan ayrı olarak çalıştırın. Örneğin, bir yığın tablosundaki verileri hazırlama, dönüştürmeleri çalıştırma ve hazırlama tablosunu columnstore dizinine yükleme.

İpucu

Ayrıca önce verileri yükleyebilir ve ardından MPP sistemini kullanarak verileri dönüştürebilirsiniz.

MAXDOP'i ayarlama

Her dağıtım, dağıtım başına birden fazla CPU çekirdeği kullanılabilir olduğunda satır gruplarını paralel olarak columnstore'da sıkıştırır.

Paralellik, bellek baskısına ve satır grubu kırpmasına neden olabilecek ek bellek kaynakları gerektirir.

Bellek baskısını azaltmak için MAXDOP sorgu ipucunu kullanarak yükleme işlemini her dağıtımda seri modda çalışmaya zorlayabilirsiniz.

CREATE TABLE MyFactSalesQuota
WITH (DISTRIBUTION = ROUND_ROBIN)
AS SELECT * FROM FactSalesQuota
OPTION (MAXDOP 1);

Daha fazla bellek ayırmanın yolları

DWU boyutu ve kullanıcı kaynak sınıfı, bir kullanıcı sorgusu için kullanılabilir bellek miktarını birlikte belirler.

Bir yük sorgusu için bellek atamasını artırmak için DWU sayısını artırabilir veya kaynak sınıfını artırabilirsiniz.

Sonraki adımlar

Ayrılmış SQL havuzu performansını artırmanın daha fazla yolunu bulmak için bkz. Performansa genel bakış.