এসকিউএল সার্ভার ক্যোয়ারী প্ল্যান এক্সএমএল: কোয়েরিপ্ল্যানহ্যাশ দৈর্ঘ্য


11

আপডেট: এটি অবশ্যই একটি বাগ। সম্পূর্ণ বিশদের জন্য এই সংযুক্ত আইটেমটি দেখুন

স্প_ব্লিটজ ক্যাচে কিছু পরিবর্তন পরীক্ষা করার সময় (সম্পূর্ণ প্রকাশ, আমি অন্যতম লেখক), আমি আমাদের কোডটিতে একটি বাগ বলে ভেবেছিলাম তা পেরিয়ে এসেছি।

এক পর্যায়ে, ক্যোয়ারি ব্যয় পেতে আমরা কোয়েরি প্ল্যান হ্যাশের সাথে মিল করছি। আমরা এটির মতোই এটি করি:

statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) =
    xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float')

এটি যতদূর আমি দেখেছি, কাজ করেছে। যাইহোক, একটি অদ্ভুত ক্ষেত্রে, এক্সএমএলটিতে সাবস্ট্রিং একটি NULLমান ফেলছিল , এবং পরিকল্পনাটি উচ্চতর হওয়া সত্ত্বেও 0 এর ব্যয় প্রদর্শন করছে।

কার্যকর করার পরিকল্পনার খনন (সম্পূর্ণ প্রকাশ, আমি যে সংস্থার পেস্ট দ্য প্ল্যানটি হোস্ট করি তার জন্য কাজ করি), আমি লক্ষ্য করেছি যে একটি সমস্যার হ্যাশের ক্যোরি প্ল্যান হ্যাশটি 17 অক্ষর দীর্ঘ, আর বাকী 18 টি রয়েছে Here এখানে উদাহরণ রয়েছে:

QueryPlanHash = "0x4410B0CA640CDA89"
QueryPlanHash = "0x2262FEA4CE645569" 
ক্যোরিপ্ল্যানহ্যাশ = "0xED4F225CC0E97E5" - সমস্যা!
QueryPlanHash = "0xBF878EEE6DB955EA"
QueryPlanHash = "0x263B53BC8C14A452"
QueryPlanHash = "0x89F5F146CF4B476F"
QueryPlanHash = "0xEF47EA40805C8961"
QueryPlanHash = "0xB7BE27D6E43677A5"
QueryPlanHash = "0x815C54EC43A6A6E9"

ক্যোয়ারি প্ল্যান হ্যাশকে একটি হিসাবে তালিকাভুক্ত করা হয়েছে BINARY 8- সম্ভবত এটি সর্বদা একই দৈর্ঘ্য হওয়া উচিত তবে আমার মতো লোক বাইনারি মান সম্পর্কে কী জানে?

খানিকটা এক্সকিউরির সাথে খেলে আমি দেখতে পেলাম যে দ্বিতীয়টি অবস্থানে শুরু করার জন্য স্ট্রিংগুলি পরিবর্তন করে এটি একটি বৈধ (ভুল হলেও) হ্যাশ মান নিয়ে আসবে।

WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
SELECT   
        QueryPlanCost = statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float'),
        **q.n.value('substring(@QueryPlanHash, 2)', 'BINARY(8)')**
FROM    #statements s
CROSS APPLY s.statement.nodes('/p:StmtSimple') AS q(n)
OPTION(RECOMPILE);

WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
SELECT   
        QueryPlanCost = statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float'),
        **q.n.value('substring(@QueryPlanHash, 3)', 'BINARY(8)')**
FROM    #statements s
CROSS APPLY s.statement.nodes('/p:StmtSimple') AS q(n)
OPTION(RECOMPILE);

বাদাম

আমি এসকিউএল সার্ভার 2016, এসপি 1 (13.0.4001) চালাচ্ছি।

এর আগে কেউ কি এর মধ্যে দৌড়েছে?

17 টি অক্ষর একটি BINARY 8মান জন্য একটি বৈধ দৈর্ঘ্য ?

এটি কি কোনও বাগের মতো দেখাচ্ছে যা একটি কানেক্ট আইটেম পাবে?

উত্তর:


11

আমি মনে করি এটি ঘটছে কারণ একটি হ্যাশ একটি বিজোড় সংখ্যা। একটি বৈধের VARBINARYসঠিকভাবে উপাত্ত উপস্থাপন করতে একটি "সংখ্যক" জোড় থাকা দরকার। সুতরাং ... আপনার প্রথমে 0xএকটি '0' লাগিয়ে, ডান 18 টি অক্ষর ধরে, এবং তারপরে এটি কাস্ট করে এটি সমাধান করা উচিত VARBINARY

CONVERT(VARBINARY(MAX), RIGHT('0' + SUBSTRING('0xED4F225CC0E97E5', 3, 20), 18), 2)

আপনি যদি আরও শক্ত কিছু চান, ভাগ্য ভাল, কারণ আপনার পূর্ণসংখ্যার হিসাবে 2 দ্বারা বিভাজন করতে হবে এবং 2 এর মডিউলটি পেতে হবে এবং আপনার ডেটা কত বড় হওয়া উচিত তা বোঝার জন্য "সঠিক জিনিসটি করুন"।

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