Ayrılmış SQL Havuzundaki yavaş sorgu sorunlarını giderme
Şunlar için geçerlidir: Azure Synapse Analytics
Bu makale, Azure Synapse Analytics ayrılmış SQL havuzundaki sorgularla ilgili yaygın performans sorunlarının nedenlerini belirlemenize ve azaltmalar uygulamanıza yardımcı olur.
Sorunu gidermek için adımları izleyin veya Azure Data Studio aracılığıyla not defterindeki adımları yürütun. İlk üç adım, bir sorgunun yaşam döngüsünü açıklayan telemetri toplama işleminde size yol gösterir. Makalenin sonundaki başvurular, toplanan verilerde bulunan olası fırsatları çözümlemenize yardımcı olur.
Not
Bu not defterini açmayı denemeden önce yerel makinenizde Azure Data Studio'yu yüklediğinizden emin olun. Yüklemek için Azure Data Studio'yu yüklemeyi öğrenin bölümüne gidin.
Önemli
Bildirilen performans sorunlarının çoğu şunlardan kaynaklanıyor:
- Eski istatistikler
- İyi durumda olmayan kümelenmiş columnstore dizinleri (CCI)
Sorun giderme süresinden tasarruf etmek için istatistiklerin oluşturulduğundan ve güncel olduğundan veCCI'lerin yeniden oluşturulduğundan emin olun.
1. Adım: request_id tanımlama (QID olarak da bilinir)
request_id
Yavaş sorgunun nedeni, yavaş sorgunun olası nedenlerini araştırmak için gereklidir. Sorun gidermek istediğiniz sorguyu tanımlamak için başlangıç noktası olarak aşağıdaki betiği kullanın. Yavaş sorgu tanımlandıktan sonra değeri not edin request_id
.
-- Monitor active queries
SELECT *
FROM sys.dm_pdw_exec_requests
WHERE [status] NOT IN ('Completed','Failed','Cancelled')
AND session_id <> session_id()
-- AND [label] = '<YourLabel>'
-- AND resource_allocation_percentage is not NULL
ORDER BY submit_time DESC;
-- Find top 10 longest running queries
SELECT TOP 10 *
FROM sys.dm_pdw_exec_requests
ORDER BY total_elapsed_time DESC;
Yavaş sorguları daha iyi hedeflemek için betiği çalıştırırken aşağıdaki ipuçlarını kullanın:
Sonuç kümesinin en üstünde en uzun süre çalışan sorgulara sahip olmak için veya
total_elapsed_time DESC
ölçütüne göresubmit_time DESC
sıralayın.Sorgularınızda kullanın
OPTION(LABEL='<YourLabel>')
ve sonra bunları tanımlamak için sütunu filtreleyinlabel
.Hedef deyiminin bir toplu işte bulunduğunu bildiğinizde değeri
resource_allocation_percentage
olmayan QID'leri filtrelemeyi göz önünde bulundurun.Not: Diğer oturumlar tarafından engellenen bazı sorguları da filtreleyeebileceği için bu filtreye dikkat edin.
2. Adım: Sorgunun nerede zaman aldığını belirleme
Sorgunun performans sorununa neden olabilecek adımı bulmak için aşağıdaki betiği çalıştırın. Betikteki değişkenleri aşağıdaki tabloda açıklanan değerlerle güncelleştirin.
@ShowActiveOnly
Dağıtılmış planın tam resmini almak için değeri 0 olarak değiştirin. Sonuç kümesinden StepIndex
tanımlanan yavaş adımın , Phase
ve Description
değerlerini not alın.
Parametre | Açıklama |
---|---|
@QID |
1. request_id Adımda elde edilen değer |
@ShowActiveOnly |
0 - Sorgu için tüm adımları göster 1 - Yalnızca şu anda etkin olan adımı göster |
DECLARE @QID VARCHAR(16) = '<request_id>', @ShowActiveOnly BIT = 1;
-- Retrieve session_id of QID
DECLARE @session_id VARCHAR(16) = (SELECT session_id FROM sys.dm_pdw_exec_requests WHERE request_id = @QID);
-- Blocked by Compilation or Resource Allocation (Concurrency)
SELECT @session_id AS session_id, @QID AS request_id, -1 AS [StepIndex], 'Compilation' AS [Phase],
'Blocked waiting on '
+ MAX(CASE WHEN waiting.type = 'CompilationConcurrencyResourceType' THEN 'Compilation Concurrency'
WHEN waiting.type LIKE 'Shared-%' THEN ''
ELSE 'Resource Allocation (Concurrency)' END)
+ MAX(CASE WHEN waiting.type LIKE 'Shared-%' THEN ' for ' + REPLACE(waiting.type, 'Shared-', '')
ELSE '' END) AS [Description],
MAX(waiting.request_time) AS [StartTime], GETDATE() AS [EndTime],
DATEDIFF(ms, MAX(waiting.request_time), GETDATE())/1000.0 AS [Duration],
NULL AS [Status], NULL AS [EstimatedRowCount], NULL AS [ActualRowCount], NULL AS [TSQL]
FROM sys.dm_pdw_waits waiting
WHERE waiting.session_id = @session_id
AND ([type] LIKE 'Shared-%' OR
[type] in ('ConcurrencyResourceType', 'UserConcurrencyResourceType', 'CompilationConcurrencyResourceType'))
AND [state] = 'Queued'
GROUP BY session_id
-- Blocked by another query
UNION ALL
SELECT @session_id AS session_id, @QID AS request_id, -1 AS [StepIndex], 'Compilation' AS [Phase],
'Blocked by ' + blocking.session_id + ':' + blocking.request_id + ' when requesting ' + waiting.type + ' on '
+ QUOTENAME(waiting.object_type) + waiting.object_name AS [Description],
waiting.request_time AS [StartTime], GETDATE() AS [EndTime],
DATEDIFF(ms, waiting.request_time, GETDATE())/1000.0 AS [Duration],
NULL AS [Status], NULL AS [EstimatedRowCount], NULL AS [ActualRowCount],
COALESCE(blocking_exec_request.command, blocking_exec_request.command2) AS [TSQL]
FROM sys.dm_pdw_waits waiting
INNER JOIN sys.dm_pdw_waits blocking
ON waiting.object_type = blocking.object_type
AND waiting.object_name = blocking.object_name
INNER JOIN sys.dm_pdw_exec_requests blocking_exec_request
ON blocking.request_id = blocking_exec_request.request_id
WHERE waiting.session_id = @session_id AND waiting.state = 'Queued'
AND blocking.state = 'Granted' AND waiting.type != 'Shared'
-- Request Steps
UNION ALL
SELECT @session_id AS session_id, @QID AS request_id, step_index AS [StepIndex],
'Execution' AS [Phase], operation_type + ' (' + location_type + ')' AS [Description],
start_time AS [StartTime], end_time AS [EndTime],
total_elapsed_time/1000.0 AS [Duration], [status] AS [Status],
CASE WHEN estimated_rows > -1 THEN estimated_rows END AS [EstimatedRowCount],
CASE WHEN row_count > -1 THEN row_count END AS [ActualRowCount],
command AS [TSQL]
FROM sys.dm_pdw_request_steps
WHERE request_id = @QID
AND [status] = CASE @ShowActiveOnly WHEN 1 THEN 'Running' ELSE [status] END
ORDER BY StepIndex;
3. Adım: Adım ayrıntılarını gözden geçirme
Önceki adımda tanımlanan adımın ayrıntılarını gözden geçirmek için aşağıdaki betiği çalıştırın. Betikteki değişkenleri aşağıdaki tabloda açıklanan değerlerle güncelleştirin.
@ShowActiveOnly
Tüm dağıtım zamanlamalarını karşılaştırmak için değeri 0 olarak değiştirin. Dağıtım için performans sorununa neden olabilecek değeri not wait_type
alın.
Parametre | Açıklama |
---|---|
@QID |
1. request_id Adımda elde edilen değer |
@StepIndex |
2. StepIndex Adım'da tanımlanan değer |
@ShowActiveOnly |
0 - Verilen StepIndex değer için tüm dağıtımları göster1 - Verilen StepIndex değer için yalnızca şu anda etkin olan dağıtımları göster |
DECLARE @QID VARCHAR(16) = '<request_id>', @StepIndex INT = <StepIndex>, @ShowActiveOnly BIT = 1;
WITH dists
AS (SELECT request_id, step_index, 'sys.dm_pdw_sql_requests' AS source_dmv,
distribution_id, pdw_node_id, spid, 'NativeSQL' AS [type], [status],
start_time, end_time, total_elapsed_time, row_count
FROM sys.dm_pdw_sql_requests
WHERE request_id = @QID AND step_index = @StepIndex
UNION ALL
SELECT request_id, step_index, 'sys.dm_pdw_dms_workers' AS source_dmv,
distribution_id, pdw_node_id, sql_spid AS spid, [type],
[status], start_time, end_time, total_elapsed_time, rows_processed as row_count
FROM sys.dm_pdw_dms_workers
WHERE request_id = @QID AND step_index = @StepIndex
)
SELECT sr.step_index, sr.distribution_id, sr.pdw_node_id, sr.spid,
sr.type, sr.status, sr.start_time, sr.end_time,
sr.total_elapsed_time, sr.row_count, owt.wait_type, owt.wait_time
FROM dists sr
LEFT JOIN sys.dm_pdw_nodes_exec_requests owt
ON sr.pdw_node_id = owt.pdw_node_id
AND sr.spid = owt.session_id
AND ((sr.source_dmv = 'sys.dm_pdw_sql_requests'
AND sr.status = 'Running') -- sys.dm_pdw_sql_requests status
OR (sr.source_dmv = 'sys.dm_pdw_dms_requests'
AND sr.status not LIKE 'Step[CE]%')) -- sys.dm_pdw_dms_workers final statuses
WHERE sr.request_id = @QID
AND ((sr.source_dmv = 'sys.dm_pdw_sql_requests' AND sr.status =
CASE WHEN @ShowActiveOnly = 1 THEN 'Running' ELSE sr.status END)
OR (sr.source_dmv = 'sys.dm_pdw_dms_workers' AND sr.status NOT LIKE
CASE WHEN @ShowActiveOnly = 1 THEN 'Step[CE]%' ELSE '' END))
AND sr.step_index = @StepIndex
ORDER BY distribution_id
4. Adım: Tanılama ve azaltma
Derleme aşaması sorunları
2. Adımda elde edilen değerlere
Description
göre, aşağıdaki tablodan daha fazla bilgi için ilgili bölüme bakın.Açıklama Ortak Neden Compilation Concurrency
Engellendi: Derleme Eşzamanlılığı Resource Allocation (Concurrency)
Engellendi: kaynak ayırma Sorgu 1. Adımda tanımlanan "Çalışıyor" durumundaysa ancak 2. Adımda adım bilgisi yoksa aşağıdaki tablodan daha fazla bilgi almak için senaryonuza en uygun nedeni denetleyin.
Senaryo Ortak Neden Deyimi karmaşık birleştirme filtresi mantığı içerir veya yan tümcesinde WHERE
birleştirmeler gerçekleştirirKarmaşık sorgu veya daha eski JOIN söz dizimi Deyimi uzun süre çalışan DROP TABLE
veyaTRUNCATE TABLE
deyimidirUzun süre çalışan DROP TABLE veya TRUNCATE TABLE CCI'ler silinen veya açık satırların yüksek yüzdesine sahiptir (bkz. Kümelenmiş columnstore dizinlerini iyileştirme) İyi durumda olmayan CCI'ler (genel olarak) Yavaş sorgu gönderiminin hemen ardından yürütülen bir veya daha fazla
CREATE STATISTICS
deyim için 1. Adımdaki sonuç kümesini analiz edin. Aşağıdaki tabloda senaryonuza en uygun nedeni denetleyin.Senaryo Ortak Neden Beklenmedik şekilde oluşturulan istatistikler Otomatik oluşturma istatistiklerinin gecikmesi İstatistik oluşturma işlemi 5 dakika sonra başarısız oldu İstatistikleri otomatik oluşturma zaman aşımları
Engellendi: Derleme Eşzamanlılığı
Eşzamanlılık Derleme blokları nadiren oluşur. Ancak, bu tür bir blokla karşılaşırsanız, çok sayıda sorgunun kısa sürede gönderildiğini ve derlemeye başlamak için kuyruğa alındığını belirtir.
Azaltıcı etken
Eşzamanlı olarak gönderilen sorgu sayısını azaltın.
Engellendi: kaynak ayırma
Kaynak ayırmanın engellenmesi, sorgunuzun şu temellere göre yürütülmesini beklediği anlamına gelir:
- Kullanıcıyla ilişkili kaynak sınıfına veya iş yükü grubu atamasına göre verilen bellek miktarı.
- Sistem veya iş yükü grubundaki kullanılabilir bellek miktarı.
- (İsteğe bağlı) İş yükü grubu/sınıflandırıcı önemi.
Azaltıcı etken
- Engelleme oturumunun tamamlanmasını bekleyin.
- Kaynak sınıfı seçimini değerlendirin. Daha fazla bilgi için bkz. eşzamanlılık sınırları.
- Engelleme oturumunu sonlandırmanın tercih edilir olup olmadığını değerlendirin.
Karmaşık sorgu veya daha eski JOIN söz dizimi
Derleme aşaması uzun sürdüğünden varsayılan sorgu iyileştirici yöntemlerinin etkisiz olduğu bir durumla karşılaşabilirsiniz. Sorgu şu durumlarda oluşabilir:
- Çok sayıda birleştirme ve/veya alt sorgu (karmaşık sorgu) içerir.
- Yan tümcesinde
FROM
birleştiricileri kullanır (ANSI-92 stil birleşimlerini kullanmaz).
Bu senaryolar atipik olsa da, sorgu iyileştiricisinin plan seçme süresini kısaltmak için varsayılan davranışı geçersiz kılmaya yönelik seçenekleriniz vardır.
Azaltıcı etken
- ANSI-92 stil birleşimlerini kullanın.
- Sorgu ipuçları ekleyin:
OPTION(FORCE ORDER, USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'))
. Daha fazla bilgi için bkz. FORCE ORDER ve Kardinalite Tahmini (SQL Server). - Sorguyu birden çok, daha az karmaşık adıma bölün.
Uzun süre çalışan DROP TABLE veya TRUNCATE TABLE
Yürütme süresi verimlilikleri için ve TRUNCATE TABLE
deyimleri depolama DROP TABLE
temizleme işlemini bir arka plan işlemine erteler. Ancak, iş yükünüz kısa bir zaman diliminde çok sayıda DROP
/TRUNCATE TABLE
deyim gerçekleştiriyorsa, meta verilerin kalabalık hale gelmesi ve sonraki DROP
/TRUNCATE TABLE
deyimlerin yavaş yürütülmesine neden olması mümkündür.
Azaltıcı etken
Bir bakım penceresi belirleyin, tüm iş yüklerini durdurun ve DBCC SHRINKDATABASE'i çalıştırarak önceden bırakılan veya kesilmiş tabloların hemen temizlenmesini zorlar.
İyi durumda olmayan CCI'ler (genel olarak)
Kümelenmiş columnstore dizini (CCI) sistem durumu için ek meta veriler gerekir ve bu da sorgu iyileştiricisinin en uygun planı belirlemesi için daha fazla zaman almasına neden olabilir. Bu durumdan kaçınmak için tüm CCI'lerinizin iyi durumda olduğundan emin olun.
Azaltıcı etken
Ayrılmış bir SQL havuzundaki kümelenmiş columnstore dizin durumunu değerlendirin ve düzeltin.
Otomatik oluşturma istatistiklerinin gecikmesi
Otomatik istatistik oluşturma seçeneği, AUTO_CREATE_STATISTICS
sorgu iyileştiricinin iyi dağıtılmış plan kararları almasını sağlamaya yardımcı olmak için varsayılan olarak kullanılırON
. Ancak, otomatik oluşturma işleminin kendisi ilk sorgunun sonraki yürütmelerinden daha uzun sürmesini sağlayabilir.
Azaltıcı etken
Sorgunun ilk yürütülmesi tutarlı bir şekilde istatistiklerin oluşturulmasını gerektiriyorsa, sorguyu yürütmeden önce istatistikleri el ile oluşturmanız gerekir.
İstatistikleri otomatik oluşturma zaman aşımları
Otomatik istatistik oluşturma seçeneği, AUTO_CREATE_STATISTICS
sorgu iyileştiricinin iyi dağıtılmış plan kararları almasını sağlamaya yardımcı olmak için varsayılan olarak kullanılırON
. İstatistiklerin otomatik olarak oluşturulması bir SELECT deyimine yanıt olarak gerçekleşir ve tamamlanması için 5 dakikalık bir eşik vardır. Verilerin boyutu ve/veya oluşturulacak istatistik sayısı 5 dakikalık eşikten daha uzun bir süre gerektiriyorsa, sorgunun yürütülmeye devam edebilmesi için istatistiklerin otomatik olarak oluşturulması durdurulacaktır. İstatistiklerin oluşturulamaması, sorgu iyileştiricisinin verimli bir dağıtılmış yürütme planı oluşturma becerisini olumsuz etkileyebilir ve bu da sorgu performansının düşmesine neden olabilir.
Azaltıcı etken
Tanımlanan tablolar/sütunlar için otomatik oluşturma özelliğine güvenmek yerine istatistikleri el ile oluşturun .
Yürütme aşaması sorunları
2. Adım'da sonuç kümesini analiz etmek için aşağıdaki tabloyu kullanın. Senaryonuzu belirleyin ve ayrıntılı bilgi ve olası risk azaltma adımları için yaygın nedeni denetleyin.
Senaryo Ortak Neden EstimatedRowCount
/ActualRowCount
< 25%Yanlış tahminler Description
değeri gösterirBroadcastMoveOperation
ve sorgu çoğaltılmış bir tabloya başvurur.Çıkarılmamış çoğaltılmış tablolar 1. @ShowActiveOnly
= 0
2. Yüksek veya beklenmeyen sayıda adım (step_index
) gözlemlenir.
3. Birleştirici sütunlarının veri türleri tablolar arasında aynı değildir.Eşleşmeyen veri türü/boyutu 1. Değer Description
,HadoopRoundRobinOperation
veyaHadoopShuffleOperation
değerini gösterirHadoopBroadcastOperation
.
2.total_elapsed_time
Belirlistep_index
bir değeri yürütmeler arasında tutarsız.Geçici dış tablo sorguları total_elapsed_time
3. Adımda elde edilen değeri denetleyin. Belirli bir adımda birkaç dağıtımda önemli ölçüde daha yüksekse şu adımları izleyin:Her birinde aşağıdaki komutu çalıştırarak, alanında başvuruda bulunarak
TSQL
ilişkilistep_id
olan her tablonun veri dağıtımını denetleyin:DBCC PDW_SHOWSPACEUSED(<table>);
En düşük satır değeri>/<en yüksek satır değeri>> 0,1 ise <Veri dengesizliği (depolanmış) bölümüne gidin.
Aksi takdirde, Uçuş içi veri dengesizliği bölümüne gidin.
Yanlış tahminler
Sorgu iyileştiricisinin en uygun planı oluşturduğundan emin olmak için istatistiklerinizin güncel olmasını sağlayın. Tahmini satır sayısı gerçek sayılardan önemli ölçüde daha az olduğunda, istatistiklerin korunması gerekir.
Azaltıcı etken
İstatistikleri oluşturma/güncelleştirme.
Çıkarılmamış çoğaltılmış tablolar
Çoğaltılmış tablolar oluşturduysanız ve çoğaltılan tablo önbelleğini düzgün bir şekilde ısıtamazsanız, ek veri taşımaları veya en iyi durumdaki dağıtılmış bir planın oluşturulması nedeniyle beklenmeyen düşük performans ortaya çıkar.
Azaltıcı etken
- DML işlemleri sonrasında çoğaltılan önbelleği ısıtın.
- Sık sık DML işlemleri varsa, tablonun dağıtımını olarak
ROUND_ROBIN
değiştirin.
Eşleşmeyen veri türü/boyutu
Tabloları birleştirirken, birleştirme sütunlarının veri türünün ve boyutunun eşleştiğinden emin olun. Aksi takdirde, cpu, GÇ ve ağ trafiğinin kullanılabilirliğini iş yükünün geri kalanına düşürecek gereksiz veri hareketlerine neden olur.
Azaltıcı etken
Aynı veri türüne ve boyutuna sahip olmayan ilişkili tablo sütunlarını düzeltmek için tabloları yeniden derleyin.
Geçici dış tablo sorguları
Dış tablolara yönelik sorgular, verileri ayrılmış SQL havuzuna toplu yükleme amacıyla tasarlanmıştır. Dış tablolara yönelik geçici sorgular, eşzamanlı depolama kapsayıcısı etkinlikleri gibi dış faktörler nedeniyle değişken sürelerle karşılaşabilir.
Azaltıcı etken
Önce ayrılmış SQL havuzuna veri yükleyin ve ardından yüklenen verileri sorgulayın.
Veri dengesizliği (depolanmış)
Veri dengesizliği, verilerin dağıtımlar arasında eşit olarak dağıtılmıyor olduğu anlamına gelir. Dağıtılmış planın her adımı, sonraki adıma geçmeden önce tüm dağıtımların tamamlanmasını gerektirir. Verileriniz çarpıtıldığında CPU ve GÇ gibi işleme kaynaklarının tam potansiyeli elde edilemez ve bu da yürütme sürelerinin yavaşlamasına neden olur.
Azaltıcı etken
Daha uygun bir dağıtım sütunu seçiminize yardımcı olması için dağıtılmış tablolar için kılavuzumuzu gözden geçirin.
Uçuş içi veri dengesizliği
Uçuş içi veri dengesizliği, veri dengesizliği (depolanmış) sorununun bir çeşididir. Ancak, dengesiz olan disk üzerindeki verilerin dağılımı değildir. Belirli filtreler veya gruplandırılmış veriler için dağıtılmış planın doğası bir ShuffleMoveOperation
tür işlemine neden olur. Bu işlem aşağı akışta kullanılacak çarpık bir çıkış üretir.
Azaltıcı etken
- İstatistiklerin oluşturulduğu ve güncel olduğundan emin olun.
- Sütunlarınızın
GROUP BY
sırasını değiştirerek daha yüksek kardinalite sütununa sahip bir müşteri adayı oluşturun. - Birleştirmeler birden çok sütunu kapsıyorsa çok sütunlu istatistikler oluşturun.
- Sorgunuza sorgu ipucu
OPTION(FORCE_ORDER)
ekleyin. - Sorguyu yeniden düzenleme.
Bekleme türü sorunları
Yukarıdaki yaygın sorunlardan hiçbiri sorgunuz için geçerli değilse, 3. Adım verileri hangi bekleme türlerinin (ve wait_time
içindewait_type
) en uzun süre çalışan adım için sorgu işlemeyi engellediğini belirleme fırsatına sahip olur. Çok sayıda bekleme türü vardır ve benzer azaltmalar nedeniyle bunlar ilgili kategoriler halinde gruplandırılır. Sorgu adımınızın bekleme kategorisini bulmak için şu adımları izleyin:
-
wait_type
3. Adımda en çok zaman alan öğesini belirleyin. - Bekleme kategorileri eşleme tablosundaki bekleme türünü bulun ve içerdiği bekleme kategorisini belirleyin.
- Önerilen azaltmalar için aşağıdaki listeden bekleme kategorisiyle ilgili bölümü genişletin.
Derleme
Derleme kategorisinin bekleme türü sorunlarını azaltmak için şu adımları izleyin:
- Sorunlu sorguda yer alan tüm nesneler için dizinleri yeniden oluşturun.
- Sorunlu sorguda yer alan tüm nesnelerle ilgili istatistikleri güncelleştirin.
- Sorunun devam edip etmediğini doğrulamak için sorunlu sorguyu yeniden test edin.
Sorun devam ederse:
Şu .sql dosyası oluşturun:
SET QUERY_DIAGNOSTICS ON; <Your_SQL>; SET QUERY_DIAGNOSTICS OFF;
Bir Komut İstemi penceresi açın ve aşağıdaki komutu çalıştırın:
sqlcmd −S <servername>.database.windows.net −d <databasename> −U <username> −G −I −i .\<sql_file_name>.sql −y0 −o .\<output_file_name>.txt
metin düzenleyicisinde output_file_name>.txt açın<. 2. Adımda tanımlanan en uzun süre çalışan adımdan dağıtım düzeyi yürütme planlarını (ile
<ShowPlanXML>
başlayan satırlar) bulup kopyalayarak .sqlplan uzantısına sahip ayrı metin dosyalarına yapıştırın.Not: Dağıtılmış planın her adımı genellikle 60 dağıtım düzeyi yürütme planı kaydetmiş olur. Aynı dağıtılmış plan adımından yürütme planlarını hazırlayıp karşılaştırdığınızdan emin olun.
3. Adım sorgusu sık sık diğerlerinden çok daha uzun süre alan birkaç dağıtım gösterir. SQL Server Management Studio'da, uzun süre çalışan bir dağıtımın dağıtım düzeyi yürütme planlarını (oluşturulan .sqlplan dosyalarından) hızlı çalışan bir dağıtımla karşılaştırarak farkların olası nedenlerini analiz edin.
Kilit, Çalışan İş Parçacığı
- CCI yerine bir satır deposu dizinini kullanmak için sık ve küçük değişikliklerden geçen tabloları değiştirmeyi göz önünde bulundurun.
- Değişikliklerinizi toplu işleyin ve hedefi daha az sıklıkta daha fazla satırla güncelleştirin.
Arabellek GÇ, Diğer Disk GÇ, Tran Günlük GÇ
İyi Durumda Olmayan CCI'ler
İyi durumda olmayan CCI'ler artan GÇ, CPU ve bellek ayırmaya katkıda bulunur ve bu da sorgu performansını olumsuz yönde etkiler. Bu sorunu azaltmak için aşağıdaki yöntemlerden birini deneyin:
- Ayrılmış bir SQL havuzundaki kümelenmiş columnstore dizin durumunu değerlendirin ve düzeltin.
- Temel almak için Kümelenmiş columnstore dizinlerini iyileştirme bölümünde listelenen sorgunun çıkışını çalıştırın ve gözden geçirin.
- Segment kalitesini artırmak için dizinleri yeniden derleme adımlarını izleyin ve örnek sorun sorgusunda yer alan tabloları hedefleyin.
Eski istatistikler
Güncel olmayan istatistikler, gerektiğinden daha fazla veri taşımayı içeren iyileştirilmemiş bir dağıtılmış planın oluşturulmasına neden olabilir. Gereksiz veri taşıma, yalnızca bekleyen verilerinizde değil, üzerinde de tempdb
iş yükünü artırır. GÇ tüm sorgularda paylaşılan bir kaynak olduğundan performans etkileri iş yükünün tamamı tarafından hissedilebilir.
Bu durumu düzeltmek için tüm istatistiklerin güncel olduğundan ve bunların kullanıcı iş yükleri için güncel kalmasını sağlayacak bir bakım planının uygulandığından emin olun.
Ağır GÇ iş yükleri
Genel iş yükünüz büyük miktarlarda veri okuyor olabilir. Synapse ayrılmış SQL havuzları, kaynakları DWU'ya uygun olarak ölçeklendirir. Daha iyi performans elde etmek için şunlardan birini veya her ikisini de göz önünde bulundurun:
- Sorgularınız için daha büyük bir kaynak sınıfı kullanma.
- İşlem kaynaklarını artırın.
CPU, Paralellik
Senaryo | Risk azaltma |
---|---|
Kötü CCI Durumu | Ayrılmış SQL havuzunda kümelenmiş columnstore dizin durumunu değerlendirme ve düzeltme |
Kullanıcı sorguları dönüştürmeleri içerir | Biçimlendirilmiş sürümlerin depolanması için tüm biçimlendirmeyi ve diğer dönüştürme mantığını ETL işlemlerine taşıma |
İş yükünün öncelikleri yanlış belirlendi | İş yükü yalıtımı uygulama |
İş yükü için yetersiz DWU | İşlem kaynaklarını artırmayı göz önünde bulundurun |
Ağ GÇ
Sorun 2. Adımdaki bir RETURN
işlem sırasında oluşuyorsa,
- Eşzamanlı paralel işlemlerin sayısını azaltın.
- En çok etkilenen işlemin ölçeğini başka bir istemciye genişletme.
Diğer tüm veri taşıma işlemleri için ağ sorunlarının ayrılmış SQL havuzunun içinde gibi görünmesi olasıdır. Bu sorunu hızla azaltmaya çalışmak için şu adımları izleyin:
- Ayrılmış SQL havuzunuzu DW100c olarak ölçeklendirme
- İstediğiniz DWU düzeyine geri ölçeklendirin
SQL CLR
Verileri dönüştürmenin FORMAT()
alternatif bir yolunu (örneğin, CONVERT()
stille) uygulayarak işlevin sık kullanılmasından kaçının.