Columnstore dizin performansı için satır grubu kalitesini en üst düzeye çıkarma

Satır grubu kalitesi, bir satır grubundaki satır sayısına göre belirlenir. Kullanılabilir belleği artırmak, columnstore dizininin her satır grubuna sıkıştırabileceği satır sayısını en üst düzeye çıkarabilir. Columnstore dizinleri için 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ırma iyileştirir, 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, hedef bir 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 en fazla satır sayısına sahip olmak 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 satır grubu için belirlenen tüm satırları sıkıştırmak için yeterli bellek yoktur. Bellek baskısı olduğunda columnstore dizinleri satır grubu 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.

Satır grubu kalitesini izleme

Dinamik yönetim görünümü (DMV) (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 veritabanıyla 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;

Sütun, trim_reason_desc satır grubunun kırpılıp kırpılmadığını gösterir (trim_reason_desc = NO_TRIM kırpma olmadığını ve satır grubunun en iyi kalitede olduğunu gösterir). 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. Altyapı, 100.000'den fazla satır ekleniyorsa (delta deposuna eklemenin aksine) 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, satır grupları bölüm sınırlarına yayılamayacağı için bölümleme düzeninizin çok ayrıntılı olmadığından emin olmak için bölümleme düzeninizi yeniden değerlendirin.
  • MEMORY_LIMITATION: 1 milyon satıra sahip 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 tabloya ayırmayı göz önünde bulundurun.

Bellek gereksinimlerini tahmin etme

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

  • 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 baytlık > 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ırmak için 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 segmentini ayrı ayrı sıkıştırır. Bu nedenle, sütun sayısı arttıkça bir satır grubunu sıkıştırmak için bellek gereksinimleri artar.

Daha az dize sütunu kullanma

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'den fazla karakter içeren dize veri türleri sözlük yöntemleri kullanılarak sıkıştırılır. Satır grubundaki her sütun, sözlüğü oluşturmak için ek 16 MB'a kadar gerektirebilir.

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'te veri ambarı 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.

Aşırı 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, her bölümün sıkıştırılacak yeterli satırı olana kadar bellekte tutulan gelen satırları alabilir. Ç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 iznini 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 tasarlar. Verilerde dönüştürmeleri çalıştırmanız gerekiyorsa bunları yük sorgusundan ayrı olarak çalıştırın. Örneğin, verileri bir yığın tablosuna yerleştirin, dönüştürmeleri çalıştırın ve hazırlama tablosunu columnstore dizinine yükleyin.

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'a 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ırma 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

Synapse SQL'de performansı geliştirmenin daha fazla yolunu bulmak için bkz . Performansa genel bakış.