簡體   English   中英

T-SQL 查詢運行非常緩慢

[英]T-SQL query runs very slowly

我有一個查詢,我認為它異常長,所以我正在改變事物並嘗試不同的事物來加快它。 目前,返回少於 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 ,這部分查詢將盡可能快地運行,您可以單擊執行, @PtVisitOID中有 13,970 行. 所以剩下的 5% 來自查詢的 rest。 整個查詢又需要 3 到 4 分鍾。

所有的連接都在完全相同類型的列上,INT。

我可以相當快地從所有單個表中獲取 select 記錄,不到 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 內生成所有結果,實現了所需的加速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM