मेरे पास इसके समान एक डेटाबेस संरचना है,
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 रिकॉर्ड को स्कैन करता है। ऐसा इसलिए है क्योंकि ज्वाइन क्लॉज में 'ands' और 'ors' होते हैं, लेकिन मैं अपना सिर इधर-उधर नहीं कर सकता कि SQL इंडेक्स की एक जोड़ी क्यों नहीं कर सकता, बजाए 'या' के बाईं ओर के, और 'या' के दाईं ओर एक है।
मैं इसके लिए स्पष्टीकरण चाहता हूं, क्वेरी को तेजी से बनाने का सुझाव नहीं जब तक कि क्वेरी को समायोजित किए बिना ऐसा नहीं किया जा सकता। कारण यह है कि मैं उपरोक्त क्वेरी को मर्ज प्रतिकृति ज्वाइन फ़िल्टर के रूप में उपयोग कर रहा हूं, इसलिए मैं दुर्भाग्य से किसी अन्य प्रकार के क्वेरी में नहीं जोड़ सकता।
अद्यतन: उदाहरण के लिए, इन प्रकारों को मैं जोड़ रहा हूं,
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टेबल पर कोई इंडेक्स है ?