Tôi có một cấu trúc cơ sở dữ liệu tương tự như thế này,
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
Điểm của bảng DispatchLink là liên kết hai bản ghi Dispatch với nhau. Nhân tiện, tôi đang sử dụng khóa chính tổng hợp trên bảng công văn của mình vì tính kế thừa, vì vậy tôi không thể thay đổi điều đó mà không phải chịu nhiều đau đớn. Ngoài ra bảng liên kết có thể không phải là cách chính xác để làm điều đó? Nhưng một lần nữa di sản.
Vì vậy, câu hỏi của tôi, nếu tôi chạy truy vấn này
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
Tôi không bao giờ có thể lấy nó để thực hiện tìm kiếm chỉ mục trên bảng DispatchLink. Nó luôn luôn quét toàn bộ chỉ mục. Điều đó là tốt với một vài bản ghi, nhưng khi bạn có 50000 trong bảng đó, nó sẽ quét 50000 bản ghi trong chỉ mục theo kế hoạch truy vấn. Đó là bởi vì có 'ands' và 'ors' trong mệnh đề nối, nhưng tôi không thể hiểu được lý do tại sao SQL không thể thực hiện một vài chỉ mục tìm kiếm, thay vào đó là một bên trái của 'hoặc', và một cho bên phải của 'hoặc'.
Tôi muốn một lời giải thích cho điều này, không phải là một gợi ý để làm cho truy vấn nhanh hơn trừ khi điều đó có thể được thực hiện mà không cần điều chỉnh truy vấn. Lý do là tôi đang sử dụng truy vấn trên làm bộ lọc kết hợp sao chép hợp nhất, vì vậy tôi không thể chỉ thêm vào một loại truy vấn khác.
CẬP NHẬT: Ví dụ, đây là các loại chỉ mục tôi đã thêm,
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)
Vì vậy, nó sử dụng các chỉ mục, nhưng thực hiện quét chỉ mục trên toàn bộ chỉ mục, vì vậy 50000 bản ghi nó quét 50000 bản ghi trong chỉ mục.
DispatchLink
bàn không?