ฉันมีโครงสร้างฐานข้อมูลคล้ายกับสิ่งนี้
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
จุดของตาราง DispatchLink คือการเชื่อมโยงบันทึกการจัดส่งสองรายการเข้าด้วยกัน โดยวิธีการที่ฉันใช้คีย์หลักผสมในตารางการจัดส่งของฉันเพราะมรดกดังนั้นฉันไม่สามารถเปลี่ยนแปลงได้โดยไม่ต้องเจ็บปวดมาก ตารางการเชื่อมโยงอาจไม่ถูกต้องหรือไม่ แต่มรดกอีกครั้ง
ดังนั้นคำถามของฉันถ้าฉันเรียกใช้แบบสอบถามนี้
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
ฉันไม่สามารถทำให้ดัชนีค้นหาบนตาราง DispatchLink ได้ มันจะทำการสแกนดัชนีแบบเต็มเสมอ นั่นเป็นเรื่องปกติที่มีระเบียนไม่กี่รายการ แต่เมื่อคุณมี 50,000 รายการในตารางนั้นจะสแกน 50000 ระเบียนในดัชนีตามแผนแบบสอบถาม เป็นเพราะมี 'ands' และ 'ors' ในส่วนคำสั่งการเข้าร่วม แต่ฉันไม่สามารถเข้าใจได้ว่าทำไม SQL ไม่สามารถทำดัชนีสองสามรายการแทนหนึ่งสำหรับด้านซ้ายของ 'หรือ' และอีกอันสำหรับด้านขวาของ 'หรือ'
ฉันต้องการคำอธิบายสำหรับสิ่งนี้ไม่ใช่ข้อเสนอแนะเพื่อทำให้การสืบค้นเร็วขึ้นเว้นแต่ว่าจะทำได้โดยไม่ต้องปรับแบบสอบถาม เหตุผลก็คือฉันใช้คิวรีข้างต้นเป็นตัวกรองการรวมแบบจำลองผสานดังนั้นฉันจึงไม่สามารถเพิ่มในแบบสอบถามชนิดอื่นได้อย่างน่าเสียดาย
UPDATE: เช่นนี้เป็นประเภทของดัชนีที่ฉันเพิ่ม
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)
ดังนั้นจึงใช้ดัชนี แต่ทำการสแกนดัชนีทั่วทั้งดัชนีดังนั้น 50,000 บันทึกจะสแกน 50000 บันทึกในดัชนี
DispatchLink
โต๊ะหรือไม่?