আমি লক্ষ্য করেছি যে যখন টেম্পিডবি ইভেন্টগুলিতে ছড়িয়ে পড়ে (ধীরে ধীরে অনুসন্ধানের কারণ হয়) যা প্রায়শই সারি অনুমানগুলি একটি নির্দিষ্ট যোগদানের জন্য বন্ধ হয়ে যায়। আমি দেখেছি যে স্পিল ইভেন্টগুলি মার্জ এবং হ্যাশ যোগদানের সাথে ঘটে থাকে এবং তারা প্রায়শই রানটাইম 3x থেকে 10x বৃদ্ধি করে। এই প্রশ্নটি কীভাবে সারি ঘটনার সম্ভাবনা হ্রাস করবে এই অনুমানের অধীনে সারি অনুমানের উন্নতি করতে পারে তা উদ্বেগ দেয়।
সারিগুলির আসল সংখ্যা 40k।
এই ক্যোয়ারির জন্য, পরিকল্পনাটি খারাপ সারি অনুমান (11.3 সারি) দেখায়:
select Value
from Oav.ValueArray
where ObjectId = (select convert(bigint, Value) NodeId
from Oav.ValueArray
where PropertyId = 3331
and ObjectId = 3540233
and Sequence = 2)
and PropertyId = 2840
option (recompile);
এই ক্যোয়ারির জন্য, পরিকল্পনাটি ভাল সারির প্রাক্কলন (56 কে সারি) দেখায়:
declare @a bigint = (select convert(bigint, Value) NodeId
from Oav.ValueArray
where PropertyId = 3331
and ObjectId = 3540233
and Sequence = 2);
select Value
from Oav.ValueArray
where ObjectId = @a
and PropertyId = 2840
option (recompile);
প্রথম ক্ষেত্রে সারি অনুমানের উন্নতি করতে পরিসংখ্যান বা ইঙ্গিতগুলি যুক্ত করা যেতে পারে? আমি নির্দিষ্ট ফিল্টার মান (সম্পত্তি = 2840) এর সাথে পরিসংখ্যান যুক্ত করার চেষ্টা করেছি তবে হয় সংমিশ্রণটি সঠিকভাবে পাওয়া যায়নি বা সম্ভবত এটি উপেক্ষা করা হচ্ছে কারণ সংকলনের সময় ObjectId অজানা এবং এটি সম্ভবত সমস্ত অবজেক্টআইডের তুলনায় একটি গড় বেছে নিচ্ছে।
এমন কোনও মোড আছে যেখানে এটি প্রথমে প্রোব ক্যোয়ারী করবে এবং তারপরে সারি অনুমানটি নির্ধারণ করতে এটি ব্যবহার করবে বা এটি অন্ধভাবে উড়তে হবে?
এই নির্দিষ্ট বৈশিষ্ট্যের কয়েকটি বস্তুর উপর অনেকগুলি মান (40 ক) এবং বিশাল সংখ্যাগুরুতে শূন্য রয়েছে। আমি এমন একটি ইঙ্গিত দিয়ে খুশি হব যেখানে প্রদত্ত যোগদানের জন্য সর্বাধিক প্রত্যাশিত সংখ্যা নির্দিষ্ট করা যেতে পারে। এটি একটি সাধারণ হান্টিং সমস্যা কারণ কিছু প্যারামিটারগুলি যোগদানের অংশ হিসাবে গতিশীলভাবে নির্ধারিত হতে পারে বা একটি দৃশ্যের মধ্যে আরও ভালভাবে স্থাপন করা যেতে পারে (ভেরিয়েবলগুলির জন্য কোনও সমর্থন নেই)।
কোনও প্যারামিটার রয়েছে যা ছিটকে টেম্পডিবির সম্ভাবনা হ্রাস করতে সামঞ্জস্য করা যেতে পারে (উদাহরণস্বরূপ ক্যোয়ারি প্রতি মিনিট মেমরি)? দৃ plan় পরিকল্পনার অনুমানের কোনও প্রভাব ছিল না।
2013.11.06 সম্পাদনা করুন : মন্তব্য এবং অতিরিক্ত তথ্যের প্রতিক্রিয়া:
এখানে ক্যোয়ারী প্ল্যান চিত্রগুলি রয়েছে। সতর্কতাগুলি কার্ডিনালিটি সম্পর্কে / রূপান্তর () এর সাথে ভবিষ্যদ্বাণী নিতে চাই:
অ্যারন বার্ট্র্যান্ডের মন্তব্য অনুসারে, আমি রূপান্তর ()টিকে একটি পরীক্ষা হিসাবে প্রতিস্থাপনের চেষ্টা করেছি:
create table Oav.SeekObject (
LookupId bigint not null primary key,
ObjectId bigint not null
);
insert into Oav.SeekObject (
LookupId, ObjectId
) VALUES (
1, 3540233
)
select Value
from Oav.ValueArray
where ObjectId = (select ObjectId
from Oav.SeekObject
where LookupId = 1)
and PropertyId = 2840
option (recompile);
অদ্ভুত তবে সফল আগ্রহের বিষয় হিসাবে এটি এটিকে শর্ট সার্কিটের অনুসন্ধানের অনুমতি দিয়েছে:
select Value
from Oav.ValueArray
where ObjectId = (select ObjectId
from Oav.ValueArray
where PropertyId = 2840
and ObjectId = 3540233
and Sequence = 2)
and PropertyId = 2840
option (recompile);
এই উভয়টিই যথাযথ কী অনুসন্ধানের তালিকায় তবে কেবল প্রথমটিতে অবজেক্টআইডের একটি "আউটপুট" তালিকাভুক্ত করা হয়। আমি অনুমান করি যে দ্বিতীয়টি আসলে সংক্ষিপ্ত সার্কিট?
সারি অনুমানের সাহায্যে কখনও একক-সারি প্রোব সম্পাদন করা হয় কিনা তা কি কেউ যাচাই করতে পারেন? কেবলমাত্র হিস্টগ্রাম অনুমানের মধ্যে অপ্টিমাইজেশন সীমাবদ্ধ করা ভুল বলে মনে হয় যখন কোনও একক-সারি পিকে লুকোচুরি হিস্টোগ্রামে অনুসন্ধানের যথার্থতাটিকে ব্যাপকভাবে উন্নত করতে পারে (বিশেষত যদি স্পিলের সম্ভাবনা বা ইতিহাস থাকে)। যখন এগুলির মধ্যে 10 টি সত্যিকারের ক্যোয়ারিতে যোগদান করে, আদর্শভাবে সেগুলি সমান্তরালে ঘটবে।
একটি পার্শ্ব নোট, যেহেতু sql_variant ক্ষেত্রের মধ্যেই তার বেস ধরণের (এসকিউএল_ভিআরআইএনT_PROPERTY = বেস টাইপ) সংরক্ষণ করে, তাই আমি "রূপান্তরযোগ্য" (যেমন দশমিকের সাথে স্ট্রিং নয় বরং অন্তর্নিহিত) হিসাবে রূপান্তর () প্রায় ব্যয়বহুল হওয়ার প্রত্যাশা করব অন্তর্নিহিত বা সম্ভবত int যাও বিগিন্ট)। যেহেতু এটি সংকলন সময়ে জানা যায় না তবে এটি ব্যবহারকারী দ্বারা জানা হতে পারে, সম্ভবত স্কেল_ভিভারেন্টগুলির জন্য "AssumeType (টাইপ, ...)" ফাংশন তাদের আরও স্বচ্ছভাবে চিকিত্সার অনুমতি দেয় would
declare @a bigint =
আপনি যেমনটি করেছেন তেমনিভাবে কোয়েরিটি বিভক্ত করা আমার কাছে একটি প্রাকৃতিক সমাধান বলে মনে হচ্ছে, কেন এটি অগ্রহণযোগ্য?
CONVERT()
কলামগুলিতে ব্যবহার করতে বাধ্য করে এবং তারপরে তাদের সাথে যোগ দিতে বাধ্য করে। বেশিরভাগ ক্ষেত্রে এটি অবশ্যই দক্ষ নয়। এই নির্দিষ্ট একটিতে, এটি রূপান্তরিত হওয়ার জন্য কেবলমাত্র একটি মান যা এটি সম্ভবত কোনও সমস্যা নয় তবে টেবিলে আপনার কী সূচকগুলি রয়েছে? ইএভি ডিজাইনগুলি সাধারণত যথাযথ সূচকে (সাধারণত সংকীর্ণ টেবিলগুলিতে প্রচুর সূচী বোঝায়) দিয়ে ভাল সম্পাদন করে।