Aracılığıyla paylaş


Azure Synapse Analytics'te ayrılmış SQL havuzunu kullanarak dağıtılmış tablolar tasarlama kılavuzu

Bu makale, ayrılmış SQL havuzlarında karma dağıtılmış ve çember yöntemiyle dağıtılmış tablolar tasarlamaya yönelik öneriler içerir.

Bu makalede, ayrılmış SQL havuzundaki veri dağıtımı ve veri taşıma kavramları hakkında bilgi sahibi olduğunuz varsayılır. Daha fazla bilgi için bkz . Azure Synapse Analytics mimarisi.

Dağıtılmış tablo nedir?

Dağıtılmış tablo tek bir tablo olarak görünür, ancak satırlar aslında 60 dağıtımda depolanır. Satırlar karma fonksiyonu veya dağıtmalı algoritma ile dağıtılır.

Karma dağıtım , büyük olgu tablolarında sorgu performansını artırır ve bu makalenin odak noktasıdır. Döngüsel dağıtım, yükleme hızını artırmak için kullanışlıdır. Bu tasarım seçeneklerinin sorguyu geliştirme ve performansı yükleme üzerinde önemli bir etkisi vardır.

Başka bir tablo depolama seçeneği de küçük bir tabloyu tüm İşlem düğümleri arasında çoğaltmaktır. Daha fazla bilgi için bkz . Çoğaltılan tablolar için tasarım kılavuzu. Üç seçenek arasından hızlı bir şekilde seçim yapmak için bkz. Tablolara genel bakış bölümünde Dağıtılmış tablolar.

Tablo tasarımının bir parçası olarak verileriniz ve verilerin nasıl sorgulandığı hakkında olabildiğince fazla bilgi edinin. Örneğin, şu soruları göz önünde bulundurun:

  • Tablo ne kadar büyük?
  • Tablo ne sıklıkta yenilenir?
  • Ayrılmış bir SQL havuzunda olgu ve boyut tablolarım var mı?

Hash ile dağıtılmış

Karma dağıtılmış tablo, her satırı tek bir dağıtıma atamak için belirlenimci bir karma işlevi kullanarak tablo satırlarını İşlem düğümleri arasında dağıtır.

Dağıtılmış tablonun diyagramı.

Aynı değerler her zaman aynı dağıtımla hashlendiğinden, SQL Analytics satırların konumları hakkında doğrudan bilgiye sahiptir. Ayrılmış SQL havuzunda bu bilgi, sorgular sırasında veri hareketini en aza indirmek için kullanılır ve bu da sorgu performansını artırır.

Çapraz dağıtılmış tablolar, yıldız şemasındaki büyük olgu tabloları için iyi çalışır. Çok fazla sayıda satıra sahip olabilirler ve yine de yüksek performans elde edebilir. Dağıtılmış sistemin sağlamak üzere tasarlandığı performansı elde etme konusunda size yardımcı olacak bazı tasarım konuları vardır. İyi bir dağıtım sütunu veya sütunu seçmek, bu makalede açıklanan önemli noktalardan biridir.

Karma dağıtılmış tablo kullanmayı düşünmeniz gereken durumlar şunlardır:

  • Disk üzerindeki tablo boyutu 2 GB'tan fazladır.
  • Tabloda sık sık ekleme, güncelleştirme ve silme işlemleri vardır.

Hepsini bir kez deneme dağıtılmış

Dairesel dağıtım esaslı bir tablo, tablo satırlarını tüm dağıtımlar arasında eşit olarak dağıtır. Satırların dağıtımlara ataması rastgeledir. Karma dağıtılmış tablolardan farklı olarak, eşit değerlere sahip satırların aynı dağıtıma atanması garanti edilmemektedir.

