【发布时间】:2021-05-16 08:34:32
【问题描述】:
我有一个查询正在处理,我认为它异常长,所以我正在改变一些事情并尝试不同的事情来加快它。目前,返回少于 11k 条记录需要 3 到 4 分钟。
这是我的查询:
DECLARE @PtVistitOID TABLE (
PatientVisitOID INT NOT NULL
)
INSERT INTO @PtVistitOID
SELECT DISTINCT PatientVisitOID
FROM smsdss.c_covid_ptvisitoid_tbl
WHERE PatientVisitOID IS NOT NULL
SELECT
A.OBJECTID AS PatientVisit_OID,
A.PATIENTACCOUNTID,
A.PatientVisitExtension_OID
FROM
[SC_server].[Soarian_Clin_Prd_1].DBO.HPatientVisit AS A
INNER JOIN
[SC_server].[Soarian_Clin_Prd_1].dbo.HExtendedPatientVisit AS B ON A.PatientVisitExtension_OID = B.objectid
INNER JOIN
@PtVistitOID AS C ON A.ObjectID = C.PatientVisitOID
--WHERE A.ObjectID IN (SELECT PatientVisitOID FROM @PtVistitOID);
当我查看估计的查询执行计划时,它说大约 95% 的时间用于将记录插入到表中 @PtVisitOID,这部分查询将尽可能快地运行,您可以单击执行,有 13,970 @PtVisitOID 中的行。所以剩下的 5% 来自查询的其余部分。整个查询又需要 3 到 4 分钟。
所有连接都在完全相同类型的列上,INT。
我可以相当快地从所有单独的表中选择记录,不到 5 秒。尤其是当我添加最后一个 INNER JOIN 或将其更改为 WHERE A.ObjectID IN (SELECT PatientVisitOID FROM @PtVisitOID) 时,查询时间会增加。
有什么想法吗?
【问题讨论】:
-
请问@PtVistitOID 中有多少条记录
-
我将编辑问题以反映此信息,13,970
-
有些表来自链接服务器?您应该在某处尝试
remote join提示;目前所有远程记录都可能被读取到当前数据库并加入到这里。 -
@table变量在旧版本的 SQL Server 上表现糟糕,因为它们总是被估计为包含 1 行。考虑改用#temp表,在插入到表之后但在 select 语句中使用之前可能使用update statistics #PtVistitOID with fullscan。 -
@MCP_infiltrator 我想大概就是这样。表变量和链接服务器相结合会导致速度变慢。
标签: sql sql-server sql-server-2014