我有一个由实体框架生成的 SQL 查询。它正在查找 2 个连接表之一中包含手机号码的约会。当查询仅使用两个 where 子句之一运行时,它的运行时间不到一秒,但是当添加 OR 时,它运行速度非常慢。
我注意到在执行计划中,它首先在表上进行联接,然后再过滤手机号码。为什么 SQL 选择首先对表进行联接,而不是通过使用任一 where 子句过滤掉记录来减少查询的大小?
SELECT
[Extent1].[AppointmentID] AS [AppointmentID],
[Extent1].[AppointmentNumber] AS [AppointmentNumber],
[Extent1].[ExamNumber] AS [ExamNumber],
[Extent1].[AppointmentTypeID] AS [AppointmentTypeID],
[Extent1].[DateCreated] AS [DateCreated],
[Extent1].[DateAppointment] AS [DateAppointment],
[Extent1].[Duration] AS [Duration],
[Extent1].[StorePatientID] AS [StorePatientID],
[Extent1].[CreatedByID] AS [CreatedByID],
[Extent1].[Comment] AS [Comment],
[Extent1].[IsPresent] AS [IsPresent],
[Extent1].[DateCompleted] AS [DateCompleted],
[Extent1].[IsForcedCompleted] AS [IsForcedCompleted],
[Extent1].[OptomNotes] AS [OptomNotes],
[Extent1].[DispenserNotes] AS [DispenserNotes],
[Extent1].[StoreID] AS [StoreID],
[Extent1].[OptomID] AS [OptomID],
[Extent1].[CalicoUniqueID] AS [CalicoUniqueID],
[Extent1].[CDEMemberNumber] AS [CDEMemberNumber],
[Extent1].[DSAMemberNumber] AS [DSAMemberNumber],
[Extent1].[BookingRef] AS [BookingRef],
[Extent1].[CustomerID] AS [CustomerID],
[Extent1].[isCheckinEmailSent] AS [isCheckinEmailSent],
[Extent1].[AccountNo] AS [AccountNo],
[Extent1].[PatientNo] AS [PatientNo],
[Extent1].[NewAccountNo] AS [NewAccountNo],
[Extent1].[OldPatientNo] AS [OldPatientNo],
[Extent1].[IsTest] AS [IsTest],
[Extent1].[AAMemberNo] AS [AAMemberNo],
[Extent1].[IsAAMember] AS [IsAAMember],
[Extent1].[CheckedInDate] AS [CheckedInDate],
[Extent1].[DeletionSource] AS [DeletionSource],
[Extent1].[DeletedDate] AS [DeletedDate],
[Extent1].[UpdateDate] AS [UpdateDate],
[Extent1].[IsDeleted] AS [IsDeleted],
[Extent1].[IsUpdated] AS [IsUpdated]
FROM
[dbo].[Appointments] AS [Extent1]
LEFT OUTER JOIN
[dbo].[AppointmentTemporaryPatientDetails] AS [Extent2] ON [Extent1].[AppointmentID] = [Extent2].[appointmentID]
INNER JOIN
[dbo].[StorePatients] AS [Extent3] ON [Extent1].[StorePatientID] = [Extent3].[StorePatientID]
WHERE
[Extent2].[MobileNumber] = N'0743149813'
OR [Extent3].[MobileNumber] = N'0743149813'
当没有
OR
的每个查询运行得很快时,您可以使用 UNION ALL
。所以改为
SELECT ... FROM ... WHERE Condition1 OR Condition2
使用
SELECT ... FROM ... WHERE Condition1
UNION ALL
SELECT ... FROM ... WHERE Condition2