Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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
, veHAVING
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ıklaGROUP BY
yan tümcesinde bulunan bir sütuna veya sütun kümesine dağıtmayı göz önünde bulundurun. -
Kullanılmaz
WHERE
cümlelerde. Bir sorgununWHERE
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:
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 JOIN
olamaz.
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];
İlgili içerik
Dağıtılmış tablo oluşturmak için şu deyimlerden birini kullanın: