Paralellik (Yeniden Bölümleme Akışları) İşleci Neden Satır Tahminlerini 1'e İndirir?


12

SQL Server 2012 Enterprise kullanıyorum. Tamamen sezgisel bulamadığım bazı davranışlar sergileyen bir SQL Planı ile karşılaştım. Ağır bir Paralel Dizin Tarama işleminden sonra, bir Paralellik (Bölümleme Akımları) işlemi gerçekleşir, ancak Dizin Taraması (Object10.Index2) tarafından döndürülen satır tahminlerini öldürerek tahmini 1'e düşürür. bu davranışı açıklayan hiçbir şeyle karşılaşmadım. Sorgu oldukça basittir, ancak tabloların her biri düşük milyonlarda kayıtlar içerir. Bu, DWH yükleme işleminin bir parçasıdır ve bu ara veri kümesine birkaç kez dokunulur, ancak sahip olduğum soru özellikle satır tahminleriyle ilgilidir. Birisi Paralellik (Tekrar Bölümleri) operatöründe neden doğru satır tahminlerinin 1'e gittiğini açıklayabilir mi? Ayrıca,

Planın Yapıştırılması için tüm planı yayınladım .

Söz konusu işlem şu şekildedir:

resim açıklamasını buraya girin

Daha fazla bağlam eklenmesi durumunda Plan Ağacı'nı dahil etmek:

resim açıklamasını buraya girin

Ben bazı varyasyon içine çalışıyor olabilir bu Bağlan öğesine Paul White'ın (blogunda daha derinlemesine explination tarafından açılan burada )? En azından, oyunda TOP operatörü olmasa bile, koştuğum şeye bile yakın gibi görünen tek şey buldum.

Yanıtlar:


9

Bitmap filtreleriyle sorgu planlarının okunması bazen zor olabilir. Gönderen yeniden bölme akışları için BOL makalesinde (vurgu benim):

Repartition Streams operatörü birden fazla akış tüketir ve birden fazla kayıt akışı üretir. Kayıt içeriği ve biçimi değiştirilmez. Sorgu iyileştirici bir bitmap filtresi kullanıyorsa, çıkış akışındaki satır sayısı azalır.

Ayrıca , bitmap filtreleriyle ilgili bir makale de yararlıdır:

Bitmap filtrelemesi içeren bir yürütme planını analiz ederken, verilerin plandan nasıl aktığını ve filtrelemenin nerede uygulandığını anlamak önemlidir. Bitmap filtresi ve optimize edilmiş bitmap, karma birleştirmenin oluşturma girdisi (boyut tablosu) tarafında oluşturulur; bununla birlikte, gerçek filtreleme tipik olarak karma birleştirmenin prob girişi (olgu tablosu) tarafında bulunan Paralellik operatörü içinde yapılır. Ancak, bitmap filtresi bir tamsayı sütununu temel aldığında, filtre Paralellik işleci yerine doğrudan ilk tabloya veya dizin tarama işlemine uygulanabilir. Bu tekniğe sıralı optimizasyon denir.

Sorgunuzla gözlemlediğiniz şeyin bu olduğuna inanıyorum. Bitmap operatörü IN_ROWolgu tablosuna karşı olsa bile, bir kardinalite tahminini azaltan bir yeniden bölümleme akışı operatörü göstermek için nispeten basit bir demo bulmak mümkündür . Veri hazırlama:

create table outer_tbl (ID BIGINT NOT NULL);

INSERT INTO outer_tbl WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

create table inner_tbl_1 (ID BIGINT NULL);
create table inner_tbl_2 (ID BIGINT NULL);

INSERT INTO inner_tbl_1 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

INSERT INTO inner_tbl_2 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

İşte çalıştırmamanız gereken bir sorgu:

SELECT *
FROM outer_tbl o
INNER JOIN inner_tbl_1 i ON o.ID = i.ID
INNER JOIN inner_tbl_2 i2 ON o.ID = i2.ID
OPTION (HASH JOIN, QUERYTRACEON 9481, QUERYTRACEON 8649);

Planı yükledim . Aşağıdaki operatöre bir göz atın inner_tbl_2:

bölüm kaybeden satırlar

İkinci testi Paul White tarafından Nullable Columns'taki Hash Joins'te de faydalı bulabilirsiniz.

Satır azaltmanın nasıl uygulandığı konusunda bazı tutarsızlıklar vardır. Ben sadece en az üç tablo ile bir plan görmek mümkün. Ancak, doğru veri dağıtımında beklenen satırlardaki azalma makul görünmektedir. Olgu tablosundaki birleştirilmiş sütunun, boyut tablosunda bulunmayan birçok tekrarlanan değere sahip olduğunu varsayalım. Bir bitmap filtresi, birleştirmeye ulaşmadan önce bu satırları kaldırabilir. Sorgunuz için tahmin 1'e kadar azaltılır. Satırların karma işlevi arasında nasıl dağıtıldığı iyi bir ipucu sağlar:

