অদ্ভুত এসকিউএল সার্ভার উদাহরণ সংখ্যায় কাস্ট করার সময় ক্রাশ


20

সি # সত্তা ফ্রেমওয়ার্কের সাথে কাজ করার সময় আমি আমার এসকিউএল সার্ভার উদাহরণটির ক্রাশ লক্ষ্য করেছি।

আমি এই বিবৃতিতে এটি ট্র্যাক করতে সক্ষম হয়েছি:

SELECT * FROM dbo.[TestTable]
where mpnr in (1099059904,
1038139906,
1048119902,
1045119902,
1002109903,
1117109910,
1111149902,
1063149902,
1117159902,
1116109904,
1105079905,
1012079906,
1129129904,
1103059905,
1065059905,
1091059906,
1110149904,
1129149903,
1083029905,
1080139904,
1076109903,
1010019902,
1058019902,
1060019903,
1053019902,
1030089902,
1018149902,
1077149902,
1010109901,
1011109901,
1000119902,
1023049903,
1107119909,
1108119909,
1106119909)

টেবিলটি এমন দেখাচ্ছে:

CREATE TABLE dbo.[TestTable]([MPNR] [numeric](9, 0) NOT NULL)

আমি যখনই ক্যোয়ারি শুরু করি তখনই ক্রাশ ঘটে occurs আমি যদি INধারাটির মধ্যে মানগুলির সংখ্যা হ্রাস করি তবে এটি কাজ করে। (এটি অবশ্যই কোনও সারি দেয় না))

আমি সচেতন যে INধারাটির মানগুলি 10-সংখ্যার সংখ্যা এবং কলামটিতে কেবল 9-সংখ্যা রয়েছে, তবে এটি পুরো এসকিউএল সার্ভারের দৃষ্টান্তের ক্র্যাশ হওয়ার কারণ নয়।

আমার এসকিউএল সার্ভারের সংস্করণটি একটি উইন্ডোজ সার্ভার 2003 32-বিটে 2008 আর 2।

এটি কি জানা বাগ? এসকিউএল সার্ভারের জন্য কোনও প্যাচ আছে?


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
পল হোয়াইট GoFundMonica বলেছেন

উত্তর:


20

আমি ২০০৮ আর 1 এসপি 3 10.00.5512 এ তিরস্কার করতে সক্ষম হয়েছি তবে সর্বশেষতম সিইউ (14) ইনস্টল করে এটি স্থির করেছে।

অন্তর্বর্তী সংস্করণগুলিতে স্থির বাগগুলি পর্যালোচনা করে দেখে মনে হচ্ছে আপনাকে নীচের ফিক্স সহ এমন একটি বিল্ডে আপগ্রেড করতে হবে।

আপনি যখন এসকিউএল সার্ভার ২০০৮ অথবা এসকিউএল সার্ভার ২০১২-এ আইএন ধারাটিতে অনেক ধ্রুবক মান রয়েছে এমন কোনও ক্যোয়ারী চালান তখন অ্যাক্সেস লঙ্ঘন

আপনি যেমন 2008 আর 2 তে আছেন আপনার এসপি 1 এর জন্য কমপক্ষে সিইউ 9 বা এসপি 2 এর জন্য সিইউ 5 লাগবে।

লক্ষণগুলির বিবরণ কিছুটা সংক্ষিপ্ত হলেও মিল নেই মেলানো ডেটাটাইপগুলি

আপনি যখন মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮, মাইক্রোসফ্ট এসকিউএল সার্ভার ২০১২ অথবা মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮ আর 2-তে একটি আইওন ক্লাসে অনেক ধ্রুবক মান রয়েছে এমন কোনও কোয়েরি চালনা করেন তখন অ্যাক্সেস লঙ্ঘন হতে পারে।

দ্রষ্টব্য সমস্যাটি ঘটে যাওয়ার জন্য, আইএন ধারাটিতে থাকা ধ্রুবকগুলি কলামের ডেটা টাইপের সাথে ঠিক মেলে না।

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

ক্র্যাশ পদ্ধতি ডাকা দুয়েক ভিতরে ঘটছে CScaOp_In::FCalcSelectivity()যেমন নামের সাথে LoadHistogramFromXVariantArray()এবং CInMemHistogram::FJoin() -> WalkHistograms()

তালিকার আইটেমগুলিতে 19 বা তার চেয়ে কম স্বতন্ত্রতার জন্য এই পদ্ধতিগুলি মোটেই কল করা যাচ্ছিল না। একটি অনুরূপ এসকিউএল সেভার 2000 বাগও এই কাট অফ পয়েন্টটিকে উল্লেখযোগ্য হিসাবে উল্লেখ করেছে।

0 এবং 1047 এর মধ্যে মানগুলির সাথে 100,000 সারি এলোমেলো পরীক্ষার ডেটা এবং একটি হিস্টোগ্রাম নিম্নরূপে শুরু করে একটি পরীক্ষার সারণী পপুলেট করা

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
|            0 |          0 |     104 |                   0 | 1              |
|            8 |        672 |     118 |                   7 | 96             |
|           13 |        350 |     118 |                   4 | 87.5           |
|           18 |        395 |     107 |                   4 | 98.75          |
|           23 |        384 |      86 |                   4 | 96             |
|           28 |        371 |      85 |                   4 | 92.75          |
+--------------+------------+---------+---------------------+----------------+

ক্যোয়ারী

SELECT * FROM dbo.[TestTable]
where mpnr in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)
option (maxdop 1)

1856 এর আনুমানিক সারি দেখায়।

19 সমতার জন্য আনুমানিক সারিগুলি পৃথকভাবে পূর্বাভাস দেওয়ার জন্য এবং সেগুলি একসাথে যুক্ত করে প্রত্যাশা করা ঠিক এটিই।

+-------+----------------+-------+
| 1-7   | AVG_RANGE_ROWS | 96    |
| 8     | EQ_ROWS        | 118   |
| 9-12  | AVG_RANGE_ROWS | 87.5  |
| 13    | EQ_ROWS        | 118   |
| 14-17 | AVG_RANGE_ROWS | 98.75 |
| 18    | EQ_ROWS        | 107   |
| 19    | AVG_RANGE_ROWS | 96    |
+-------+----------------+-------+

7*96 + 118 + 4*87.5 + 118 + 4*98.75 + 107 + 1*96 = 1856

সূত্র আর পরে কাজ করে 20তালিকায় যোগ করা হয় (আনুমানিক সারি 1902.75বদলে 1952অন্য যোগ করার যে 96মোট উৎপন্ন হবে)।

BETWEEN কার্ডিনালিটির অনুমান গণনা করার জন্য আরও একটি পদ্ধতি ব্যবহার করা আছে বলে মনে হচ্ছে।

where mpnr BETWEEN 1 AND 20শুধুমাত্র 1829.6 সারি অনুমান করে। আমি জানি না যে এটি কীভাবে দেখানো হিস্টোগ্রাম থেকে উদ্ভূত হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.