繁体   English   中英

如何添加CTE以提高存储过程的性能?

[英]How to add a CTE to improve stored procedure performance?

我有一个存储过程,如下所示:

CREATE PROCEDURE [Schema].[ProcName]
    (@PhoneNum  VARCHAR(100)
     @EmailAddr VARCHAR(100)
     @DriverLic VARCHAR(100)
     @EligiblityDate VARCHAR(10))
AS
BEGIN
SET NOCOUNT ON;
    DECLARE @Phone BIT = 0,
            @Email BIT = 0,
            @License BIT = 0

    IF (SELECT Value FROM Table 
        WHERE Product = 'ProductA' 
          AND @EligibilityDate BETWEEN EligStart AND EligEnd 
          AND ProductType = 1 
          AND Value = @PhoneNum 
          AND IsActive = 1) 
        SET @Phone = 1

    IF (SELECT Value FROM Table 
        WHERE Product = 'ProductA' 
          AND @EligibilityDate BETWEEN EligStart AND EligEnd 
          AND ProductType = 2 
          AND Value = @EmailAddr 
          AND IsActive = 1) 
        SET @Email = 1

    IF (SELECT Value FROM Table 
        WHERE Product = 'ProductA' 
          AND @EligibilityDate BETWEEN EligStart AND EligEnd 
          AND ProductType = 3 
          AND Value = @DriverLic 
          AND IsActive = 1) 
        SET @License = 1

    SELECT 
        @Phone AS Phone,
        @Email AS Email,
        @License AS License;

    RETURN 0;

我希望通过使用CTE来提高此查询的性能。 但是,我不确定该怎么做,因为我以前从未使用过CTE。

因此,为此,CTE对您没有好处。 CTE适用于您在一个查询中重新使用子选择,或者您要进行递归操作时,它们通常不如我们希望的那样有用。 由于查询的复杂性,我担心只需要先掌握基础知识,而担心CTE会在您发现自己需要这些CTE时,而不是无缘无故地联系他们。

我认为您需要的是以下内容:

Create Procedure [Schema].[ProcName]
    (@PhoneNum   VARCHAR(100),
    @EmailAddr  VARCHAR(100),
    @DriverLic  VARCHAR(100),
    @EligiblityDate VARCHAR(10))
AS
BEGIN

    select
        max(case when ProductType = 1 and [Value] = @PhoneNum then 1 else 0 end) as PhoneNum,
        max(case when ProductType = 2 and [Value] = @EmailAddr then 1 else 0 end) as EmailAddr,
        max(case when ProductType = 3 and [Value] = @DriverLic then 1 else 0 end) as DriverLic
    from [Table]
    WHERE
        Product = 'ProductExample'
        AND @EligibilityDate BETWEEN EligStart and EligEnd
        AND IsActive = 1
END

将多个查询(在将这样的代码复制时,您很可疑!)合并到单个查询中具有类似的效果,但是不需要子选择。

我想你要这个

CREATE PROCEDURE [Schema].[ProcName]
    (@PhoneNum  VARCHAR(100),
     @EmailAddr VARCHAR(100),
     @DriverLic VARCHAR(100),
     @EligiblityDate VARCHAR(10))
AS
BEGIN
SET NOCOUNT ON;
    DECLARE @Phone BIT = 0,
            @Email BIT = 0,
            @License BIT = 0

    SELECT @Phone = case when ProductType = 1 and Value = @PhoneNum then 1 else 0 end,
        @Email = case when ProductType = 2 and Value = @EmailAddr then 1 else 0 end,
        @License = case when ProductType = 3 and Value = @DriverLic then 1 else 0 end
    FROM Table 
        WHERE Product = 'ProductA' 
          AND @EligibilityDate BETWEEN EligStart AND EligEnd 
          AND ProductType = 1 

    SELECT 
        @Phone AS Phone,
        @Email AS Email,
        @License AS License;

    RETURN 0;
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM