আমার কাছে এটির মতো একটি ডাটাবেস কাঠামো রয়েছে,
CREATE TABLE [dbo].[Dispatch](
[DispatchId] [int] NOT NULL,
[ContractId] [int] NOT NULL,
[DispatchDescription] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Dispatch] PRIMARY KEY CLUSTERED
(
[DispatchId] ASC,
[ContractId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[DispatchLink](
[ContractLink1] [int] NOT NULL,
[DispatchLink1] [int] NOT NULL,
[ContractLink2] [int] NOT NULL,
[DispatchLink2] [int] NOT NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Dispatch] ([DispatchId], [ContractId], [DispatchDescription]) VALUES (1, 1, N'Test')
GO
INSERT [dbo].[Dispatch] ([DispatchId], [ContractId], [DispatchDescription]) VALUES (2, 1, N'Test')
GO
INSERT [dbo].[Dispatch] ([DispatchId], [ContractId], [DispatchDescription]) VALUES (3, 1, N'Test')
GO
INSERT [dbo].[Dispatch] ([DispatchId], [ContractId], [DispatchDescription]) VALUES (4, 1, N'Test')
GO
INSERT [dbo].[DispatchLink] ([ContractLink1], [DispatchLink1], [ContractLink2], [DispatchLink2]) VALUES (1, 1, 1, 2)
GO
INSERT [dbo].[DispatchLink] ([ContractLink1], [DispatchLink1], [ContractLink2], [DispatchLink2]) VALUES (1, 1, 1, 3)
GO
INSERT [dbo].[DispatchLink] ([ContractLink1], [DispatchLink1], [ContractLink2], [DispatchLink2]) VALUES (1, 3, 1, 2)
GO
ডিসপ্যাচলিঙ্ক টেবিলের বিন্দুটি দুটি ডিসপ্যাচ রেকর্ড একসাথে লিঙ্ক করা। উত্তরাধিকারের কারণে আমি আমার প্রেরণের টেবিলে একটি সংযুক্ত প্রাথমিক কীটি ব্যবহার করছি, তাই আমি খুব ব্যথা ছাড়াই এটিকে পরিবর্তন করতে পারি না। এছাড়াও লিঙ্ক টেবিলটি এটি করার সঠিক উপায় নাও হতে পারে? কিন্তু আবার উত্তরাধিকার।
সুতরাং আমার প্রশ্ন, আমি যদি এই কোয়েরি চালাতে
select * from Dispatch d
inner join DispatchLink dl on d.DispatchId = dl.DispatchLink1 and d.ContractId = dl.ContractLink1
or d.DispatchId = dl.DispatchLink2 and d.ContractId = dl.ContractLink2
আমি ডিসপ্যাচলিঙ্ক টেবিলটিতে কোনও সূচী অনুসন্ধান করতে এটি কখনই পেতে পারি না। এটি সর্বদা একটি পূর্ণ সূচক স্ক্যান করে। কয়েকটি রেকর্ডের সাথে এটি ঠিক আছে, তবে আপনার যখন সেই টেবিলটিতে 50000 থাকে এটি ক্যোয়ারী পরিকল্পনা অনুসারে সূচীতে 50000 রেকর্ড স্ক্যান করে। এর কারণ হচ্ছে জোড় দফায় 'অ্যান্ডস' এবং 'ওরস' রয়েছে, তবে এসকিউএল কেন বেশ কয়েকটি সূচক সন্ধান করতে পারছে না, তার পরিবর্তে 'বা' এর বাম দিকে, এবং একটি 'বা' এর ডান পাশের জন্য।
আমি এর জন্য একটি ব্যাখ্যা চাই, কোয়েরিটি দ্রুত না করার পরামর্শ নয়, যদি না কোয়েরিটি সামঞ্জস্য না করেই করা যায়। কারণটি হ'ল আমি উপরের ক্যোয়ারীটিকে মার্জ প্রতিরূপে যোগদানের ফিল্টার হিসাবে ব্যবহার করছি, সুতরাং দুর্ভাগ্যক্রমে আমি কেবল অন্য ধরণের ক্যোয়ারিতে যুক্ত করতে পারি না।
আপডেট: উদাহরণস্বরূপ এগুলি হ'ল সূচিগুলির প্রকারগুলি আমি যুক্ত করছি,
CREATE NONCLUSTERED INDEX IDX1 ON DispatchLink (ContractLink1, DispatchLink1)
CREATE NONCLUSTERED INDEX IDX2 ON DispatchLink (ContractLink2, DispatchLink2)
CREATE NONCLUSTERED INDEX IDX3 ON DispatchLink (ContractLink1, DispatchLink1, ContractLink2, DispatchLink2)
সুতরাং এটি সূচকগুলি ব্যবহার করে তবে পুরো সূচক জুড়ে একটি সূচক স্ক্যান করে, তাই 50000 রেকর্ডগুলি সূচকে 50000 রেকর্ড স্ক্যান করে।




DispatchLinkটেবিলে আপনার কি কোনও সূচক আছে ?