我可以在不执行 2 个单独查询的情况下加快此查询速度吗?

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

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

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.