我有一个查询创建一个感兴趣的人口的@TABLE。它的结构是这样的:
DECLARE @SepsisTbl TABLE (
PK INT IDENTITY(1, 1) PRIMARY KEY
, Name VARCHAR(500)
, MRN INT
, Account INT
, Age INT -- Age at arrival
, Arrival DATETIME
, Triage_StartDT DATETIME
, Left_ED_DT DATETIME
, Disposition VARCHAR(500)
, Mortality CHAR(1)
);
WITH Patients AS (
SELECT UPPER(Patient) AS [Name]
, MR#
, Account
, DATEDIFF(YEAR, AgeDob, Arrival) AS [Age_at_Arrival]
, Arrival
, Triage_Start
, TimeLeftED
, Disposition
, CASE
WHEN Disposition IN (
'Medical Examiner', 'Morgue'
)
THEN 'Y'
ELSE 'N'
END AS [Mortality]
FROM SMSDSS.c_Wellsoft_Rpt_tbl
WHERE Triage_Start IS NOT NULL
AND (
Diagnosis LIKE '%SEPSIS%'
OR
Diagnosis LIKE '%SEPTIC%'
)
)
INSERT INTO @SepsisTbl
SELECT * FROM Patients
从现在开始,我还有5个相同类型的查询正在查找不同类型的订单,然后我LEFT OUTER JOIN
到此表中。我的问题是,当我从这里更改表的where子句时,为什么我的性能会下降太多:
AND A.Account IN (
SELECT Account
FROM SMSDSS.c_Wellsoft_Rpt_tbl
WHERE (
Diagnosis LIKE '%SEPSIS%'
OR
Diagnosis LIKE '%SEPTIC%'
)
到此:
AND A.Account IN (
SELECT Account
FROM @SepsisTbl
)
运行时间从2.5分钟到超过10分钟仍然没有结果。 CTE本身的运行速度与按F5的速度一样快。
谢谢,
答案 0 :(得分:1)
我怀疑问题是因为表变量在Account上没有索引。如果你在账户上添加一个索引,那么我希望会有更好的表现。
有关如何添加索引的详细信息,请参阅此问题的答案:Creating an index on a table variable