我有一个由实体框架生成的 SQL 查询。它根据两个连接表中的手机号码搜索约会。
单独地,表的每个 where 子句执行速度很快,但将它们与 OR 组合起来会减慢速度。
执行计划表明SQL首先执行表之间的连接,然后再应用手机号码过滤器。
为什么 SQL 优先考虑连接而不是过滤器,这可能会减少正在处理的数据的大小?
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]
INNER 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