Sonuç olarak, sistemin bazen sorguyu çözümleyebilmesi için önce verilerinizi daha iyi düzenlemek için bir veri taşıma işlemi çağırması gerekir. Bu ek adım sorgularınızı yavaşlatabilir. Örneğin, dönüşümlü bir tabloya katılmak genellikle satırların yeniden düzenlenmesini gerektirir, bu da performans kaybına yol açar.

Aşağıdaki senaryolarda tablonuz için turlar arası dağıtımı kullanmayı göz önünde bulundurun:

  • Başlangıç yapmak için basit bir nokta olarak varsayılanı kullanın.
  • Açık bir birleştirme anahtarı yoksa
  • Tabloyu hash yöntemiyle dağıtmak için iyi bir aday sütun yoksa
  • Tablo ortak birleştirme anahtarını diğer tablolarla paylaşmıyorsa
  • Birleştirme, sorgudaki diğer birleşimlerden daha az önemliyse
  • Tablo geçici bir hazırlama tablosu olduğunda

New York taksi verilerini yükleme öğreticisi, verilerin bir rotasyonlu hazırlama tablosuna yüklenmesine dair bir örnek verir.

Dağıtım sütunu seçme

Karma dağıtılmış tablo, karma anahtar olan bir dağıtım sütununa veya sütun kümesine sahiptir. Örneğin, aşağıdaki kod ProductKey'ı dağıtım sütunu olarak kullanarak bir karma dağıtılmış tablo oluşturur.

CREATE TABLE [dbo].[FactInternetSales]
(   [ProductKey]            int          NOT NULL
,   [OrderDateKey]          int          NOT NULL
,   [CustomerKey]           int          NOT NULL
,   [PromotionKey]          int          NOT NULL
,   [SalesOrderNumber]      nvarchar(20) NOT NULL
,   [OrderQuantity]         smallint     NOT NULL
,   [UnitPrice]             money        NOT NULL
,   [SalesAmount]           money        NOT NULL
)
WITH
(   CLUSTERED COLUMNSTORE INDEX
,  DISTRIBUTION = HASH([ProductKey])
);

Hash dağıtımı, temel tablonun dağılımını daha dengeli hale getirmek için birden çok sütuna uygulanabilir. Çok sütunlu dağıtım, dağıtım için en fazla sekiz sütun seçmenize olanak tanır. Bu yalnızca zaman içinde veri dengesizliğini azaltmakla kalmaz, aynı zamanda sorgu performansını da geliştirir. Örneğin:

CREATE TABLE [dbo].[FactInternetSales]
(   [ProductKey]            int          NOT NULL
,   [OrderDateKey]          int          NOT NULL
,   [CustomerKey]           int          NOT NULL
,   [PromotionKey]          int          NOT NULL
,   [SalesOrderNumber]      nvarchar(20) NOT NULL
,   [OrderQuantity]         smallint     NOT NULL
,   [UnitPrice]             money        NOT NULL
,   [SalesAmount]           money        NOT NULL
)
WITH
(   CLUSTERED COLUMNSTORE INDEX
,  DISTRIBUTION = HASH([ProductKey],   [OrderDateKey],   [CustomerKey] ,   [PromotionKey])
);

Not

Azure Synapse Analytics'te çok sütunlu dağıtım, veritabanının uyumluluk düzeyi 50 bu komutla değiştirilerek etkinleştirilebilir. ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = 50; Veritabanı uyumluluk düzeyini ayarlama hakkında daha fazla bilgi için bkz ALTER DATABASE SCOPED CONFIGURATION. Çok sütunlu dağıtımlar hakkında daha fazla bilgi için bkz . CREATE MATERIALIZED VIEW, CREATE TABLE veya CREATE TABLE AS SELECT.

Dağıtım sütunlarında depolanan veriler güncelleştirilebilir. Dağıtım sütunlarındaki verilerde yapılan güncelleştirmeler veri karıştırma işlemine neden olabilir.

