查询由于WHERE子句的结构而减慢

时间:2016-02-10 00:53:29

标签: sql sql-server-2012 where-clause

我有一个查询创建一个感兴趣的人口的@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的速度一样快。

谢谢,

1 个答案:

答案 0 :(得分:1)

我怀疑问题是因为表变量在Account上没有索引。如果你在账户上添加一个索引,那么我希望会有更好的表现。

有关如何添加索引的详细信息,请参阅此问题的答案:Creating an index on a table variable