İç birleşimde kardinalite tahmin problemi


13

Satır tahmininin neden bu kadar korkunç olduğunu anlamak için uğraşıyorum, işte benim durumum:

Basit birleştirme - SQL Server 2016 sp2 (sp1'de aynı sorun) kullanarak, dbcompatiblity = 130.

select Amount_TransactionCurrency_id, CurrencyShareds.id 
from CurrencyShareds 
    INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id 
option (QUERYTRACEON 3604, QUERYTRACEON 2363);

SQL 1 satırı tahmin ederken 107131 olur ve iç içe bir döngü ( planla bağlantı ) seçer . İstatistikler CurrencyShareds üzerinde güncellendikten sonra tahmin iyi olur ve bir birleştirme birleşimi seçilir ( yeni plana bağlantı ). CurrencyShareds'e yalnızca bir kayıt eklenir eklenmez istatistikler "bayat" olur ve sql yanlış tahmine geri döner.

Bu basit sorgu hakkında o kadar endişelenmezdim, ama bu sadece daha büyük olanın bir parçası ve bu bir domino başlangıcı ...

Neden 100 kayıt tablosuna bir satır eklemek böyle bir hasara neden olur? Kardinalite tahmin izinin çıktısına bakarken, bu uyarıyı görüyorum, ***WARNING: badly-formed histogram ***ancak bu konuda daha fazla bir şey bulamadım.

İşte kardinalite tahmininden tam çıktı:

Begin selectivity computation
Input tree:

LogOp_Join

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

ScaOp_Comp x_cmpEq

ScaOp_Identifier QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id

ScaOp_Identifier QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id

Plan for computation:

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1 *** WARNING: badly-formed histogram ***

Selectivity: 4.59503e-018

Stats collection generated:

CStCollJoin(ID=3, CARD=1 x_jtInner)

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

End selectivity computation

Estimating distinct count in utility function

Input stats collection:

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

Columns to distinct on:QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id

Plan for computation:

CDVCPlanLeaf

0 Multi-Column Stats, 1 Single-Column Stats, 0 Guesses

Covering multi-col stats id: 7

Using ambient cardinality 107131 to combine distinct counts:

5

Combined distinct count: 5

Result of computation: 5

Estimating distinct count in utility function

Input stats collection:

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

Columns to distinct on:QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id

Plan for computation:

CDVCPlanUniqueKey

Result of computation: 100

CurrencyShareds'teki istatistikleri güncellediğimde kısmı "hatalı biçimlendirilmiş histogram" değişiklikleri ile değiştirir ve kardinalite doğru şekilde hesaplanır

Plan for computation:

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1

Selectivity: 0.01

Stats collection generated:

CStCollJoin(ID=3, CARD=107131 x_jtInner)

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

End selectivity computation

Ve bu "[CurrencyShareds] .Id id 1 ile istatistiklerden histogram hakkında uyarı ile bana iyi görünüyor ...

Name                                                                                                                             Updated              Rows                 Rows Sampled         Steps  Density       Average key length String Index Filter Expression                                                                                                                                                                                                                                                Unfiltered Rows      Persisted Sample Percent
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ------------------------
PK_CurrencyShareds_Id                                                                                                            May 23 2018 10:43PM  98                   98                   75     1             8                  NO           NULL                                                                                                                                                                                                                                                             98                   0

(1 row affected)

All density   Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0,01020408    8              Id

(1 row affected)

RANGE_HI_KEY         RANGE_ROWS    EQ_ROWS       DISTINCT_RANGE_ROWS  AVG_RANGE_ROWS
-------------------- ------------- ------------- -------------------- --------------
119762190797406464   0             1             0                    1
119762190797406466   1             1             1                    1
119762190797406468   1             1             1                    1
119762190797406470   1             1             1                    1
119762190797406472   1             1             1                    1
119762190797406474   1             1             1                    1
119762190797406476   1             1             1                    1
119762190797406478   1             1             1                    1
119762190797406480   1             1             1                    1
119762190797406482   1             1             1                    1
119762190797406484   1             1             1                    1
119762190797406486   1             1             1                    1
119762190797406488   1             1             1                    1
119762190797406490   1             1             1                    1
119762190797406492   1             1             1                    1
119762190797406494   1             1             1                    1
119762190797406496   1             1             1                    1
119762190797406498   1             1             1                    1
119762190797406500   1             1             1                    1
119762190797406502   1             1             1                    1
119762190797406504   1             1             1                    1
119762190797406506   1             1             1                    1
119762190797406507   0             1             0                    1
478531702587687680   0             1             0                    1
478531702591881728   0             1             0                    1
478531702591881729   0             1             0                    1
478531702591881984   0             1             0                    1
478531702591881985   0             1             0                    1
478531702596076032   0             1             0                    1
478531702596076033   0             1             0                    1
478531702596076288   0             1             0                    1
478531702600270336   0             1             0                    1
478531702600270592   0             1             0                    1
478532235583062528   0             1             0                    1
478532235583062784   0             1             0                    1
478532235587256832   0             1             0                    1
530792464911467264   0             1             0                    1
530792464924049920   0             1             0                    1
530792464924050176   0             1             0                    1
530792464928244224   0             1             0                    1
530792464928244480   0             1             0                    1
530792464932438528   0             1             0                    1
530792464932438784   0             1             0                    1
530792464936632832   0             1             0                    1
530792464936632833   0             1             0                    1
530792464936633088   0             1             0                    1
530792464940827136   0             1             0                    1
530792464940827392   0             1             0                    1
530792464949216000   2             1             2                    1
530792464953410048   0             1             0                    1
530792464953410304   0             1             0                    1
530792464957604352   0             1             0                    1
530792464957604353   0             1             0                    1
530792464957604608   0             1             0                    1
530792464961798656   0             1             0                    1
530792464961798912   0             1             0                    1
530792464965992960   0             1             0                    1
530792464965993216   0             1             0                    1
530792464965993217   0             1             0                    1
530792464970187264   0             1             0                    1
530792464970187265   0             1             0                    1
530792464970187520   0             1             0                    1
530792464974381568   0             1             0                    1
530792464974381824   0             1             0                    1
530792464974381825   0             1             0                    1
530792464978575872   0             1             0                    1
530792464978575873   0             1             0                    1
530792464978576128   0             1             0                    1
867420708903354880   0             1             0                    1
867420708903355136   0             1             0                    1
867420708903355137   0             1             0                    1
960876568220042240   0             1             0                    1
976385263448130048   0             1             0                    1
977302121709864192   0             1             0                    1
977955748426318592   0             1             0                    1

ve ikinci indeks için bilgi:

Name                                                                                                                             Updated              Rows                 Rows Sampled         Steps  Density       Average key length String Index Filter Expression                                                                                                                                                                                                                                                Unfiltered Rows      Persisted Sample Percent
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ------------------------
IX_FK_Amount_TransactionCurrency                                                                                                 May 21 2018  3:29PM  107204               107204               5      0             16                 NO           NULL                                                                                                                                                                                                                                                             107204               0

(1 row affected)

All density   Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0,2           8              Amount_TransactionCurrency_id
9,32801E-06   16             Amount_TransactionCurrency_id, Id

(2 rows affected)

RANGE_HI_KEY         RANGE_ROWS    EQ_ROWS       DISTINCT_RANGE_ROWS  AVG_RANGE_ROWS
-------------------- ------------- ------------- -------------------- --------------
119762190797406475   0             160           0                    1
119762190797406478   0             867           0                    1
119762190797406481   0             106           0                    1
119762190797406494   0             105742        0                    1
119762190797406496   0             329           0                    1

Yanıtlar:


10

Senin histogramlar dayanarak ben başardı repro 2017 CU6 sorunu. Yanlış bir şey yaptığınızı söylemem. Aksine, kardinalite tahmininde bir şeyler ters gidiyor. İşte bir satır eklemeden önce ne olsun:

resim açıklamasını buraya girin

Son kardinalite tahmini, bir satır eklendikten sonra biraz düşüyor:

resim açıklamasını buraya girin

Burada oldukça basit bir repro var, bu yüzden tavsiyem ürün geri bildirimi dosyalamak veya Microsoft ile bir destek bileti açmaktır. Örnek verileriniz üzerinde çalışan birkaç geçici çözüm bulabildim ve bunlardan biri sizin için kabul edilebilir olabilir.

  1. Benzersiz dizini bırakın CurrencyShareds.Id. Repro'nun benzersiz bir dizin olmadan çalışmasını sağlayamıyorum. Tablo küçük, bu yüzden belki dizin olmadan alabilirsiniz. Tabii ki, onu tutmak için çok iyi nedenleriniz olabilir.
  2. Birleştirmenin sonuçlarını geçici bir tablo haline getirin. Sorunuza dayanarak, bu adımda makul bir tahmin almak önemlidir, böylece daha büyük sorgu iyi performans gösterir. Bir geçici tablo bunu gerçekleştirmenin bir yoludur.
  3. Eski CE'yi kullanın. Sorunu bununla yeniden üretemiyorum. Elbette, bunun sorgunuzun geri kalanında olumsuz sonuçları olabilir.
  4. Sorgu optimize ediciyi aptal kodla kandırın. Örneğin, testlerimde aşağıdaki yeniden yazma harika çalışıyor:

.

select Amount_TransactionCurrency_id, CurrencyShareds.id
from CurrencyShareds 
INNER JOIN annexes
ON Amount_TransactionCurrency_id % 9223372036854775809 = CurrencyShareds.Id % 9223372036854775809

Bunun işe yaradığından şüpheleniyorum çünkü CE histogram yerine yoğunluğu kullanıyor gibi görünüyor. Diğer benzer yeniden yazma işlemleri aynı etkiye sahip olabilir. Sorgu türünün gelecekte de çalışmaya devam edeceğine dair bir garanti yoktur. Bu nedenle, bir gün sorununuz için bir düzeltmenin yayımlanan ürüne dönüşme olasılığını artırmak için Microsoft ile iletişime geçmelisiniz.


8

Tamam, umarım şimdi anlarım - bu bizim durumumuz

verilmiş

  1. ~ 100 satırlı bir referans tablosu (CurrencyShareds), ancak kimlikleri büyük ve min, maks değerleri çok farklı - min: 119,762,190,797,406,464 vs max: 977,955,748,426,318,592
  2. CurrencyShared için basit FK'ye sahip olan ancak yalnızca birkaç Para Birimi kullanılan bir tablo (Ekler) - IX_FK_Amount_TransactionCurrency için histogramın 5 kimliği listelediğini ve diğerlerinin kullanılmadığı için sadece bu "düşük" kimliklerin listelendiğini görebilirsiniz .

Tüm istatistikler güncel olduğunda,

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1

Selectivity: 0.01

Daha sonra birleştirme için hesaplanan seçicilik iyidir, çünkü 100 * 107.131 * 0.01 = 107.131

Döviz kuru istatistikleri güncel olmadığında,

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1 *** WARNING: badly-formed histogram ***

Selectivity: 4.59503e-018

Seçicilik önemli ölçüde düşer ve bu nedenle birleştirmenin tahmini satır sayısı 1'dir.

Histogram değiştiğinde

Yüksek id ile CurrencyShared yeniden başvuru eklerine tek bir satır ekledikten sonra sonuç olarak IX_FK_Amount_TransactionCurrency için histogram olarak değişir

RANGE_HI_KEY         RANGE_ROWS    EQ_ROWS       DISTINCT_RANGE_ROWS  AVG_RANGE_ROWS
-------------------- ------------- ------------- -------------------- --------------
119762190797406475   0             173           0                    1
119762190797406478   0             868           0                    1
119762190797406481   0             107           0                    1
119762190797406494   0             105745        0                    1
119762190797406496   0             330           0                    1
119762190797406618   0             1             0                    1
119762190797406628   0             1             0                    1
977955748426318623   0             1             0                    1

Bu histogramla sorun ortadan kalkar, şimdi para birimi paylaşımlarına yeni bir satır eklemek kardinalite tahmininde dramatik bir düşüşe neden olmaz.

Neden?

Kaba histogram tahmin algoritmasının sql2014 + 'da böyle çalıştığından şüpheleniyorum ve tahminimi bu harika gönderiye dayandım https://www.sqlshack.com/join-estimation-internals/

Kaba Histogram Tahmini yeni bir algoritmadır ve genel kavramlar açısından bile daha az belgelenmiştir. Histogramları adım adım hizalamak yerine, bunları yalnızca minimum ve maksimum histogram sınırlarıyla hizaladığı bilinmektedir. Bu yöntem potansiyel olarak daha az CE hatası getirir (ancak her zaman değil, çünkü bunun sadece bir model olduğunu hatırlıyoruz).

Her şeyi açıklığa kavuşturmak için - para birimlerinde neden bu kadar tuhaf kimliklerimiz var?

Oldukça basit - kimliklerimiz dünya çapında benzersizdir ve kısmen zaman damgasına dayanır ( kar tanesi tabanlı uygulama ). En yaygın para birimleri uygulamanın başlangıcından birkaç yıl önce eklenmişti ve sadece bu birkaç tanesi üretimde gerçekten kullanılıyor, bu yüzden histogramda sadece "düşük" kimliğe sahip olanlar var.

Sorun, bazı otomatik testlerin test para birimleri eklemeye başladığı ve bazı sorguların daha uzun süre çalışmasına veya zaman aşımına uğramasına neden olduğu test ortamlarımızda ortaya çıktı ...

Sorun nasıl düzeltilir?

Bu referans tablolarına ilişkin istatistikleri daha sık güncelleyeceğiz (diğer benzer referans veri tablolarıyla benzer bir sorun yaşayabiliriz) - bu tablolar küçük olduğundan istatistikleri güncellemek sorun değil

Dersler öğrenildi

  • Güncel istatistikler önemlidir !!!
  • düz eski kimlik sütunu bu sorunlara neden olmaz :)

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.