Karma sütunlardaki değerler satırların nasıl dağıtıldığını belirlediğinden dağıtım sütunlarının seçilmesi önemli bir tasarım kararıdır. En iyi seçim çeşitli faktörlere bağlıdır ve genellikle dengeleri içerir. Dağıtım sütunu veya sütun kümesi seçildikten sonra bunu değiştiremezsiniz. İlk kez en iyi sütunları seçmediyseniz, tabloyu istenen dağıtım karma anahtarıyla yeniden oluşturmak için CREATE TABLE AS SELECT (CTAS) kullanabilirsiniz.

Eşit olarak dağıtılan verileri içeren bir dağıtım sütunu seçin

En iyi performans için tüm dağıtımlar yaklaşık olarak aynı sayıda satıra sahip olmalıdır. Bir veya daha fazla dağıtımda orantısız sayıda satır olduğunda, bazı dağıtımlar paralel sorgunun kendi bölümünü diğerlerinden önce tamamlar. Tüm dağıtımların işlenmesi tamamlanana kadar sorgu tamamlanamadığından, her sorgu yalnızca en yavaş dağıtım kadar hızlıdır.

  • Veri dengesizliği, verilerin dağıtımlar arasında eşit dağıtılmaması anlamına gelir
  • İşleme kayması, paralel sorgular çalıştırılırken bazı dağıtımların diğerlerinden daha uzun sürmesi anlamına gelir. Veriler çarpıtıldığında bu durum oluşabilir.

Paralel işlemeyi dengelemek için aşağıdakilere sahip bir dağıtım sütunu veya sütun kümesi seçin:

  • Birçok benzersiz değere sahiptir. Bir veya daha fazla dağıtım sütunu yinelenen değerlere sahip olabilir. Aynı değere sahip tüm satırlar aynı dağıtıma atanır. 60 dağıtım olduğundan, bazı dağıtımlar 1 benzersiz değere sahipken > , diğerleri sıfır değerle bitebilir.
  • NULL'leri yoktur veya yalnızca birkaç NULL'leri vardır. Aşırı bir örnek için, dağıtım sütunlarındaki tüm değerler NULL ise, tüm satırlar aynı dağıtıma atanır. Sonuç olarak, sorgu işleme tek bir dağılıma kaydırılır ve paralel işlemeden faydalanamaz.
  • Tarih sütunu değildir. Aynı tarihe ilişkin tüm veriler aynı dağıtımda yer alır veya kayıtları tarihe göre kümeler. Birden çok kullanıcının tümü aynı tarihte (bugünün tarihi gibi) filtreleme yapıyorsa, tüm işleme işlerini 60 dağıtımdan yalnızca 1'i yapar.

Veri taşımayı en aza indiren bir dağıtım sütunu seçin

Doğru sorgu sonucu sorgularını almak için veriler bir İşlem düğümünden diğerine taşınabilir. Veri taşıma genellikle sorguların dağıtılmış tablolarda birleştirmeleri ve toplamaları olduğunda gerçekleşir. Veri taşımayı en aza indirmeye yardımcı olan bir dağıtım sütunu veya sütun kümesi seçmek, ayrılmış SQL havuzunuzun performansını iyileştirmeye yönelik en önemli stratejilerden biridir.

Veri taşımayı en aza indirmek için bir dağıtım sütunu veya sütun kümesi seçin:

  • Bu, JOIN, GROUP BY, DISTINCT, OVER, ve HAVING yan tümcelerinde kullanılır. İki büyük olgu tablosunun sık birleşimleri olduğunda, her iki tabloyu birleştirme sütunlarından birine dağıttığınızda sorgu performansı artar. Birleştirmelerde tablo kullanılmadığında, tabloyu sıklıkla GROUP BY yan tümcesinde bulunan bir sütuna veya sütun kümesine dağıtmayı göz önünde bulundurun.
  • KullanılmazWHERE cümlelerde. Bir sorgunun WHERE yan tümcesi ve tablonun dağıtım sütunları aynı sütunda olduğunda, sorgu yüksek veri dengesizliğiyle karşılaşabilir ve bu da yükün yalnızca birkaç dağıtıma düşmesine neden olabilir. Bu sorgu performansını etkiler; ideal olarak birçok dağıtım işlem yükünü paylaşır.
  • Tarih sütunu değil. WHERE yan tümceleri genellikle tarih üzerinden filtreleme yapmaktadır. Bu durumda, tüm işlemler sorgu performansını etkileyen yalnızca birkaç dağıtımda çalıştırılabilir. İdeal olarak, birçok dağıtım işleme yükünü paylaşır.

