অভ্যন্তরীণ জোড়ায় কার্ডিনালিটি অনুমানের সমস্যা


13

সারি অনুমান কেন এত মারাত্মক ভুল তা বোঝার জন্য আমি লড়াই করে যাচ্ছি, এখানে আমার কেস:

সরল যোগদান - এসকিউএল সার্ভার 2016 এসপি 2 (এসপি 1 তে একই সমস্যা), ডিবিসিম্প্যাটিব্লিটিটি = 130 ব্যবহার করে।

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

এসকিউএল 1 সারি অনুমান করে, যেখানে এটি 107131 এবং নেস্টেড লুপ ( পরিকল্পনার লিঙ্ক ) করতে পছন্দ করে। মুদ্রা ভাগের উপর পরিসংখ্যান আপডেট হওয়ার পরে অনুমানটি ঠিক আছে এবং একত্রীকরণের যোগদানটি বেছে নেওয়া হয়েছে ( নতুন পরিকল্পনার লিঙ্ক )। মুদ্রাভাগের সাথে কেবলমাত্র একটি রেকর্ড যুক্ত হওয়ার সাথে সাথে পরিসংখ্যানগুলি "বাসি" হয়ে যায় এবং স্কুয়েল ভুল অনুমানের দিকে ফিরে যায়।

আমি এই সাধারণ ক্যোয়ারী সম্পর্কে এতটা চিন্তা করব না, তবে এটি কেবল বৃহত্তর একটি অংশ এবং এটিই ডমিনো ...

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

এবং আমি যখন মুদ্রা ভাগের উপর পরিসংখ্যানগুলি আপডেট করি তখন "খারাপভাবে গঠিত হিস্টোগ্রাম" পরিবর্তনগুলি সহ অংশটি সঠিকভাবে গণনা করা হয়

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 সহ পরিসংখ্যানগুলি থেকে হিস্টোগ্রাম সম্পর্কে সতর্কতা সহ, যা আমার কাছে দুর্দান্ত দেখাচ্ছে ...

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

আপনার histograms উপর ভিত্তি করে আমি পারতাম repro 2017 CU6 বিষয়টি। আমি বলব না যে আপনি কিছু ভুল করছেন। বরং কার্ডিনালিটির অনুমানের সাথে কিছু ভুল হচ্ছে। একটি সারি সন্নিবেশ করার আগে আমি যা পাই তা এখানে:

এখানে চিত্র বর্ণনা লিখুন

চূড়ান্ত কার্ডিনালিটির অনুমানটি একটি সারি সন্নিবেশ করানোর পরে বেশ খানিকটা পড়ে যায়:

এখানে চিত্র বর্ণনা লিখুন

আপনার এখানে একটি দুর্দান্ত সরল নিন্দা রয়েছে তাই আমার পরামর্শ হল পণ্য প্রতিক্রিয়া ফাইল করা বা মাইক্রোসফ্টের সাথে একটি সমর্থন টিকিট খুলুন। আমি আপনার কয়েকটি নমুনা ডেটাতে কাজ করে এমন কয়েকটি কাজের সন্ধান করতে পেরেছি এবং এর মধ্যে একটি সম্ভবত আপনার পক্ষে গ্রহণযোগ্য।

  1. অনন্য সূচকটি চালু করুন CurrencyShareds.Id। আমি কোনও অনন্য সূচক ছাড়া কাজ করতে তিরস্কার পেতে পারি না। টেবিলটি ছোট, তাই আপনি সূচি ছাড়াই পেতে পারেন। অবশ্যই এটি রাখার জন্য আপনার খুব ভাল কারণ থাকতে পারে।
  2. যোগদানের ফলাফলগুলি একটি টেম্প টেবিলের মধ্যে কার্যকর করুন। আপনার প্রশ্নের উপর ভিত্তি করে এই ধাপে একটি যুক্তিসঙ্গত অনুমান করা গুরুত্বপূর্ণ যাতে বৃহত্তর ক্যোরিয়াসটি ভালভাবে সম্পাদন করে। একটি টেম্প টেবিল হ'ল এটি করার এক উপায়।
  3. উত্তরাধিকারী সিই ব্যবহার করুন। সমস্যাটি এটির সাথে পুনরুত্পাদন করতে পারি না। অবশ্যই, এটি আপনার বাকি প্রশ্নের উপর নেতিবাচক পরিণতি হতে পারে।
  4. মূর্খ কোড সহ ক্যোয়ারী অপ্টিমাইজারটি চালিত করুন। উদাহরণস্বরূপ, আমার পরীক্ষায় নিম্নলিখিত পুনর্লিখনটি দুর্দান্ত কাজ করে:

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

