যেখানে কোনও দফা যেখানে একবারে আসে তার পরিবর্তে নাল চেক করার কোনও উপায় আছে?


12

আমার কাছে একটি বড় টেবিলের কাছে এমন একটি ক্যোয়ারী রয়েছে যা দেখতে এই রকম দেখাচ্ছে:

declare @myIdParam int = 1

select * 
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)

এর মতো বেশ কয়েকটি অনুরূপ শর্ত রয়েছে যেখানে ক্লজ, এবং প্রচুর যোগ দেয়, তবে এটি একটি সংক্ষিপ্তসার।

কার্যকরভাবে, যদি @myIdParam শূন্য হয়, আমরা এই প্যারামিটারটি ব্যবহার করে ফলাফলগুলি সীমাবদ্ধ করতে চাই না।

আমি কোনও ডিবি সমর্থক নই, তবে আমার পরীক্ষাগুলি থেকে মনে হচ্ছে যে এই নাল চেকটি প্রতিটি রেকর্ডের জন্য করা হয়েছে এবং কোনওভাবেই অনুকূলিত করা হয়নি।

যদি আমি নাল চেকটি অপসারণ করি এবং ধরে নিই যে প্যারামিটারটি নাল নয়, তাত্ক্ষণিকভাবে কোয়েরিটি ফিরে আসে। অন্যথায়, এটি দশ সেকেন্ড পর্যন্ত সময় নেয়।

এটিকে কী অপ্টিমাইজ করার কোনও উপায় আছে যাতে চেকটি রানটাইমে একবারেই করা হয়?


1
এই উত্তরটি দেখুন: স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 3415582/… টিএল; ডাঃ ব্যবহারOPTION(RECOMPILE)
ভেরসেলি

@ ওভারসেলি এটি কৌশলটি করে। এই প্রশ্নটি বিবেচনা করে সত্যই optionচ্ছিক পরামিতিগুলি সম্পর্কে, আমি বলতে চাই এটি আপনার যুক্ত লিঙ্কটির একটি সদৃশ।
মাইস্টাগোগ

সম্ভবত, তবে এটি 6 বছর আগের পোস্ট। স্কেল সার্ভার 2014 বা 2016 এর সাথে হয়ত একটি নতুন পদ্ধতি রয়েছে। (আমি এটি পুনরুদ্ধার না করে 2014 এ পরীক্ষা করেছিলাম এবং চিরকালই নিয়েছি)
ভেরসেলি

যেহেতু আপনার আসল ক্যোয়ারিতে অনেকগুলি paraচ্ছিক পরামিতি রয়েছে, তাই গতিশীল এসকিউএল সেরা কর্মক্ষমতা সরবরাহ করবে। বিষয়ের উপর একটি নিবন্ধের জন্য sommarskog.se/dyn-search.html দেখুন ।
ড্যান গুজম্যান

@ ডানগুজম্যান ভেরসেলাই লিঙ্কিত প্রশ্নে বর্ণিত হিসাবে রিকোমাইল ব্যবহার করে ক্যোয়ারির সময়টিকে এক মিনিটের মধ্যেই উচ্চতর বাছাইয়ের মানদণ্ডের সাথে বাস্তবে তাত্ক্ষণিকভাবে কাটান। আমি এটিকে ভারসাম্যপূর্ণ পারফরম্যান্স এবং পঠনযোগ্যতার জন্য সেরা বিকল্প হিসাবে বিবেচনা করি।
মাইস্টাগোগ

উত্তর:


8

একটি উপায় হ'ল ডায়নামিক এসকিউএল ব্যবহার করা, নাল চেক ব্যবহার করে option অংশটি claচ্ছিকভাবে যুক্ত করতে।

declare @myIdParam int = 1
declare @vc_dynamicsql varchar(max)

set @vc_dynamicsql = 'select * from myTable where 1=1'

if @myIdParam is not null
    set @vc_dynamicsql = @vc_dynamicsql + ' and  myTable.Id = @myIdParam'

