আমি একটি সন্ধান আশা করি যদিও একটি স্ক্যান পাচ্ছেন


9

আমার একটি SELECTবিবৃতি অপ্টিমাইজ করা প্রয়োজন তবে এসকিউএল সার্ভার সর্বদা সন্ধানের পরিবর্তে একটি সূচক স্ক্যান করে। এটি অবশ্যই এমন কোয়েরি যা অবশ্যই কোনও সঞ্চিত পদ্ধতিতে রয়েছে:

CREATE PROCEDURE dbo.something
  @Status INT = NULL,
  @IsUserGotAnActiveDirectoryUser BIT = NULL    
AS

    SELECT [IdNumber], [Code], [Status], [Sex], 
           [FirstName], [LastName], [Profession], 
           [BirthDate], [HireDate], [ActiveDirectoryUser]
    FROM Employee
    WHERE (@Status IS NULL OR [Status] = @Status)
    AND 
    (
      @IsUserGotAnActiveDirectoryUser IS NULL 
      OR 
      (
        @IsUserGotAnActiveDirectoryUser IS NOT NULL AND       
        (
          @IsUserGotAnActiveDirectoryUser = 1 AND ActiveDirectoryUser <> ''
        )
        OR
        (
          @IsUserGotAnActiveDirectoryUser = 0 AND ActiveDirectoryUser = ''
        )
      )
    )

এবং এটি সূচক:

CREATE INDEX not_relevent ON dbo.Employee
(
    [Status] DESC,
    [ActiveDirectoryUser] ASC
)
INCLUDE (...all the other columns in the table...); 

পরিকল্পনা:

পরিকল্পনা পরিকল্পনা

এসকিউএল সার্ভার কেন একটি স্ক্যান বেছে নিয়েছিল? আমি কীভাবে এটি ঠিক করতে পারি?

কলাম সংজ্ঞা:

[Status] int NOT NULL
[ActiveDirectoryUser] VARCHAR(50) NOT NULL

স্থিতি পরামিতি হতে পারে:

NULL: all status,
1: Status= 1 (Active employees)
2: Status = 2 (Inactive employees)

#UserGotAnActiveDirectoryUser হতে পারে:

NULL: All employees
0: ActiveDirectoryUser is empty for that employee
1: ActiveDirectoryUser  got a valid value (not null and not empty)

আপনি কি প্রকৃত বাস্তবায়ন পরিকল্পনাটি কোথাও পোস্ট করতে পারেন (এটির একটি চিত্র নয়, তবে এক্সএমএল আকারে .sqlplan ফাইল)? আমার অনুমান যে আপনি পদ্ধতিটি পরিবর্তন করেছেন কিন্তু বিবৃতি পর্যায়ে আসলে একটি নতুন সংকলন পান নি। আপনি কি প্রশ্নের কিছু পাঠ্য পরিবর্তন করতে পারেন (যেমন টেবিলের নামের সাথে স্কিমা উপসর্গ যুক্ত করা ) এবং তার জন্য একটি বৈধ মানটি পাস করতে পারেন @Status?
অ্যারন বারট্র্যান্ড

1
এছাড়াও সূচী সংজ্ঞা প্রশ্নটি উত্থাপন করে - কীটি চালু আছে Status DESC? সেখানে কতগুলি মান রয়েছে Status, সেগুলি কী (যদি সংখ্যাটি ছোট হয়) এবং প্রতিটি মান প্রায় সমানভাবে উপস্থাপিত হয়? আমাদের আউটপুটটি দেখানSELECT TOP (20) [Status], c = COUNT(*) FROM dbo.Employee GROUP BY [Status] ORDER BY c DESC;
অ্যারন বার্ট্র্যান্ড

উত্তর:


11

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

আমি এটিকে "রান্নাঘর সিঙ্ক" পদ্ধতি বলি , কারণ আপনি রান্নাঘরের সিঙ্ক সহ সমস্ত জিনিস সরবরাহ করার জন্য একটি প্রশ্নের জিজ্ঞাসা করছেন।

