আমার সূচক কেন সারিগুলির সঠিক সংখ্যাটি অনুমান করতে পারে এবং বাছাই করা অপারেটর পারে না?


11

আমার একটি ক্যোয়ারী রয়েছে যা প্রিডিকেটে একটি ফাংশন ব্যবহার করে, এরকম কিছু:

commentType = 'EL'
AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0)

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

ইহা কি জন্য ঘটিতেছে? আমি সরগাব্যতা সম্পর্কে প্রাথমিক বিষয়গুলি জানি , এবং আমি কেবল তাত্পর্যপূর্ণতার জন্য পরীক্ষা করেছিলাম যে তারিখটি একটি আসল তারিখ (2014-01-01) এবং ভয়েলা দ্বারা প্রতিস্থাপন করা হয়েছে ... ক্রমটি সারিগুলির সংখ্যা সঠিকভাবে অনুমান করা শুরু করেছিল ...

কেন এটি হচ্ছে এবং আমি কীভাবে এটি ঠিক করতে পারি? আমি একটি নির্দিষ্ট তারিখ পাস করতে পারি না ...


DATEADD(month,datediff(month,0,getdate()) - 13,0)আমার কোন মানে নেই। আপনি এই কি করতে চেষ্টা করছেন? এটি কি উন্নত / সরলীকরণ করা যেতে পারে?
ড্যানিয়েল হুটমাচার

2
@ ড্যানিয়েল এটি 13 মাস আগে মাসের শুরু।
অ্যারন বারট্র্যান্ড

1
এছাড়াও, দয়া করে আপনার থাকা এসকিউএল সার্ভারের সংস্করণ (?) প্রতিবিম্বিত করতে আপনার প্রশ্নটি সম্পাদনা করুন। তার জন্য ট্যাগ ব্যবহার করুন।
ড্যানিয়েল হুটমাচার

আপনি চেষ্টা করতে DATEADD(month, -13, DATEADD(day, 1-DATEPART(day, SYSDATETIME()))পারেন এবং কিছু পার্থক্য আছে কিনা তা দেখতে পারেন?
ড্যানিয়েল হুটমাচার

যদি আপনার একটি ফিল্টারবিহীন সূচক চালু (commentType, commentDate)থাকে তবে এটি কি এখানে আরও ভাল আচরণ করে? এটি ঠিক যে ফিল্টারড সূচীগুলি কখনও কখনও পরিকল্পনার বিভিন্ন পয়েন্টে অনুমানকে ভুল করে তুলতে পারে। ফিল্টারড ইনডেক্সে মোট সংখ্যাটি রিপোর্ট করে অনুমানটি বেরিয়ে গেছে বলে মনে হচ্ছে, তবে বাস্তবে এটি পরিকল্পনাটি ভুল দেখানো হচ্ছে।
রব ফারলে

উত্তর:


9

আমি বিশ্বাস করি যে আপনার অনুমানগুলি ভুল কারণ একটি অনুমানকারী বাগ যা DATEDIFF টি আর্গুমেন্টের দুটি পরিবর্তিত করে। আমি এখানে এই সম্পর্কে কথা বলতে:

একটি কার্যকারণ হ'ল DATEDIFF (2008+) ব্যবহার না করে 13 মাস আগে প্রথম দিন গণনা করা:

DATEADD(MONTH, -13, DATEADD(DAY, 1-DATEPART(DAY,GETDATE()), CONVERT(DATE, GETDATE()));

আমি ইতিবাচক নই যা প্রাক্কলনটির সমাধান করবে (আমি ফিল্টারড সূচীগুলির সাথে পরীক্ষা করিনি, এবং আমি নিশ্চিত নই যে বাছাইটি আসলে কী করছে বা পরিকল্পনা এবং / অথবা বাকী কোয়েরি ছাড়াই কেন এটির আলাদা অনুমান রয়েছে? )।

মাইক্রোসফ্ট যে ফিক্সটির পরামর্শ দিচ্ছে তা হল টিএফ 4199 ব্যবহার করা, তবে আমি এখানে নিশ্চিত যা আপনার এটি করতে হবে তা নিশ্চিত নই:

অন্য বিকল্পটি নিশ্চিত করা হবে যে আপনি এসকিউএল সার্ভারের যে কোনও সংস্করণ ব্যবহার করছেন তার জন্য আপনি সর্বশেষতম এসপি / সিইউতে রয়েছেন, কারণ তারা দাবি করছেন যে এটি নিম্নলিখিত কেবি নিবন্ধে স্থির হয়েছে (যদিও এটি এখনও টিএফ 4199 ব্যবহারের প্রয়োজন হবে আপনি 2014 বা আরও ভাল না হলে):

নিম্নলিখিত বিল্ডগুলির সাথে ফিক্সটি পাওয়া যায়:

(পরের বার, দয়া করে SELECT @@VERSIONআপনার প্রশ্নের ফলাফল অন্তর্ভুক্ত করুন ।)

আমি নোট হবে কিলোবাইট নিবন্ধ বলছেন যে যে DATEDIFF করতে অবমূল্যায়ন সারির সংখ্যা, যা আপনার দৃশ্যকল্প ঘটছে সম্পূর্ণ বিপরীত। এর অর্থ এই নয় যে সমাধানগুলি আপনার জন্য প্রযোজ্য নয়; আমি মনে করি কেবি নিবন্ধের শব্দবন্ধটি সঠিক নয়, কারণ ডেটা এবং আপনি যে সীমাটি দেখছেন তার উপর নির্ভর করে অনুমানগুলি কোনওভাবেই যেতে পারে।

উপরের আমার ব্লগ পোস্টটি নিশ্চিত করেছে যে অদলবদল 2014 এবং তার বেশি হয় না। নিরাপদ থাকার জন্য, আমি সম্ভবত আপনার শিকারী থেকে DATEDIFF স্ক্র্যাপ করব এবং আপনার ব্যাপ্তির প্রারম্ভিক গণনা করতে একটি পৃথক পদ্ধতি ব্যবহার করব। আমি খারাপ স্যুপটি রোধ করতে 4199 এর ওভারকিল বা গতিশীল এসকিউএল ব্যবহার করার পরামর্শ দিচ্ছি না।


সাহায্যের জন্য ধন্যবাদ ! আমি আপনার পরামর্শ চেষ্টা করেছিলাম এবং পরিকল্পনা পরিবর্তন হয়েছে। এটা কিভাবে অনেক আগে থেকেই আছেন হল: s16.postimg.org/t5j6o1yed/fix_wrong.png এই কিভাবে এটা পরে আমি তোমার দ্বারা আমার datediff পরিবর্তিত হল: postimg.org/image/5f725rj83 আমি সব URL গুলি তুমি আমাকে দিয়েছ তা পড়তে যাচ্ছি । চিয়ার্স।
মিঃ কুডজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.