দাবি অস্বীকার: এই উত্তরের কিছু উপাদান ডিবিএ ফ্লিনচ করতে পারে। আমি এটি একটি খাঁটি পারফরম্যান্সের দৃষ্টিকোণ থেকে এগিয়ে যাচ্ছি - আপনি যখন সর্বদা সূচক স্ক্যানগুলি পান তখন কীভাবে সূচক সন্ধান করা যায়।
উপায় যে বাইরে, এখানে যায়।
আপনার ক্যোয়ারীটি "রান্নাঘরের সিঙ্ক ক্যোয়ারী" হিসাবে পরিচিত - এটি একটি একক ক্যোয়ারী যা সম্ভাব্য অনুসন্ধানের শর্তগুলির জন্য পরিপূরণ করে। যদি ব্যবহারকারী @status
কোনও মান সেট করে, আপনি সেই স্থিতিতে ফিল্টার করতে চান। যদি @status
হয় তবে NULL
সমস্ত স্ট্যাটাসগুলি ফিরিয়ে দিন এবং এই জাতীয় কিছু।
এটি সূচকের সাথে সমস্যাগুলির পরিচয় দেয়, তবে এগুলি ব্যস্ততার সাথে সম্পর্কিত নয়, কারণ আপনার সমস্ত অনুসন্ধানের শর্তগুলি "সমান" মানদণ্ডে রয়েছে।
এটি ব্যয়যোগ্য:
WHERE [status]=@status
এটি ব্যয়যোগ্য নয় কারণ এসকিউএল সার্ভারকে সূচকে ISNULL([status], 0)
একক মান সন্ধানের পরিবর্তে প্রতিটি সারিটির জন্য মূল্যায়ন করা প্রয়োজন :
WHERE ISNULL([status], 0)=@status
আমি রান্নাঘরের সিঙ্ক-সমস্যাটিকে আরও সহজ আকারে তৈরি করেছি:
CREATE TABLE #work (
A int NOT NULL,
B int NOT NULL
);
CREATE UNIQUE INDEX #work_ix1 ON #work (A, B);
INSERT INTO #work (A, B)
VALUES (1, 1), (2, 1),
(3, 1), (4, 1),
(5, 2), (6, 2),
(7, 2), (8, 3),
(9, 3), (10, 3);
আপনি নিম্নলিখিতটি চেষ্টা করে দেখলে আপনি একটি সূচক স্ক্যান পাবেন, যদিও এ সূচকের প্রথম কলাম:
DECLARE @a int=4, @b int=NULL;
SELECT *
FROM #work
WHERE (@a IS NULL OR @a=A) AND
(@b IS NULL OR @b=B);
এটি যাইহোক, একটি সূচক সিকার তৈরি করে:
DECLARE @a int=4, @b int=NULL;
SELECT *
FROM #work
WHERE @a=A AND
@b IS NULL;
যতক্ষণ আপনি ম্যানেজমেন্ট পরিমাণ পরিমাণ প্যারামিটার ব্যবহার করছেন (আপনার ক্ষেত্রে দুটি), আপনি সম্ভবত UNION
অনুসন্ধানের একগুচ্ছ হতে পারেন - মূলত অনুসন্ধানের মানদণ্ডের সমস্ত অনুমতি। আপনার যদি তিনটি মানদণ্ড থাকে তবে এটিকে অগোছালো লাগবে, চারটি সহ এটি সম্পূর্ণরূপে নিয়ন্ত্রণহীন। আপনাকে সতর্ক করা হয়েছে।
DECLARE @a int=4, @b int=NULL;
SELECT *
FROM #work
WHERE @a=A AND
@b IS NULL
UNION ALL
SELECT *
FROM #work
WHERE @a=A AND
@b=B
UNION ALL
SELECT *
FROM #work
WHERE @a IS NULL AND
@b=B
UNION ALL
SELECT *
FROM #work
WHERE @a IS NULL AND
@b IS NULL;
একটি সূচক সিক ব্যবহার করার জন্য এই চারটির মধ্যে তৃতীয়টির জন্য (B, A)
, যদিও আপনার দ্বিতীয় সূচকের প্রয়োজন হবে । আপনার ক্যোয়ারী কীভাবে এই পরিবর্তনগুলির সাথে দেখতে পারা যায় (এটিকে আরও পাঠযোগ্য করে তোলার জন্য ক্যোয়ারীর আমার রিফ্যাক্টরিং সহ) Here
DECLARE @Status int = NULL,
@IsUserGotAnActiveDirectoryUser bit = NULL;
SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName],
[Profession], [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE [Status]=@Status AND
@IsUserGotAnActiveDirectoryUser IS NULL
UNION ALL
SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName],
[Profession], [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE [Status]=@Status AND
@IsUserGotAnActiveDirectoryUser=1 AND ActiveDirectoryUser<>''
UNION ALL
SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName],
[Profession], [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE [Status]=@Status AND
@IsUserGotAnActiveDirectoryUser=0 AND (ActiveDirectoryUser IS NULL OR ActiveDirectoryUser='')
UNION ALL
SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName],
[Profession], [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE @Status IS NULL AND
@IsUserGotAnActiveDirectoryUser IS NULL
UNION ALL
SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName],
[Profession], [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE @Status IS NULL AND
@IsUserGotAnActiveDirectoryUser=1 AND ActiveDirectoryUser<>''
UNION ALL
SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName],
[Profession], [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE @Status IS NULL AND
@IsUserGotAnActiveDirectoryUser=0 AND (ActiveDirectoryUser IS NULL OR ActiveDirectoryUser='');
... প্লাস Employee
দুটি সূচী কলাম বিপরীত সঙ্গে আপনার অতিরিক্ত সূচি প্রয়োজন ।
সম্পূর্ণতার জন্য, আমার উল্লেখ করা উচিত যে x=@x
স্পষ্টভাবে এর অর্থ এটি x
হতে পারে না NULL
কারণ NULL
কখনও সমান হয় না NULL
। এটি ক্যোয়ারিকে কিছুটা সহজ করে।
এবং, হ্যাঁ, অ্যারন বার্ট্র্যান্ডের গতিশীল এসকিউএল উত্তর বেশিরভাগ ক্ষেত্রে (যেমন আপনি যখনই পুনরুদ্ধারগুলির সাথে থাকতে পারেন) ভাল পছন্দ।
@Status
?