【问题标题】:Can we merge 2 SQL with same logic with just marginally difference?我们可以将 2 个具有相同逻辑的 SQL 合并在一起,只是略有不同吗?
【发布时间】:2013-09-29 10:51:47
【问题描述】:

我有 2 个 SQL,

    SELECT  @AlreadyPerformedActionsPerDay = COUNT(*)
    FROM    UserRewardActions URA
            INNER JOIN UserRewardActionTypes URAT ON URAT.ID = URA.UserRewardActionTypeID
    WHERE   URA.UserID = @UserID
            AND (
                    @UserRewardActionTypeID = 1 -- Because the register action is not per-date-wise(only allows once in lifetime)
                    OR CreationDateInUtc BETWEEN CAST(GETUTCDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETUTCDATE() AS DATE)) -- Inside Current Date
                );

    SELECT  @AlreadyRedeemedTheCurrentAction = 1
    FROM    UserRewardActions URA
            INNER JOIN UserRewardActionTypes URAT ON URAT.ID = URA.UserRewardActionTypeID
    WHERE   URA.UserID = @UserID
            AND CreationDateInUtc BETWEEN CAST(GETUTCDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETUTCDATE() AS DATE)) -- Inside Current Date
            AND URL IS NOT NULL 
            AND URL = @Url;

第一个 SQL 是今天抓取的用户操作总数。其次,检查当前 url 是否已被同一用户使用。这可以。但我希望合并此查询以解决性能问题。

【问题讨论】:

    标签: sql performance tsql sql-server-2008-r2


    【解决方案1】:

    好吧,在重新格式化您的查询后,如下所示。我可以看到他们有不同的标准。

    DECLARE @from DateTime;
    DECLARE @to DateTime;
    
    SET @from  = cast(getutcdate() as Date);
    SET @to = dateadd(DAY, 1, @from));
    
    SELECT
                    @AlreadyPerformedActionsPerDay = COUNT(*)
        FROM
                    UserRewardActions URA
            JOIN
                    UserRewardActionTypes URAT
                        ON URAT.ID = URA.UserRewardActionTypeID
            WHERE
                    URA.UserID = @UserID
                AND
                    (
                        @UserRewardActionTypeID = 1
                     OR 
                        CreationDateInUtc BETWEEN @from AND @to
                    );
    
    SELECT
                    @AlreadyRedeemedTheCurrentAction = 1
        FROM
                    UserRewardActions URA
             JOIN
                    UserRewardActionTypes URAT
                        ON URAT.ID = URA.UserRewardActionTypeID
        WHERE
                    URA.UserID = @UserID
            AND
                    CreationDateInUtc BETWEEN @from AND @to
            AND
                    URL IS NOT NULL 
            AND
                    URL = @Url;
    

    【讨论】:

    • OK 临时表在这里有意义吗?
    • @user960567,不,UserRewardActions 上的覆盖索引对于列 UserID 然后 CreationDateInUtc 可能会。特别是如果你在WITH 子句中包含UserRewardActionTypeIDURL,这取决于你的数据分布。
    猜你喜欢
    • 2021-10-27
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多