T-SQL 查询运行很慢
T-SQL query runs very slowly
我有一个正在执行的查询,我认为它异常长,所以我正在改变一些事情并尝试不同的事情来加快它的速度。目前 return 少于 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% 的时间花在了将记录插入 table @PtVisitOID
,这部分查询将 运行 尽可能快地单击执行,@PtVisitOID
中有 13,970 行。所以剩下的 5% 来自查询的其余部分。整个查询再次耗时 3 到 4 分钟。
所有连接都在完全相同类型 INT 的列上。
我可以 select 记录所有个人 table 相当快,不到 5 秒。特别是当我添加最后一个 INNER JOIN
或将其更改为 WHERE A.ObjectID IN (SELECT PatientVisitOID FROM @PtVisitOID)
时,查询时间会增加。
有什么想法吗?
我重新调整了编写查询的方式,很高兴地注意到执行时间缩短到了 1 到 2 秒之间。我确实撤回了较少的记录,但这很好,因为不再返回的其他记录是无用的。这本身不是加速的原因,重组才是。
DECLARE @PtVistitOID TABLE (
PatientVisitOID INT NOT NULL
)
INSERT INTO @PtVistitOID
SELECT DISTINCT PatientVisitOID
FROM smsdss.c_covid_ptvisitoid_tbl
WHERE PatientVisitOID IS NOT NULL
DECLARE @UserDefinedString TABLE (
PatientVisit_OID INT,
PatientAccountID INT,
Covid_Indicator VARCHAR(1000)
)
INSERT INTO @UserDefinedString
SELECT A.OBJECTID AS PatientVisit_OID,
A.PATIENTACCOUNTID,
--A.PatientVisitExtension_OID,
B.UserDefinedString20
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
WHERE A.PatientVisitExtension_OID IS NOT NULL
AND B.UserDefinedString20 IS NOT NULL
AND B.UserDefinedString20 != ''
SELECT A.PatientVisitOID,
B.PatientAccountID,
B.Covid_Indicator
FROM @PtVistitOID AS A
INNER JOIN @UserDefinedString AS B
ON A.PatientVisitOID = B.PatientVisit_OID
通过采纳不混合本地和链接服务器表的建议,通过选择将结果全部放在本地@tables 中,实现了所需的加速。
我有一个正在执行的查询,我认为它异常长,所以我正在改变一些事情并尝试不同的事情来加快它的速度。目前 return 少于 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% 的时间花在了将记录插入 table @PtVisitOID
,这部分查询将 运行 尽可能快地单击执行,@PtVisitOID
中有 13,970 行。所以剩下的 5% 来自查询的其余部分。整个查询再次耗时 3 到 4 分钟。
所有连接都在完全相同类型 INT 的列上。
我可以 select 记录所有个人 table 相当快,不到 5 秒。特别是当我添加最后一个 INNER JOIN
或将其更改为 WHERE A.ObjectID IN (SELECT PatientVisitOID FROM @PtVisitOID)
时,查询时间会增加。
有什么想法吗?
我重新调整了编写查询的方式,很高兴地注意到执行时间缩短到了 1 到 2 秒之间。我确实撤回了较少的记录,但这很好,因为不再返回的其他记录是无用的。这本身不是加速的原因,重组才是。
DECLARE @PtVistitOID TABLE (
PatientVisitOID INT NOT NULL
)
INSERT INTO @PtVistitOID
SELECT DISTINCT PatientVisitOID
FROM smsdss.c_covid_ptvisitoid_tbl
WHERE PatientVisitOID IS NOT NULL
DECLARE @UserDefinedString TABLE (
PatientVisit_OID INT,
PatientAccountID INT,
Covid_Indicator VARCHAR(1000)
)
INSERT INTO @UserDefinedString
SELECT A.OBJECTID AS PatientVisit_OID,
A.PATIENTACCOUNTID,
--A.PatientVisitExtension_OID,
B.UserDefinedString20
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
WHERE A.PatientVisitExtension_OID IS NOT NULL
AND B.UserDefinedString20 IS NOT NULL
AND B.UserDefinedString20 != ''
SELECT A.PatientVisitOID,
B.PatientAccountID,
B.Covid_Indicator
FROM @PtVistitOID AS A
INNER JOIN @UserDefinedString AS B
ON A.PatientVisitOID = B.PatientVisit_OID
通过采纳不混合本地和链接服务器表的建议,通过选择将结果全部放在本地@tables 中,实现了所需的加速。