আমার সন্দেহ হয় যে এটি কাজ করে কারণ সিই হিস্টোগ্রামের পরিবর্তে ঘনত্ব ব্যবহার করে। অন্যান্য অনুরূপ পুনর্লিখনের একই প্রভাব থাকতে পারে। ভবিষ্যতে এই ধরণের ক্যোয়ারী ভালভাবে চলতে থাকবে এমন কোনও গ্যারান্টি নেই। এজন্য আপনার সমস্যার সমাধানের জন্য একদিন আপনার সমস্যার সমাধানের জন্য মাইক্রোসফ্টের সাথে যোগাযোগ করা উচিত যা এটি প্রকাশিত পণ্যতে পরিণত করে।


8

ঠিক আছে, আমি আশা করি এখনই এটি বুঝতে পেরেছি - সুতরাং এটি আমাদের ক্ষেত্রে

প্রদত্ত

  1. 100 ডলার সারি সহ একটি রেফারেন্স সারণী (কারেন্সি শেয়ার)) তবে আইডিগুলি বড় এবং নূন্যতম, সর্বাধিক মানগুলি অনেক বেশি পৃথক - মিনিট: 119,762,190,797,406,464 বনাম সর্বাধিক: 977,955,748,426,318,592
  2. একটি টেবিল (সংযুক্তি) যাতে মুদ্রা ভাগ করে নেওয়া সহজ এফকে থাকে তবে কেবল কয়েকটি মুদ্রা ব্যবহৃত হয় - আপনি দেখতে পাচ্ছেন যে আইএক্স_এফকে_অ্যামাউন্ট_ট্রান্সক্র্যাঙ্কসির জন্য হিস্টোগ্রামে 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।

যখন হিস্টোগ্রাম পরিবর্তন হয়

আমি সংযুক্তিতে একটি একক সারি যুক্ত করার পরে যা উচ্চ আইডি দিয়ে মুদ্রা ভাগাভাগি পুনরায় জমা দেয়, তারপরে আইএক্স_এফকে_অ্যামাউন্ট_ট্রান্সঅ্যাকশন মুদ্রার হিস্টোগ্রামে পরিবর্তিত হয়

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- প্রমাণীকরণ-আন্তঃ /

মোটা হিস্টোগ্রাম অনুমান একটি নতুন অ্যালগরিদম এবং কম ডকুমেন্টেড, এমনকি সাধারণ ধারণার ক্ষেত্রেও। এটি জানা যায় যে ধাপে ধাপে হিস্টোগ্রামগুলি সারিবদ্ধ করার পরিবর্তে এটি কেবল সর্বনিম্ন এবং সর্বাধিক হিস্টোগ্রামের সীমানার সাথে সারিবদ্ধ করে। এই পদ্ধতিটি সম্ভবত সিই এর কম ভুল পরিচয় করিয়ে দেয় (তবে সবসময় তা নয়, কারণ আমরা মনে করি এটি কেবল একটি মডেল)।

কেবল সমস্ত কিছু পরিষ্কার করার জন্য - কেন কারেনস্ক্রেডগুলিতে আমরা এই জাতীয় অদ্ভুত আইডিস রাখি?

এটি বেশ সহজ - আমাদের আইডিগুলি বিশ্বব্যাপী অনন্য এবং টাইমস্ট্যাম্পের ভিত্তিতে ( স্নোফ্লেকের উপর ভিত্তি করে বাস্তবায়ন )। বেশ কয়েক বছর আগে অ্যাপ্লিকেশন শুরু করার পরে সর্বাধিক প্রচলিত মুদ্রাগুলি যুক্ত করা হয়েছিল এবং কেবলমাত্র কয়েক জনই উত্পাদন ক্ষেত্রে সত্যই ব্যবহৃত হয়, এ কারণেই হিস্টোগ্রামে কেবল "কম" আইডি রয়েছে।

সমস্যাটি আমাদের পরীক্ষার পরিবেশগুলিতে প্রকাশিত হয়েছিল, যেখানে কিছু স্বয়ংক্রিয় পরীক্ষাগুলি পরীক্ষার মুদ্রাগুলি যুক্ত করা শুরু করে, যার ফলে কিছু প্রশ্ন দীর্ঘায়িত হয় বা সময়সীমা শেষ হয় ...

কীভাবে সমস্যা সমাধান করবেন?

আমরা সেই রেফারেন্স সারণীর জন্য পরিসংখ্যান আপডেট করব (অন্যান্য অনুরূপ রেফারেন্স ডেটা টেবিলগুলির সাথে আমাদের একই সমস্যা হতে পারে) - এই টেবিলগুলি ছোট তাই স্ট্যাটাস আপডেট করা কোনও সমস্যা নয়

পাঠ শিখেছি

  • তারিখের পরিসংখ্যান গুরুত্বপূর্ণ!
  • সাধারণ পুরানো পরিচয় কলাম এই সমস্যার কারণ হবে না :)

মোটা প্রান্তিককরণ সম্পর্কিত: sqlperformance.com/2018/11/sql-optimizer/…
পল হোয়াইট 9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.