Karma dağıtılmış bir tablo tasarladıktan sonra, sonraki adım tabloya veri yüklemektir. Yükleme yönergeleri için bkz . Yüklemeye genel bakış.

Dağıtımınızın iyi bir seçim olup olmadığını nasıl anlarız?

Veriler karma dağıtılmış bir tabloya yüklendikten sonra, satırların 60 dağıtım arasında ne kadar eşit dağıtıldığını denetleyin. Dağıtım başına satır sayısı performans üzerinde belirgin bir etki yaratmadan %10'a kadar değişiklik gösterebilir.

Dağıtım sütunlarınızı değerlendirmenin aşağıdaki yollarını göz önünde bulundurun.

Tabloda veri dengesizliği olup olmadığını belirleme

Veri dengesizliği olup olmadığını denetlemenin hızlı bir yolu DBCC PDW_SHOWSPACEUSED kullanmaktır. Aşağıdaki SQL kodu, 60 dağıtımın her birinde depolanan tablo satırlarının sayısını döndürür. Dengeli performans için, dağıtılmış tablonuzdaki satırların tüm dağıtımlara eşit olarak yayılması gerekir.

-- Find data skew for a distributed table
DBCC PDW_SHOWSPACEUSED('dbo.FactInternetSales');

Hangi tabloların %10'dan fazla veri dengesizliği olduğunu belirlemek için:

  1. Tablolara genel bakışdbo.vTableSizesgösterilen görünümü oluşturun.
  2. Aşağıdaki sorguyu çalıştırın:
select *
from dbo.vTableSizes
where two_part_name in
    (
    select two_part_name
    from dbo.vTableSizes
    where row_count > 0
    group by two_part_name
    having (max(row_count * 1.000) - min(row_count * 1.000))/max(row_count * 1.000) >= .10
    )
order by two_part_name, row_count;

Veri taşıma için sorgu planlarını denetleme

İyi bir dağıtım sütun kümesi, birleştirmelerin ve toplamaların minimum veri taşımasına olanak tanır. Bu, birleştirmelerin yazılma şeklini etkiler. Karma dağıtılmış iki tabloda birleştirme için en düşük veri hareketini elde etmek için birleştirme sütunlarından birinin dağıtım sütununda veya sütunlarında olması gerekir. Karma dağıtılmış iki tablo aynı veri türündeki bir dağıtım sütununda birleştirildiğinde, birleştirme veri taşıma gerektirmez. Birleşimler, veri hareketine neden olmadan ek sütunlar içerebilir.

Birleştirme sırasında veri taşımayı önlemek için:

  • Birleştirmeye katılan tabloların, birleştirmeye katılan sütunlardan birinde karma olarak dağıtılması gerekir.
  • Birleştirme sütunlarının veri türleri her iki tablo arasında eşleşmelidir.
  • Sütunlar eşittir işleciyle birleştirilmelidir.
  • Birleştirme türü bir CROSS JOINolamaz.

Sorgularda veri taşıma sorunu olup olmadığını görmek için sorgu planına bakabilirsiniz.

Dağıtım sütunu sorununu çözme

