为什么 SQL 在此查询中优先考虑连接而不是过滤? [已关闭]

问题描述 投票:0回答:1

我有一个由实体框架生成的 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'

sql sql-server query-optimization
1个回答
2
投票

当没有

OR
的每个查询运行得很快时,您可以使用
UNION ALL
。所以改为

SELECT ... FROM ... WHERE Condition1 OR Condition2  

使用

SELECT ... FROM ... WHERE Condition1
UNION ALL 
SELECT ... FROM ... WHERE Condition2  
© www.soinside.com 2019 - 2024. All rights reserved.