আমার এখানে এবং এখানে আমার সমাধান সম্পর্কে ভিডিও রয়েছে পাশাপাশি এটি সম্পর্কে একটি ব্লগ পোস্ট রয়েছে তবে মূলত, এই জাতীয় প্রশ্নের জন্য আমার সেরা অভিজ্ঞতা হ'ল:

  • স্টেটমেন্টটি গতিশীলভাবে তৈরি করুন - এটি আপনাকে কলামগুলি উল্লেখ করে এমন ক্লজগুলি ছাড়ার অনুমতি দেবে যার জন্য কোনও পরামিতি সরবরাহ করা হয়নি, এবং নিশ্চিত করে যে আপনার কাছে এমন একটি পরিকল্পনা রয়েছে যা মানগুলির সাথে উত্তীর্ণ প্রকৃত প্যারামিটারগুলির জন্য যথাযথভাবে অনুকূলিত হবে ।
  • ব্যবহারOPTION (RECOMPILE) - এটি নির্দিষ্ট পরামিতি মানগুলিকে ভুল ধরণের পরিকল্পনার জন্য জোর করা থেকে বিরত রাখে, বিশেষত যখন আপনার কাছে ডেটা স্কিউ, খারাপ পরিসংখ্যান থাকে বা যখন কোনও বিবৃতি প্রথম প্রয়োগ হয় তখন একটি এটপিক্যাল মান ব্যবহার করে যা পরে এবং আরও ঘন ঘন এর চেয়ে আলাদা পরিকল্পনার দিকে পরিচালিত করে মৃত্যুদণ্ড কার্যকর।
  • সার্ভার বিকল্পটি ব্যবহার করুনoptimize for ad hoc workloads - এটি আপনার পরিকল্পনার ক্যাশে দূষিত করা থেকে শুধুমাত্র একবার ব্যবহৃত ক্যোয়ারী প্রকরণগুলিকে বাধা দেয়।

অ্যাডহক ওয়ার্কলোডের জন্য অনুকূলিতকরণ সক্ষম করুন:

EXEC sys.sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure 'optimize for ad hoc workloads', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure 'show advanced options', 0;
GO
RECONFIGURE WITH OVERRIDE;

আপনার পদ্ধতিটি পরিবর্তন করুন:

ALTER PROCEDURE dbo.Whatever
  @Status INT = NULL,
  @IsUserGotAnActiveDirectoryUser BIT = NULL
AS
BEGIN 
  SET NOCOUNT ON;
  DECLARE @sql NVARCHAR(MAX) = N'SELECT [IdNumber], [Code], [Status], 
     [Sex], [FirstName], [LastName], [Profession],
     [BirthDate], [HireDate], [ActiveDirectoryUser]
   FROM dbo.Employee -- please, ALWAYS schema prefix
   WHERE 1 = 1';

   IF @Status IS NOT NULL
     SET @sql += N' AND ([Status]=@Status)'

   IF @IsUserGotAnActiveDirectoryUser = 1
     SET @sql += N' AND ActiveDirectoryUser <> ''''';
   IF @IsUserGotAnActiveDirectoryUser = 0
     SET @sql += N' AND ActiveDirectoryUser = ''''';

   SET @sql += N' OPTION (RECOMPILE);';

   EXEC sys.sp_executesql @sql, N'@Status INT, @Status;
END
GO

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

এই ক্ষেত্রে, সম্ভাব্য Statusমানগুলির সেট এবং এই মানগুলি কীভাবে বিতরণ করা হয়েছে তার উপর নির্ভর করে , OPTION (RECOMPILE)সম্ভবত এটি প্রয়োজনীয় হবে না। তবে যদি আপনার কাছে এমন কয়েকটি মান থাকে যা 100 টি সারি প্রদান করবে এবং কিছু মান যা কয়েকশো হাজার উপার্জন করবে, আপনি এটি সেখানে চাইতে পারেন (এমনকি সিপিইউ ব্যয় করেও, যা এই কোয়েরির জটিলতায় প্রান্তিক হওয়া উচিত) যাতে আপনি পারেন যতটা সম্ভব মামলার সন্ধান করুন। মানগুলির পরিসীমা যদি যথেষ্ট সীমাবদ্ধ হয় তবে আপনি গতিশীল এসকিউএল দিয়েও কিছু জটিল করতে পারেন, যেখানে আপনি বলে থাকেন যে "এর জন্য আমার এটির খুব বেছে বেছে মান রয়েছে @Status, সুতরাং যখন নির্দিষ্ট মানটি পাস করা হয়, তখন কোয়েরি পাঠ্যে এই সামান্য পরিবর্তন করুন যাতে এটিকে একটি পৃথক ক্যোয়ারী হিসাবে বিবেচনা করা হয় এবং সেই পরম মানের জন্য অনুকূলিত করা হয়। "