Tüm veri dengesizliği durumlarını çözmek gerekli değildir. Verilerin dağıtılması, veri dengesizliği ve veri taşımayı en aza indirme arasındaki doğru dengeyi bulmakla ilgili bir konudur. Hem veri dengesizliği hem de veri hareketini en aza indirmek her zaman mümkün değildir. Bazen minimum veri taşımanın avantajı, veri dengesizliği yaşamanın etkisinden daha ağır basabilir.

Bir tablodaki veri dengesizliği sorununu çözmeniz gerekip gerekmediğini belirlemek için, iş yükünüzdeki veri hacimleri ve sorgular hakkında olabildiğince fazla bilgi edinmelisiniz. Dengesizlik durumunun sorgu performansı üzerindeki etkisini izlemek için Sorgu izleme makalesindeki adımları kullanabilirsiniz. Özel olarak, tek tek dağıtımlarda büyük sorguların tamamlanmasının ne kadar sürdüğünü arayın.

Mevcut bir tablodaki dağıtım sütunlarını değiştiremediğiniz için, veri dengesizliklerini çözmenin tipik yolu tabloyu farklı dağıtım sütunlarıyla yeniden oluşturmaktır.

Tabloyu yeni bir dağıtım sütunu kümesiyle yeniden oluşturma

Bu örnekte, farklı karma dağıtım sütunlarına sahip bir tabloyu yeniden oluşturmak için CREATE TABLE AS SELECT kullanılır.

İlk olarak yeni tabloyu yeni anahtarla birlikte kullanın CREATE TABLE AS SELECT (CTAS). Ardından istatistikleri yeniden oluşturun ve son olarak tabloları yeniden adlandırarak değiştirin.

CREATE TABLE [dbo].[FactInternetSales_CustomerKey]
WITH (  CLUSTERED COLUMNSTORE INDEX
     ,  DISTRIBUTION =  HASH([CustomerKey])
     ,  PARTITION       ( [OrderDateKey] RANGE RIGHT FOR VALUES (   20000101, 20010101, 20020101, 20030101
                                                                ,   20040101, 20050101, 20060101, 20070101
                                                                ,   20080101, 20090101, 20100101, 20110101
                                                                ,   20120101, 20130101, 20140101, 20150101
                                                                ,   20160101, 20170101, 20180101, 20190101
                                                                ,   20200101, 20210101, 20220101, 20230101
                                                                ,   20240101, 20250101, 20260101, 20270101
                                                                ,   20280101, 20290101
                                                                )
                        )
    )
AS
SELECT  *
FROM    [dbo].[FactInternetSales]
OPTION  (LABEL  = 'CTAS : FactInternetSales_CustomerKey')
;

--Create statistics on new table
CREATE STATISTICS [ProductKey] ON [FactInternetSales_CustomerKey] ([ProductKey]);
CREATE STATISTICS [OrderDateKey] ON [FactInternetSales_CustomerKey] ([OrderDateKey]);
CREATE STATISTICS [CustomerKey] ON [FactInternetSales_CustomerKey] ([CustomerKey]);
CREATE STATISTICS [PromotionKey] ON [FactInternetSales_CustomerKey] ([PromotionKey]);
CREATE STATISTICS [SalesOrderNumber] ON [FactInternetSales_CustomerKey] ([SalesOrderNumber]);
CREATE STATISTICS [OrderQuantity] ON [FactInternetSales_CustomerKey] ([OrderQuantity]);
CREATE STATISTICS [UnitPrice] ON [FactInternetSales_CustomerKey] ([UnitPrice]);
CREATE STATISTICS [SalesAmount] ON [FactInternetSales_CustomerKey] ([SalesAmount]);

--Rename the tables
RENAME OBJECT [dbo].[FactInternetSales] TO [FactInternetSales_ProductKey];
RENAME OBJECT [dbo].[FactInternetSales_CustomerKey] TO [FactInternetSales];

Dağıtılmış tablo oluşturmak için şu deyimlerden birini kullanın: