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.
Tip
Microsoft Fabric Data Warehouse geleceğe hazır mimariye, yerleşik yapay zekaya ve yeni özelliklere sahip data lake foundation üzerinde kurumsal ölçekli ilişkisel bir ambardır. Veri ambarı konusunda yeniyseniz Fabric Data Warehouse ile başlayın. Mevcut özel SQL havuzu iş yükleri, veri bilimi, gerçek zamanlı analiz ve raporlama genelinde yeni özelliklere erişmek için Fabric yükseltilebilir.
Ayrılmış SQL havuzunda malzeme edilmiş görünümler, karmaşık analitik sorguların herhangi bir sorgu değişikliği gerektirmeden hızlı performans elde etmesi için düşük bakım maliyeti sunar. Bu makalede malzemeleşmiş görünümleri kullanmayla ilgili genel yönergeler ele alınmaktadır.
Gerçekleştirilmiş görünümler ile standart görünümler karşılaştırması
SQL havuzu hem standart hem de gerçekleştirilmiş görünümleri destekler. Her ikisi de SELECT ifadeleriyle oluşturulan ve sorgulara mantıksal tablolar olarak sunulan sanal tablolardır. Görünümler ortak veri hesaplamasının karmaşıklığını ortaya koyuyor ve sorguları yeniden yazmaya gerek kalmaması için hesaplama değişikliklerine bir soyutlama katmanı ekliyor.
Standart görünüm, görünüm her kullanıldığında verilerini hesaplar. Diskte depolanan veri yok. İnsanlar genellikle standart görünümleri veritabanındaki mantıksal nesneleri ve sorguları düzenlemeye yardımcı olan bir araç olarak kullanır. Standart görünüm kullanmak için sorguya doğrudan başvuruda bulunılması gerekir.
Gerçekleştirilmiş görünüm, verilerini tıpkı bir tablo gibi ayrılmış SQL havuzunda önceden hesaplar, depolar ve korur. Gerçekleştirilmiş bir görünüm her seferinde kullanıldığında yeniden hesaplama gerekmez. Bu nedenle gerçekleştirilmiş görünümlerde verilerin tümünü veya bir alt kümesini kullanan sorgular daha hızlı performans elde edebilir. Daha da iyisi, sorgular doğrudan atıfta bulunmadan gerçekleşmiş bir görünüm kullanabilir, bu nedenle uygulama kodunu değiştirmenize gerek kalmaz.
Standart görünüm gereksinimlerinin çoğu hala maddileştirilmiş görünüm için geçerlidir. Gerçekleştirilmiş görünüm sözdizimi ve diğer gereksinimlerle ilgili ayrıntılar için CREATE MATERIALIZED VIEW AS SELECTögesine bakın.
| Karşılaştırma | Görüntüle | Gerçekleştirilmiş Görünüm |
|---|---|---|
| Tanımı görüntüle | Azure veri ambarında depolanır. | Azure veri ambarında depolanır. |
| İçeriği görüntüleme | Görünüm her kullanıldığında oluşturulur. | Görünüm oluşturma sırasında azure veri ambarında önceden işlenir ve depolanır. Altta yatan tablolara veri eklendikçe güncelleniyor. |
| Veri yenileme | Her zaman güncelleştirildi | Her zaman güncelleştirildi |
| Karmaşık sorgulardan görünüm verilerini alma hızı | Yavaş | Hızlı |
| Ek depolama alanı | Hayı | Evet |
| Sözdizimi | GÖRÜNÜM YARAT | SELECT İLE MALZEMELİ GÖRÜNÜM OLUŞTUR |
Gerçekleştirilmiş görünümlerin avantajları
Düzgün tasarlanmış bir gerçekleştirilmiş görünüm aşağıdaki avantajları sağlar:
JOIN'ler ve toplama işlevleri ile karmaşık sorgular için azaltılmış yürütme süresi. Sorgu ne kadar karmaşık olursa yürütme süresi tasarrufu olasılığı o kadar yüksek olur. En avantaj, sorgunun hesaplama maliyeti yüksek olduğunda ve sonuçta elde edilen veri kümesi küçük olduğunda elde edilir.
Ayrılmış SQL havuzundaki sorgu iyileştiricisi, sorgu yürütme planlarını geliştirmek için dağıtılan gerçekleştirilmiş görünümleri otomatik olarak kullanabilir. Bu işlem daha hızlı sorgu performansı sağlayan kullanıcılar için saydamdır ve gerçekleştirilmiş görünümlere doğrudan başvuru yapmak için sorgu gerektirmez.
Görüntüler için düşük bakım gerektirir. Gerçekleştirilmiş bir görünüm, verileri iki yerde depolar: ilk veriler için görünüm oluşturulma sırasında kullanılan kümelenmiş sütun deposu dizini ve artımlı veri değişiklikleri için bir delta deposu. Temel tablolardaki tüm veri değişiklikleri otomatik olarak zaman uyumlu bir şekilde delta deposuna eklenir. Arka plan süreci (tuple taşıyıcı), verileri periyodik olarak delta deposundan görünümün sütun deposu dizinine taşır. Bu tasarım, gerçekleştirilmiş görünümlerin sorgulanmasıyla temel tabloların doğrudan sorgulanmasıyla aynı verilerin döndürülmesini sağlar.
Gerçekleştirilmiş görünümdeki veriler temel tablolardan farklı şekilde dağıtılabilir.
Gerçekleştirilmiş görünümlerdeki veriler, normal tablolardaki veriyle aynı yüksek kullanılabilirlik ve dayanıklılık avantajlarını alır.
Diğer veri ambarı sağlayıcılarıyla karşılaştırıldığında, ayrılmış SQL havuzunda uygulanan gerçekleştirilmiş görünümler de aşağıdaki ek avantajları sağlar:
- Temel tablolardaki veri değişiklikleriyle otomatik ve zaman uyumlu veri yenileme. Kullanıcı eylemi gerekmez.
- Geniş toplama işlevi desteği. Bkz . CREATE MATERIALIZED VIEW AS SELECT (Transact-SQL).
- Sorguya özgü materyalleştirilmiş görünüm önerisi desteği. Bkz. EXPLAIN (Transact-SQL).
Yaygın senaryolar
Gerçekleştirilmiş görünümler genellikle aşağıdaki senaryolarda kullanılır:
Büyük boyutlu verilerde karmaşık analitik sorguların performansını geliştirme ihtiyacı
Karmaşık analitik sorgular genellikle daha fazla toplama işlevi ve tablo birleştirmesi kullanır ve bu da sorgu yürütmede karıştırmalar ve birleştirmeler gibi daha yoğun işlem gerektiren işlemlere neden olur. Bu nedenle, özellikle büyük tablolarda bu sorguların tamamlanması daha uzun sürer.
Kullanıcılar sorguların ortak hesaplamalarından döndürülen veriler için gerçekleştirilmiş görünümler oluşturabilir, bu nedenle sorgular için bu verilere ihtiyaç duyulduğunda yeniden derleme gerekmez ve böylece daha düşük işlem maliyeti ve daha hızlı sorgu yanıtı sağlanır.
Sorgu değişiklikleri yapmadan veya en az değişiklikle daha hızlı performans arıyorsanız
Normal ETL işlemlerini ve raporlamasını desteklemek için veri ambarlarındaki şema ve sorgu değişiklikleri genellikle en düşük düzeyde tutulur. Kişiler, malzeme edilmiş görünümlerin maliyeti, sorgu performansındaki artışla dengelenebiliyorsa, sorgu performansını ayarlamak için bu görünümleri kullanabilirler.
Başka ayarlama seçenekleri olan ölçeklendirme ve istatistik yönetimine kıyasla, materyalize edilmiş bir görünüm oluşturmak ve korumak üretim üzerinde çok daha az etkili bir değişikliktir ve potansiyel performans kazancı da daha fazla olabilir.
- Gerçekleştirilmiş görünümlerin oluşturulması veya bakımının gerçekleştirilmesi, temel tablolarda çalıştırılan sorguları etkilemez.
- Sorgu iyileştiricisi, bir sorguda doğrudan görünüm başvurusu olmadan dağıtılan materyalize görünümleri otomatik olarak kullanabilir. Bu özellik, performans ayarlamada sorgu değişikliği gereksinimini azaltır.
Daha hızlı sorgu performansı için farklı veri dağıtım stratejisi gerekiyor
Azure veri ambarı dağıtılmış ve yüksek düzeyde paralel işleme (MPP) sistemidir.
Synapse SQL, kuruluşların veri mühendislerine tanıdık standart T-SQL deneyimlerini kullanarak veri ambarı ve veri sanallaştırma senaryoları uygulamasına olanak tanıyan dağıtılmış bir sorgu sistemidir. Ayrıca akış ve makine öğrenmesi senaryolarını ele almak için SQL'in özelliklerini genişletir. Veri ambarı tablosundaki veriler, üç dağıtım stratejisinden ( karma, round_robin veya çoğaltılmış) biri kullanılarak 60 düğüm arasında dağıtılır.
Veri dağıtımı tablo oluşturma zamanında belirtilir ve tablo bırakılana kadar değişmeden kalır. Gerçekleştirilmiş görünüm, disk üzerindeki sanal bir tablo olarak, karma ve round_robin veri dağıtımlarını destekler. Kullanıcılar, temel tablolardan farklı ancak sık sık görünümleri kullanan sorguların performansı için en uygun olan veri dağıtımını seçebilir.
Tasarım kılavuzu
Sorgu performansını geliştirmek için gerçekleştirilmiş görünümleri kullanmayla ilgili genel yönergeler aşağıda verilmiştir:
İş yükünüz için Tasarımı
Gerçekleştirilmiş görünümler oluşturmaya başlamadan önce sorgu desenleri, önem derecesi, sıklık ve sonuçta elde edilen verilerin boyutu açısından iş yükünüzü derinlemesine anlamanız önemlidir.
Kullanıcılar, sorgu iyileştirici tarafından önerilen gerçekleştirilmiş görünümler için EXPLAIN WITH_RECOMMENDATIONS <SQL_statement> komutunu çalıştırabilir. Bu öneriler sorguya özgü olduğundan, tek bir sorgudan yararlanan gerçekleştirilmiş bir görünüm aynı iş yükündeki diğer sorgular için en uygun olmayabilir.
İş yükü gereksinimlerinizi göz önünde bulundurarak bu önerileri değerlendirin. İdeal gerçekleştirilmiş görünümler, iş yükünün performansını artıran görünümlerdir.
Daha hızlı sorgular ile maliyet arasındaki dengeyi unutmayın
Gerçekleştirilmiş her görünüm için bir veri depolama maliyeti ve görünümün bakımının maliyeti vardır. Temel tablolarda veriler değiştikçe, gerçekleştirilmiş görünümün boyutu artar ve fiziksel yapısı da değişir.
Sorgu performansında düşüşü önlemek için, her materyalize edilmiş görünüm, satırları delta deposundan columnstore dizin segmentlerine taşıma ve veri değişikliklerini birleştirme dahil olmak üzere veri ambarı motoru tarafından ayrı ayrı tutulur.
Gerçekleştirilmiş görünüm sayısı ve temel tablo değişiklikleri arttığında bakım iş yükü daha yüksektir. Kullanıcılar, tüm maddileştirilmiş görünümlerden kaynaklanan maliyetin sorgu performansındaki artışla dengelenip dengelenmediğini kontrol etmelidir.
Veritabanındaki gerçekleştirilmiş görünüm listesi için bu sorguyu çalıştırabilirsiniz:
SELECT V.name as materialized_view, V.object_id
FROM sys.views V
JOIN sys.indexes I ON V.object_id= I.object_id AND I.index_id < 2;
Malzemeleşmiş görünüm sayısını azaltma yöntemleri:
İş yükünüzdeki karmaşık sorgular tarafından sık kullanılan yaygın veri kümelerini belirleyin. İyileştiricinin yürütme planları oluştururken bunları yapı taşları olarak kullanabilmesi için bu veri kümelerini depolamak için gerçekleştirilmiş görünümler oluşturun.
Kullanımı düşük veya artık gerekli olmayan gerçekleştirilmiş görünümleri silin. Devre dışı bırakılmış gerçekleştirilmiş görünüm korunmaz, ancak yine de depolama maliyetine neden olur.
Verileri çakışmasa bile aynı veya benzer temel tablolarda oluşturulan malzemeleşmiş görünümleri birleştirin. Gerçekleştirilmiş görünümlerin birleştirilmesi, ayrı görünümlerin toplamından daha büyük bir görünüme neden olabilir, ancak görünüm bakım maliyeti azaltılmalıdır. Örneğin:
-- Query 1 would benefit from having a materialized view created with this SELECT statement
SELECT A, SUM(B)
FROM T
GROUP BY A
-- Query 2 would benefit from having a materialized view created with this SELECT statement
SELECT C, SUM(D)
FROM T
GROUP BY C
-- You could create a single materialized view of this form
SELECT A, C, SUM(B), SUM(D)
FROM T
GROUP BY A, C
Tüm performans ayarlamaları için sorgu değişikliği gerekmez
Veri ambarı iyileştiricisi, sorgu performansını geliştirmek için dağıtılan gerçekleştirilmiş görünümleri otomatik olarak kullanabilir. Bu destek, görünümlere başvurmayan sorgulara ve materyalize görünüm oluşturmada desteklenmeyen toplamaları kullanan sorgulara saydam olarak uygulanır. Sorgu değişikliği gerekmez. Bir sorgunun tahmini yürütme planını kontrol ederek gerçekleştirilmiş bir görünümün kullanılıp kullanılmadığını doğrulayabilirsiniz.
- Gerçek yürütme planını alma hakkında daha fazla bilgi için bkz. DMV'leri kullanarak Azure Synapse Analytics ayrılmış SQL havuzu iş yükünü izleyin.
- SQL Server Management Studio (SSMS) veya SET SHOWPLAN_XMLaracılığıyla tahmini yürütme planını alabilirsiniz.
Gerçekleştirilmiş görünümleri izleyin
Gerçekleştirilmiş görünüm, kümelenmiş columnstore dizini (CCI) içeren bir tablo gibi veri ambarında depolanır. Gerçekleştirilmiş görünümden veri okuması, dizini taramayı ve delta deposundan değişiklik uygulamayı içerir. Delta deposundaki satır sayısı çok yüksek olduğunda, gerçekleştirilmiş bir görünümden sorguyu çözümlemek, temel tabloları doğrudan sorgulamaktan daha uzun sürebilir.
Sorgu performansı düşüşünü önlemek için, DBCC PDW_SHOWMATERIALIZEDVIEWOVERHEAD komutunu çalıştırarak görünümün overhead_ratio'sunu (total_rows / base_view_row) izlemek iyi bir uygulamadır. overhead_ratio çok yüksekse, değişim deposundaki tüm satırların columnstore dizinine taşınması için maddileştirilmiş görünümü yeniden oluşturmayı düşünün.
Gerçekleştirilmiş görünüm ve sonuç kümesi önbelleğe alma
Bu iki özellik, sorgu performansı ayarlama için ayrılmış SQL havuzunda yaklaşık aynı zamanda kullanıma sunulmuştur. Sonuç kümesi önbelleğe alma, statik verilere karşı yinelenen sorgulardan yüksek eşzamanlılık ve hızlı yanıt süreleri elde etmek için kullanılır.
Önbelleğe alınan sonucu kullanmak için önbellek isteyen sorgunun biçimi, önbelleği oluşturan sorguyla eşleşmelidir. Ayrıca, önbelleğe alınan sonuç sorgunun tamamına uygulanmalıdır.
Gerçekleştirilmiş görünümler temel tablolarda veri değişikliklerine izin verir. Gerçekleştirilmiş görünümlerdeki veriler sorgunun bir parçasına uygulanabilir. Bu destek, aynı gerçekleştirilmiş görünümlerin daha hızlı performans için bazı hesaplamaları paylaşan farklı sorgular tarafından kullanılmasını sağlar.
Örnek
Bu örnek, katalog aracılığıyla mağazalardan daha fazla para harcayan müşterileri bulan TPCDS benzeri bir sorgu kullanır. Ayrıca tercih edilen müşterileri ve ülkelerini/kaynak bölgelerini de tanımlar. Sorgu, SUM() ve GROUP BY içeren üç alt SELECT deyiminin UNION'ından TOP 100 kayıtlarının seçilmesini içerir.
WITH year_total AS (
SELECT c_customer_id customer_id
,c_first_name customer_first_name
,c_last_name customer_last_name
,c_preferred_cust_flag customer_preferred_cust_flag
,c_birth_country customer_birth_country
,c_login customer_login
,c_email_address customer_email_address
,d_year dyear
,sum(isnull(ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt+ss_ext_sales_price, 0)/2) year_total
,'s' sale_type
FROM customer
,store_sales
,date_dim
WHERE c_customer_sk = ss_customer_sk
AND ss_sold_date_sk = d_date_sk
GROUP BY c_customer_id
,c_first_name
,c_last_name
,c_preferred_cust_flag
,c_birth_country
,c_login
,c_email_address
,d_year
UNION ALL
SELECT c_customer_id customer_id
,c_first_name customer_first_name
,c_last_name customer_last_name
,c_preferred_cust_flag customer_preferred_cust_flag
,c_birth_country customer_birth_country
,c_login customer_login
,c_email_address customer_email_address
,d_year dyear
,sum(isnull(cs_ext_list_price-cs_ext_wholesale_cost-cs_ext_discount_amt+cs_ext_sales_price, 0)/2) year_total
,'c' sale_type
FROM customer
,catalog_sales
,date_dim
WHERE c_customer_sk = cs_bill_customer_sk
AND cs_sold_date_sk = d_date_sk
GROUP BY c_customer_id
,c_first_name
,c_last_name
,c_preferred_cust_flag
,c_birth_country
,c_login
,c_email_address
,d_year
UNION ALL
SELECT c_customer_id customer_id
,c_first_name customer_first_name
,c_last_name customer_last_name
,c_preferred_cust_flag customer_preferred_cust_flag
,c_birth_country customer_birth_country
,c_login customer_login
,c_email_address customer_email_address
,d_year dyear
,sum(isnull(ws_ext_list_price-ws_ext_wholesale_cost-ws_ext_discount_amt+ws_ext_sales_price, 0)/2) year_total
,'w' sale_type
FROM customer
,web_sales
,date_dim
WHERE c_customer_sk = ws_bill_customer_sk
AND ws_sold_date_sk = d_date_sk
GROUP BY c_customer_id
,c_first_name
,c_last_name
,c_preferred_cust_flag
,c_birth_country
,c_login
,c_email_address
,d_year
)
SELECT TOP 100
t_s_secyear.customer_id
,t_s_secyear.customer_first_name
,t_s_secyear.customer_last_name
,t_s_secyear.customer_birth_country
FROM year_total t_s_firstyear
,year_total t_s_secyear
,year_total t_c_firstyear
,year_total t_c_secyear
,year_total t_w_firstyear
,year_total t_w_secyear
WHERE t_s_secyear.customer_id = t_s_firstyear.customer_id
AND t_s_firstyear.customer_id = t_c_secyear.customer_id
AND t_s_firstyear.customer_id = t_c_firstyear.customer_id
AND t_s_firstyear.customer_id = t_w_firstyear.customer_id
AND t_s_firstyear.customer_id = t_w_secyear.customer_id
AND t_s_firstyear.sale_type = 's'
AND t_c_firstyear.sale_type = 'c'
AND t_w_firstyear.sale_type = 'w'
AND t_s_secyear.sale_type = 's'
AND t_c_secyear.sale_type = 'c'
AND t_w_secyear.sale_type = 'w'
AND t_s_firstyear.dyear+0 = 1999
AND t_s_secyear.dyear+0 = 1999+1
AND t_c_firstyear.dyear+0 = 1999
AND t_c_secyear.dyear+0 = 1999+1
AND t_w_firstyear.dyear+0 = 1999
AND t_w_secyear.dyear+0 = 1999+1
AND t_s_firstyear.year_total > 0
AND t_c_firstyear.year_total > 0
AND t_w_firstyear.year_total > 0
AND CASE WHEN t_c_firstyear.year_total > 0 THEN t_c_secyear.year_total / t_c_firstyear.year_total ELSE NULL END
> CASE WHEN t_s_firstyear.year_total > 0 THEN t_s_secyear.year_total / t_s_firstyear.year_total ELSE NULL END
AND CASE WHEN t_c_firstyear.year_total > 0 THEN t_c_secyear.year_total / t_c_firstyear.year_total ELSE NULL END
> CASE WHEN t_w_firstyear.year_total > 0 THEN t_w_secyear.year_total / t_w_firstyear.year_total ELSE NULL END
ORDER BY t_s_secyear.customer_id
,t_s_secyear.customer_first_name
,t_s_secyear.customer_last_name
,t_s_secyear.customer_birth_country
OPTION ( LABEL = 'Query04-af359846-253-3');
sorgunun tahmini yürütme planınıdenetleyin. Yürütülmesi daha fazla zaman alan 18 karıştırma ve 17 birleştirme işlemi vardır.
Şimdi üç alt-SELECT ifadesinin her biri için bir maddi görünüm oluşturalım.
CREATE materialized view nbViewSS WITH (DISTRIBUTION=HASH(customer_id)) AS
SELECT c_customer_id customer_id
,c_first_name customer_first_name
,c_last_name customer_last_name
,c_preferred_cust_flag customer_preferred_cust_flag
,c_birth_country customer_birth_country
,c_login customer_login
,c_email_address customer_email_address
,d_year dyear
,sum(isnull(ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt+ss_ext_sales_price, 0)/2) year_total
, count_big(*) AS cb
FROM dbo.customer
,dbo.store_sales
,dbo.date_dim
WHERE c_customer_sk = ss_customer_sk
AND ss_sold_date_sk = d_date_sk
GROUP BY c_customer_id
,c_first_name
,c_last_name
,c_preferred_cust_flag
,c_birth_country
,c_login
,c_email_address
,d_year
GO
CREATE materialized view nbViewCS WITH (DISTRIBUTION=HASH(customer_id)) AS
SELECT c_customer_id customer_id
,c_first_name customer_first_name
,c_last_name customer_last_name
,c_preferred_cust_flag customer_preferred_cust_flag
,c_birth_country customer_birth_country
,c_login customer_login
,c_email_address customer_email_address
,d_year dyear
,sum(isnull(cs_ext_list_price-cs_ext_wholesale_cost-cs_ext_discount_amt+cs_ext_sales_price, 0)/2) year_total
, count_big(*) as cb
FROM dbo.customer
,dbo.catalog_sales
,dbo.date_dim
WHERE c_customer_sk = cs_bill_customer_sk
AND cs_sold_date_sk = d_date_sk
GROUP BY c_customer_id
,c_first_name
,c_last_name
,c_preferred_cust_flag
,c_birth_country
,c_login
,c_email_address
,d_year
GO
CREATE materialized view nbViewWS WITH (DISTRIBUTION=HASH(customer_id)) AS
SELECT c_customer_id customer_id
,c_first_name customer_first_name
,c_last_name customer_last_name
,c_preferred_cust_flag customer_preferred_cust_flag
,c_birth_country customer_birth_country
,c_login customer_login
,c_email_address customer_email_address
,d_year dyear
,sum(isnull(ws_ext_list_price-ws_ext_wholesale_cost-ws_ext_discount_amt+ws_ext_sales_price, 0)/2) year_total
, count_big(*) AS cb
FROM dbo.customer
,dbo.web_sales
,dbo.date_dim
WHERE c_customer_sk = ws_bill_customer_sk
AND ws_sold_date_sk = d_date_sk
GROUP BY c_customer_id
,c_first_name
,c_last_name
,c_preferred_cust_flag
,c_birth_country
,c_login
,c_email_address
,d_year
Özgün sorgunun yürütme planını yeniden denetleyin. Birleştirme sayısı şimdi 17'den 5'e değişiyor ve artık karıştırma yapılmıyor. Plandaki Filtre işlemi simgesini seçin. Çıktı Listesi, verilerin temel tablolar yerine gerçekleştirilmiş görünümlerden okunduğunu gösterir.
Gerçekleştirilmiş görünümlerle aynı sorgu, kod değişikliği olmadan çok daha hızlı çalışır.
Sonraki adımlar
Daha fazla geliştirme ipucu için bkz . Synapse SQL geliştirmeye genel bakış.
- DMV'leri kullanarak Azure Synapse Analytics ayrılmış SQL havuzu iş yükünüzü izleyin.
- Tahmini yürütme planını görüntüle