आंतरिक जुड़ने पर कार्डिनैलिटी का अनुमान समस्या


13

मैं यह समझने के लिए संघर्ष कर रहा हूं कि पंक्ति का अनुमान बहुत गलत क्यों है, यहाँ मेरा मामला है:

सरल जॉइन - SQL सर्वर 2016 sp2 (sp1 पर एक ही मुद्दा), 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 पंक्ति का अनुमान लगाता है, जबकि यह 107131 है और एक नेस्टेड लूप ( योजना के लिए लिंक ) करने का विकल्प चुनता है । CurrencyShareds पर आँकड़े अपडेट होने के बाद, अनुमान ठीक है और एक मर्ज जॉइन चुना गया है ( नई योजना के लिए लिंक )। जैसे ही CurrencyShareds में केवल एक रिकॉर्ड जोड़ा जाता है, तब आँकड़े "बासी" हो जाते हैं और sql गलत अनुमान पर वापस जाता है।

मैं इस साधारण प्रश्न के बारे में ज्यादा चिंता नहीं करता, लेकिन यह सिर्फ एक बड़े हिस्से का हिस्सा है, और यह एक डोमिन की भीख है ...

100 रिकॉर्ड तालिका में एक पंक्ति जोड़ने से ऐसा नुकसान क्यों होता है? जब कार्डिनैलिटी अनुमान ट्रेस के आउटपुट में देखते हैं, तो मुझे यह चेतावनी दिखाई देती है, ***WARNING: badly-formed histogram ***लेकिन मुझे इस विषय पर और कुछ नहीं मिला।

यहाँ कार्डिनैलिटी के आकलन से पूरा आउटपुट मिलता है:

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 के आँकड़ों को अद्यतन करता हूँ तो "बुरी तरह से निर्मित हिस्टोग्राम" वाले हिस्से में परिवर्तन होता है और कार्डिनैलिटी की सही गणना होती है

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

और हिस्टोग्राम के बारे में चेतावनी के साथ "आईडी 1 के साथ आँकड़े" के लिए इस "[CurrencyShareds] .Id के लिए आँकड़े जानकारी, जो मुझे ठीक लगता है ...

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

और दूसरे इंडेक्स के लिए जानकारी:

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

जवाबों:


10

अपने हिस्टोग्राम के आधार पर मैं करने में सक्षम था repro 2017 CU6 में इस मुद्दे को। मैं यह नहीं कहूंगा कि आप कुछ गलत कर रहे हैं। बल्कि, कार्डिनैलिटी के अनुमान के साथ कुछ गलत हो रहा है। यहां एक पंक्ति डालने से पहले मुझे क्या मिलेगा:

यहाँ छवि विवरण दर्ज करें

एक पंक्ति डालने के बाद अंतिम कार्डिनैलिटी का अनुमान काफी कम हो जाता है:

यहाँ छवि विवरण दर्ज करें

आपके पास यहां एक बहुत ही सरल रिप्रो है, इसलिए मेरी सलाह है कि उत्पाद प्रतिक्रिया दर्ज करें या Microsoft के साथ एक समर्थन टिकट खोलें। मैं आपके नमूने डेटा पर काम करने वाले कुछ वर्कअराउंड खोजने में सक्षम था और आपके लिए स्वीकार्य हो सकता है।

  1. पर अद्वितीय सूचकांक ड्रॉप CurrencyShareds.Id। मैं एक अद्वितीय सूचकांक के बिना काम करने के लिए रिप्रो नहीं प्राप्त कर सकता। तालिका छोटी है, इसलिए शायद आप सूचकांक के बिना प्राप्त कर सकते हैं। बेशक, आपके पास इसे रखने के बहुत अच्छे कारण हो सकते हैं।
  2. टेंपरेचर टेबल में शामिल होने के परिणामों को भौतिक बनाएं। आपके प्रश्न के आधार पर इस कदम पर एक उचित अनुमान प्राप्त करना महत्वपूर्ण है ताकि बड़ी क्वेरी अच्छा प्रदर्शन करे। एक अस्थायी तालिका ऐसा करने का एक तरीका है।
  3. विरासत CE का उपयोग करें। मुझे इसके साथ पुन: पेश करने के लिए मुद्दा नहीं मिल सकता है। बेशक, आपकी शेष क्वेरी पर इसके नकारात्मक परिणाम हो सकते हैं।
  4. मूर्खतापूर्ण कोड के साथ क्वेरी ऑप्टिमाइज़र को ट्रिक करें। उदाहरण के लिए, मेरे परीक्षण में निम्नलिखित पुनर्लेखन बहुत अच्छा काम करता है:

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

मुझे संदेह है कि यह काम करता है क्योंकि सीई हिस्टोग्राम के बजाय घनत्व का उपयोग करता प्रतीत होता है। अन्य समान पुनर्लेखनों का समान प्रभाव हो सकता है। इस बात की कोई गारंटी नहीं है कि भविष्य में अच्छी तरह से काम करना जारी रहेगा। इसलिए आपको Microsoft से संपर्क करना चाहिए कि वह उन बाधाओं को सुधारने के लिए, जो एक दिन आपकी समस्या के लिए ठीक होने के बाद उसे जारी किए गए उत्पाद में बदल देगी।