sıra dağılımı

Buna dayanarak, Object1.Column21sütun için tekrarlanan birçok değer olduğundan şüpheleniyorum . Tekrarlanan sütunlar için istatistik histogramında olmazsa Object4.Column19SQL Server kardinalite tahmin çok yanlış alabilir.

Sorgunun performansını artırmak mümkün olabileceğinden endişelenmeniz gerektiğini düşünüyorum. Tabii ki, sorgu yanıt süresi veya SLA gereksinimlerini karşılıyorsa, daha fazla araştırmaya değmeyebilir. Ancak, daha fazla araştırma yapmak isterseniz, sorgu iyileştiricinin daha iyi bilgi içeriyorsa daha iyi bir plan seçip seçmeyeceği hakkında bir fikir edinmek için yapabileceğiniz birkaç şey vardır (istatistikleri güncellemek dışında). Arasında birleştirme Sen sonuçlarını koyabilirsiniz Database1.Schema1.Object10ve Database1.Schema1.Object11geçici tabloya ve iç içe geçmiş bir döngü birleştirmeler almaya devam olmadığını görmek. LEFT OUTER JOINSorgu optimize edicinin bu adımdaki satır sayısını azaltmaması için bu birleşimi bir şekilde değiştirebilirsiniz . MAXDOP 1Ne olduğunu görmek için sorgunuza bir ipucu ekleyebilirsiniz . KullanabilirsinTOPbirleşmeyi son gitmeye zorlamak için türetilmiş bir tabloyla birlikte, hatta sorguyu birleştirmeyi bile yorumlayabilirsiniz. Umarım bu öneriler başlamanız için yeterlidir.

Sorudaki bağlantı öğesi ile ilgili olarak, sorunuzla ilgili olması muhtemel değildir. Bu sorunun kötü satır tahminleri ile bir ilgisi yoktur. Sahne arkasındaki sorgu planında çok fazla satırın işlenmesine neden olan bir paralellik koşulu ile ilgilidir. Burada sorgunuz ekstra bir iş yapmıyor gibi görünüyor.


6

Buradaki temel sorun, ilk birleşmenin sonucu için kötü bir kardinalite tahminidir. Bu birçok nedenden ötürü ortaya çıkabilir, ancak çoğu zaman ya optimizasyonun varsayılan modelinin bağımsız olduğunu varsaydığı ya güncelliğini yitirmiş istatistikler ya da bir dizi ilişkili birleşim öngörüsüdür.

İkinci durumda, Düzeltme: SQL Server 2008 veya SQL Server 2008 R2 veya SQL Server 2012'de ilişkili AND tahminleri içeren bir sorgu çalıştırdığınızda düşük performans, desteklenen izleme bayrağı 4137 kullanılarak ilgili olabilir. iyileştirici düzeltmelerini etkinleştirmek için 4199 numaralı izleme bayrağı ve / veya modelleme uzantılarını etkinleştirmek için 2301. Anonimleştirilmiş bir plan temelinde bilmek zordur.

Bitmap'in varlığı, birleştirme işleminin kardinalite tahminini doğrudan etkilemez, ancak erken yarı eklem azaltma uygulayarak etkisini daha erken görünür hale getirir. Bitmap olmasaydı, ilk birleştirme için kardinalite tahmini aynı olurdu ve planın geri kalanı yine de buna göre optimize edilecekti.

Merak ediyorsanız, bir test sisteminde izleme bayrağı 7498 ile sorgu için bitmap'leri devre dışı bırakabilirsiniz. Ayrıca optimize edilmiş bitmap'leri (optimize edici tarafından dikkate alınan ve kardinalite tahminlerini etkileyen) devre dışı bırakarak optimizasyon sonrası bitmap'lerle (dikkate alınmaz) 7497 ve 7498 izleme bayraklarının bir kombinasyonu ile optimizasyon tarafından, kardinalite üzerinde bir etkisi yoktur). Bir üretim sisteminde kullanım için belgelenmemiştir veya desteklenmemektedir, ancak optimize edicinin normal olarak düşünebileceği planlar üretmektedir ve bu nedenle bir plan rehberi.

Bunların hiçbiri, yukarıda belirtildiği gibi ilk katılım için kötü tahminin temel sorununu çözmeyecektir, bu yüzden gerçekten sadece çıkarları için söz ediyorum.

Bitmap'ler ve hash birleşimleri hakkında daha fazla okuma:


0

Twitter'da sana cevap verdi. Ekteki XML'ye baktım ve dengesiz paralellik gördüm. 1 iş parçacığında neredeyse tüm gerçek satırlar bulunurken diğerlerinin çoğunda yoktur. Bu dengesiz paralellik çığlık atıyor. Bu nedenle, anahtar / birleştirme değeri ve ilgili istatistik ve kardinalliği inceleyeceğim.

Diğer fikrinize göre, yapıştırılan planınız gördüğüm hiçbir yerde TOP içermediğinden, Connect öğesinin geçerli olduğundan emin değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.