3
আমি এই পন্থাটি বহুবার ব্যবহার করেছি এবং এটি যেভাবেই করা উচিত বলে মনে করে যেভাবে জিনিসগুলি করতে অপ্টিমাইজারটি পাওয়া এটি একটি দুর্দান্ত উপায়। কিম ট্রিপ এখানে একটি অনুরূপ সমাধান সম্পর্কে কথা বলেছেন: sqlskills.com/blogs/kimberly/high-performance-procesures এবং কয়েক বছর আগে তিনি PASS এ করেছিলেন এমন একটি সেশনের একটি ভিডিও রয়েছে যা সত্যিই এটি কেন কাজ করে তা নিয়ে পাগলের বিবরণে যায়। এটি বলছে, মিস্টার বার্ট্র্যান্ড এখানে যা বলেছিল তাতে এটি সত্যিই একটি টন যোগ করে না। এটি সেই সরঞ্জামগুলির মধ্যে একটি যার প্রত্যেককে তাদের টুলবেল্টে রাখা উচিত। এটি প্রকৃতপক্ষে এই সমস্ত ক্যাচারের জন্য কিছু ব্যথা বাঁচাতে পারে।
মিসকিনার

3

দাবি অস্বীকার: এই উত্তরের কিছু উপাদান ডিবিএ ফ্লিনচ করতে পারে। আমি এটি একটি খাঁটি পারফরম্যান্সের দৃষ্টিকোণ থেকে এগিয়ে যাচ্ছি - আপনি যখন সর্বদা সূচক স্ক্যানগুলি পান তখন কীভাবে সূচক সন্ধান করা যায়।

উপায় যে বাইরে, এখানে যায়।

আপনার ক্যোয়ারীটি "রান্নাঘরের সিঙ্ক ক্যোয়ারী" হিসাবে পরিচিত - এটি একটি একক ক্যোয়ারী যা সম্ভাব্য অনুসন্ধানের শর্তগুলির জন্য পরিপূরণ করে। যদি ব্যবহারকারী @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। এটি ক্যোয়ারিকে কিছুটা সহজ করে।

এবং, হ্যাঁ, অ্যারন বার্ট্র্যান্ডের গতিশীল এসকিউএল উত্তর বেশিরভাগ ক্ষেত্রে (যেমন আপনি যখনই পুনরুদ্ধারগুলির সাথে থাকতে পারেন) ভাল পছন্দ।


3

আপনার মূল প্রশ্নটি "কেন" বলে মনে হচ্ছে এবং আমি মনে করি আপনি কয়েক বছর আগে টেকএডে অ্যাডাম মাচানিকের এই দুর্দান্ত উপস্থাপনাটির 55 মিনিটের প্রায় উত্তর খুঁজে পেতে পারেন ।

আমি 55 মিনিটের 55 মিনিটে উল্লেখ করেছি তবে পুরো উপস্থাপনাটি সময়ের জন্য মূল্যবান। আপনি যদি আপনার ক্যোয়ারির ক্যোয়ারী প্ল্যানটি দেখেন তবে আমি নিশ্চিত যে আপনি এটির অনুসন্ধানের জন্য অবশিষ্টাংশ পূর্বাভাস পেয়েছেন। মূলত এসকিউএল সূচকের সমস্ত অংশ "দেখতে" পারে না কারণ এর কিছু অংশ অসমতা এবং অন্যান্য শর্ত দ্বারা লুকানো থাকে। ভবিষ্যদ্বাণীটির উপর ভিত্তি করে একটি সুপার সেটের জন্য ফলাফল একটি সূচক স্ক্যান। ফলাফলটি spooled করা হয় এবং তারপরে অবশিষ্টাংশগুলি ব্যবহার করে পুনরায় স্ক্যান করা হয়।