8

ठीक है, मुझे आशा है कि मैं इसे अब समझ सकता हूं - इसलिए यह हमारा मामला है

दिया हुआ

  1. ~ 100 पंक्तियों के साथ एक संदर्भ तालिका (मुद्राश्रृंग), लेकिन आईडी बड़ी हैं, और न्यूनतम, अधिकतम मान बहुत भिन्न हैं - न्यूनतम: 119,762,190,797,406,464 बनाम अधिकतम: 977,955,748,4,4,318,592
  2. एक तालिका (अनुलग्नक) जिसमें करेंसीकेयर के लिए सरल एफके है, लेकिन केवल कुछ मुद्राओं का उपयोग किया जाता है - आप देख सकते हैं कि IX_FK_Amount_TransactionCurrency के लिए हिस्टोग्राम 5 आईडी सूचीबद्ध करता है - और क्या महत्वपूर्ण है केवल उन "निम्न" आईडी, जैसे कि अन्य का उपयोग नहीं किया जाता है।

जब सभी आँकड़े तब तक के हो जाते हैं

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

फिर शामिल होने के लिए गणना की गई चयनात्मकता ठीक है, जैसे कि 100 * 107,131 * 0.01 = 107,131

जब मुद्राशर्त के आँकड़े आज तक नहीं हैं, तब

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

चयनात्मकता नाटकीय रूप से गिरती है, और इसलिए जुड़ने की अनुमानित पंक्ति संख्या 1 है।

जब हिस्टोग्राम बदल जाता है

जब मैं मुद्रा में उच्च पंक्ति के साथ मुद्रा को फिर से जोड़ने के लिए एक एकल पंक्ति जोड़ता हूं, तो परिणाम में IX_FK_Amount_TransactionCurrency के लिए हिस्टोग्राम बदल जाता है

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

इस हिस्टोग्राम के साथ समस्या गायब हो जाती है, अब मुद्रास्वरुप में एक नई पंक्ति जोड़ने से कार्डिनैलिटी अनुमान में नाटकीय गिरावट नहीं होती है।

ऐसा क्यों है?

मुझे शक है कि यह कैसे मोटे हिस्टोग्राम आकलन एल्गोरिथ्म sql2014 + में काम करता है, और मैं इस महान पोस्ट https://www.sqlshack.com/join-estimation-internals/ पर अपने अनुमान को आधार बना रहा हूं।

मोटे हिस्टोग्राम अनुमान सामान्य अवधारणाओं के संदर्भ में भी एक नया एल्गोरिदम और कम प्रलेखित है। यह ज्ञात है कि कदम से हिस्टोग्राम को संरेखित करने के बजाय, यह उन्हें केवल न्यूनतम और अधिकतम हिस्टोग्राम सीमाओं के साथ संरेखित करता है। यह विधि संभावित रूप से कम सीई गलतियों का परिचय देती है (हमेशा नहीं, क्योंकि हमें याद है कि यह सिर्फ एक मॉडल है)।

बस सब कुछ स्पष्ट करने के लिए - हमारे पास मुद्रा भंडार में ऐसी अजीब आईडी क्यों हैं?

यह काफी सरल है - हमारी आईडी विश्व स्तर पर अद्वितीय हैं और टाइमस्टैम्प ( स्नोफ्लेक पर आधारित कार्यान्वयन ) पर आधारित हैं । सबसे आम मुद्राओं को कई साल पहले आवेदन की शुरुआत में जोड़ा गया था, और केवल कुछ ही वास्तव में उत्पादन में उपयोग किए जाते हैं, यही कारण है कि हिस्टोग्राम में केवल "कम" आईडी वाले हैं।

समस्या हमारे परीक्षण वातावरण पर सामने आई, जहां कुछ स्वचालित परीक्षणों ने परीक्षण मुद्राओं को जोड़ना शुरू कर दिया, जिससे कुछ प्रश्न लंबे समय तक या समय समाप्त होने पर निष्पादित हुए ...

समस्या को कैसे ठीक करें?

हम उन संदर्भ तालिकाओं के लिए आंकड़े अपडेट करेंगे (हमें अन्य समान संदर्भ डेटा तालिकाओं के साथ एक समान समस्या हो सकती है) अधिक बार - वे तालिकाएँ छोटी हैं इसलिए आँकड़े अद्यतन करना कोई समस्या नहीं है

सीख सीखी

  • तारीख तक आँकड़े महत्वपूर्ण हैं !!!
  • सादे पुराने पहचान कॉलम से ये समस्याएँ नहीं होंगी :)

मोटे संरेखण के बारे में: sqlperformance.com/2018/11/sql-optimizer/...
पॉल व्हाइट 9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.