EXECUTE sp_executesql @vc_dynamicsql

2
আমি সত্যিই এটি না করতে পছন্দ করব, তবে এটি একটি সমাধান। আমার আশা এই যে কেউ একজন আরও ভাল একটি সঙ্গে আসে।
মাইস্টাগোগ

1
এই শ্রেণীর অনুসন্ধান ক্যোয়ারি হ্যান্ডেল করার সেরা উপায়। Stackoverflow উত্তর @vercelli দ্বারা উল্লেখ করা এই কিভাবে করতে হবে জন্য মহান রেফারেন্স ধারণ করে।
ম্যাক্স ভার্নন

এটি সর্বোত্তম পদ্ধতি তবে আমি লক্ষ্য করেছি যে @params প্যারামিটারটি sp_ExecuteSQLঅনুপস্থিত এবং @vc_dynamicsqlপ্যারামিটারটি একটি হওয়া দরকার NVARCHAR
জেমস অ্যান্ডারসন

4

যে কোনও সময় আপনি কোনও কলাম `ISNULL (@var, table.col) এর চারপাশে কোনও ফাংশন রাখুন উদাহরণস্বরূপ আপনি একটি সূচক ব্যবহারের এসকিউএল এর ক্ষমতা সরিয়ে ফেলেন। আপনি যদি একক কোয়েরিতে রাখতে চান তবে এটি সত্যিই সেরা পারফর্মিং বিকল্প।

@var IS NULL or @var = table.col

অন্যথায় আপনার কাছে দুটি বিকল্প রয়েছে। প্রথমটি হ'ল ডায়নামিক এসকিউএল এবং @ মাইস্টাগোগের উত্তরটি এর জন্য পর্যাপ্ত অন্যথায় আপনি দুটি প্রশ্ন রেখে যেতে পারেন:

IF @var is NULL
     SELECT * FROM table
ELSE
     SELECT * FROM table WHERE @var = col

এই ফর্ম্যাট এবং গতিশীল এসকিউএল উভয় ক্ষেত্রেই আপনি প্রতিটি প্রশ্নের জন্য আলাদাভাবে ক্যোয়ারী প্ল্যান পাবেন (যা সম্ভাব্যরূপে আরও ভাল পারফরম্যান্স দেবে) yield


প্রশ্নের মধ্যে থাকা এসকিএল আইএসএনআরএল বা অন্য কোনও ফাংশন ব্যবহার করছে না।
মাইস্টাগোগ

@ মাইস্টাগোগুআই আমি এখন মুছে দেওয়া উত্তরটি উল্লেখ করছি।
কেনেথ ফিশার

0

ভাল, আপনি করতে পারেন:

declare @myIdParam int = 1;

select *
from myTable
where nullif(@myIdParam, myTable.Id) is null;

তবে মনে রাখবেন যে nullif()ফাংশনটি মূলত একটি মোড়কের উপরে case। এটি কোনও রূপোর বুলেট নয় যা চৌম্বকভাবে মুছে ফেলা হয় ORএবং এইভাবে ক্যোয়ারিকে গতি দেয়।


ফাংশনগুলি এমন কোনও স্থানে ব্যবহারের ক্ষেত্রে পারফরম্যান্সের উপর নেতিবাচক প্রভাব ফেলে কারণ এটি
সূচির

@ মিস্টাগোগ, হ্যাঁ - এটি সাধারণত অনুসন্ধানের শর্তগুলি অ-সারগ্রেবল করে তোলে। হায় হায়, ডায়নামিক এসকিউএল বা একাধিক এসকে অবলম্বন না করে আপনার প্রশ্নের উত্তর কীভাবে দিতে হয় তা আমি একমাত্র জানি UNION। আমার যখন এই সঠিক কাজটি ছিল তখন আমি গতিশীল এসকিউএল চয়ন করেছি।
রজার ওল্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.