স্ক্যান অপারেটর (এফ 4) এর বৈশিষ্ট্যগুলি পরীক্ষা করে দেখুন এবং সম্পত্তি তালিকায় আপনার কাছে "অনুসন্ধানের পূর্বাভাস" এবং "ভবিষ্যদ্বাণী" উভয় আছে কিনা তা দেখুন।

অন্যরা যেমন সূচিত করেছে, ক্যোয়ারীটি ঠিক তত সূচী করা কঠিন। আমি সম্প্রতি অনেকগুলি অনুরূপগুলিতে কাজ করছি এবং প্রত্যেকটির আলাদা সমাধান প্রয়োজন। :(


0

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

আপনার জিজ্ঞাসাটি জটিল নয়, সুতরাং আপনি যদি একটি কার্যকরকরণ পরিকল্পনা পোস্ট করতে পারেন তবে আপনাকে সহায়তা করার জন্য আমাদের আরও ভাল ধারণা থাকতে পারে।


1 মিলিয়ন টেবিল থেকে কয়েক হাজার সারি ফিল্টার করে, আমি এখনও একটি সন্ধান চাই - পুরো টেবিলটি স্ক্যান করার চেয়ে এটি এখনও বিশাল পারফরম্যান্সের উন্নতি।
ড্যানিয়েল হুটমাচার

-6

এটি কেবল আসল বিন্যাসিত

DECLARE @Status INT = NULL,
        @IsUserGotAnActiveDirectoryUser BIT = NULL    

SELECT [IdNumber], [Code], [Status], [Sex], [FirstName], [LastName], [Profession],
       [BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE (@Status IS NULL OR [Status]=@Status)  
AND (            @IsUserGotAnActiveDirectoryUser IS NULL 
      OR (       @IsUserGotAnActiveDirectoryUser IS NOT NULL 
           AND (     @IsUserGotAnActiveDirectoryUser = 1 
                 AND ActiveDirectoryUser <> '') 
           OR  (     @IsUserGotAnActiveDirectoryUser = 0 
                 AND ActiveDirectoryUser =  '')
         )
    )

এটি পুনর্বিবেচনা - এটি সম্পর্কে 100% নিশ্চিত নয় তবে (সম্ভবত) এটির জন্য
আরও একবার চেষ্টা করুন বা সম্ভবত এটি সমস্যা হতে চলেছে যা
এটি অ্যাক্টিভ ডিরেক্টরিউসার নালকে ভেঙে ফেলবে

  WHERE isnull(@Status, [Status]) = [Status]
    AND (      (     isnull(@IsUserGotAnActiveDirectoryUser, 1) = 1 
                 AND ActiveDirectoryUser <> '' ) 
           OR  (     isnull(@IsUserGotAnActiveDirectoryUser, 0) = 0 
                 AND ActiveDirectoryUser =  '' )
        )

3
এই উত্তর কীভাবে ওপি-র প্রশ্নের সমাধান করে তা আমার কাছে অস্পষ্ট।
এরিক

@ এরিক কি আমরা পছন্দ করতে পারি যে ওপি চেষ্টা করে দেখুন? দু'জন বা চলে গেল। আপনি কি নিশ্চিতরূপে জানেন যে এটি কোয়েরি পারফরমেন্সে সহায়তা করতে পারে না?
পাপারাজ্জো

@ ypercubeᵀᴹ isUserGotAnActiveDirectoryUser টি সরানো হয় না। এই দুটি অপ্রয়োজনীয় একটি OR অপসারণ করে এবং ইসুসারগোটঅ্যাক্টিভেক্টিরিয়েক্টরিউসারটি বাতিল হয়। আপনি কি নিশ্চিত যে এই কোয়েরিটি ওপিতে কীভাবে দ্রুত চলবে না?
পাপারাজ্জো

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