এসকিউএল সার্ভারকে জিজ্ঞাসা শর্তগুলি লিখিত হিসাবে চালাতে বাধ্য করবেন?


14

আমি এসকিউএল সার্ভার 2008 আর 2 ব্যবহার করছি এবং আমার এই সিডো কোয়েরি (এসপি) রয়েছে:

select ...
from ...
WHERE    @LinkMode IS NULL
     AND (myColumn IN (...very long-running query...))
     ...
     ...

সমস্যাটি হ'ল ক্যোয়ারীটি কার্যকর করতে খুব দীর্ঘ সময় লাগে - এমনকি এসপি দিয়ে আমি এক্সিকিউট করলেও @LinkMode=2

যেমন আপনি লক্ষ্য করেছেন, দীর্ঘ-চলমান ক্যোয়ারি কেবল তখনই চালিত করা উচিত যদি @ লিঙ্কমোড নাল হয়, যা এখানে ঘটনা নয়। আমার ক্ষেত্রে @ লিঙ্কমোড = 2!

তবে, আমি যদি এটিকে পরিবর্তন করি:

 select ...
    from ...
    WHERE    1=2
         AND (myColumn IN (...very long time exeted query...))
     ...
     ...

এসপি নেই দ্রুত রান।

আমি এর আগে শুনেছি কখনও কখনও অপ্টিমাইজার মানদণ্ডের ক্রমটি অনুকূল করতে পারে

সুতরাং আমি জিজ্ঞাসা:

  • অপ্টিমাইজার যদি অন্য কোনও রুট চয়ন করে তবে চেক করার চেয়ে দ্রুত কী হতে পারে =null? আমি বোঝাতে চাইছি যে অন্যান্য দীর্ঘ ক্যোয়ারি চালানোর চেয়ে চেক if a==nullকরা অনেক দ্রুত ...

  • আমি কীভাবে এসকিউএল সার্ভারকে জিজ্ঞাসা চালাতে বাধ্য করব (যেমনটি একই আদেশ)?

উত্তর:


22

আপনি " ক্যাচ-অল ক্যোয়ারী " ফাঁদে পড়ে যাচ্ছেন, যা এখানে গেইল শ দ্বারা খুব ভালভাবে ব্যাখ্যা করেছেন ।

সমস্যার সংক্ষিপ্তসার হিসাবে: এসকিউএল সার্ভার সংকলনের পরে কোনও ক্যোয়ারী প্ল্যান ক্যাশে করে কোয়েরি সংকলনের উল্লেখযোগ্য ওভারহেডটিকে অপ্টিমাইজ করে এবং পরে কোনও সংকলনের আগে একটি মিলের ক্যোয়ারী পরিকল্পনার জন্য ক্যাশে পরীক্ষা করে। এখানে যে "মিলবে" তা ঘটে নিখুঁতভাবে পাঠ্যগত, তাই কোনও ভেরিয়েবলের আসল মান এটি প্রভাবিত করে না।

এটা ভাল সময় 99%, কিন্তু এটা এর কিছু ক্ষেত্রে খারাপ । এটির ক্ষেত্রে খারাপ এটির ক্ষেত্রে যখন কেউ একটি ক্লজটি নির্মাণের চেষ্টা করেন যখন এটি শর্ট সার্কিটের মতো সি-তে বিবৃতি দেওয়া ইত্যাদি This এটি ভাল কাজ করে না, কারণ এসকিউএল সংকলককে একটি ক্যোয়ারী পরিকল্পনা করতে হবে যা নির্বিশেষে কাজ করবে will প্যারামিটারের মানগুলি আসলে কী, এবং যেখানে এই বিভাগটিতে এই "চতুর" লজিক্যাল স্যুইচিং-শর্তগুলি পরিচালনা করতে পারে তার একমাত্র উপায় হ'ল সারণীগুলি যেভাবে চলে যায় কেবল পুরো টেবিলটিকে স্ক্যান করে, একটি সাধারণ ব্রুট-ফোর্স পরিকল্পনা তৈরি করে to কোনও সূচকে কোনও লাভ ছাড়াই।

অবাক করার মতো বিষয় নয়, এটি প্যারামিটার / ভেরিয়েবলের মান কী তা বিবেচনা করে তা একত্রে ধীর করে দেয়।


8

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

আপনি যা কিছু করতে পারেন তা হ'ল:

IF @LinkMode IS NULL
BEGIN
    select ...
    from ...
    WHERE (myColumn IN (...very long time exeted query...))
         ...
         ...
END
ELSE
BEGIN
    select ...
    from ...
    WHERE ...
         ...
END

3

যদি এটি কোনও বিকল্প হয় তবে ক্যোয়ারির উপযুক্ত ফর্মটি সম্পাদন করতে একটি আইএফ স্টেটমেন্ট ব্যবহার করুন। এছাড়াও, এসকিউএল-তে আপনি ডিবি ইঞ্জিনকে বলবেন কী করবেন, কীভাবে করবেন না - জিনিসগুলি শুরু থেকে শেষ পর্যন্ত কার্যকর করা হয় না। এটি ঠিক কী করবে তা অনুমান করা শক্ত হতে পারে। আপনি সম্ভবত এটি জানেন যদিও;)


2

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

ভবিষ্যতে রেফারেন্সের জন্য আপনি যদি এটি এখনও ব্যবহার না করেন, ডায়নামিক এসকিউএল-এর জন্য কার্যকারী উদাহরণ সহ একটি মারাত্মক কুৎসিত সাইট এখানে উদাহরণস্বরূপ পাওয়া যাবে: http://sqlusa.com/bestpractices/dynamicsql/


1

আমি যদি আইএফ / ইএলএসই নির্মাণের সুপারিশ করব .. যদি কোনও কারণেই এটি আপনার পক্ষে কার্যকর না হয় তবে আপনি সর্বদা উইন্ডো রিকম্পিল বিকল্পটি ব্যবহার করে বিবেচনা করতে পারেন ..


আপনি যদি "যদি / অন্য নির্মাণ" কেমন দেখতে চান তা বিশদভাবে বলতে পারেন? : ডি
জকোলেব্রান্ড

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