首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用什么技术来优化SQL查询

我应该使用什么技术来优化SQL查询
EN

Stack Overflow用户
提问于 2015-07-03 06:44:25
回答 1查看 56关注 0票数 0

嗨,我有一个存储过程,用于在搜索时获取记录。此过程返回数百万条记录。但是,在搜索过程中发现了一个bug,当满足某些条件时,在某些场景中也会返回重复的记录。我发现了为什么返回重复记录的错误:下面是有问题的查询:

代码语言:javascript
复制
With cteAutoApprove (AcctID, AutoApproved,DecisionDate)                
AS (
select 
    A.AcctID,
    CAST(autoEnter AS SMALLINT) AS AutoApproved, 
    DecisionDate 
from 
(
    SELECT 
        awt.AcctID, 
        MIN(awt.dtEnter) AS DecisionDate
    FROM
        dbo.AccountWorkflowTask awt 
        JOIN dbo.WorkflowTask wt ON awt.WorkflowTaskID = wt.WorkflowTaskID
        Join Task T on T.TaskID = wt.TaskID
    WHERE
        (
            (T.TaskStageID = 3 and awt.ReasonIDExit is NULL) 
            OR (wt.TaskID IN (9,15,201,208,220,308,319,320,408,420,508,608,620,1470,1608,1620))
        )
    GROUP BY 
        awt.AcctID
) A 
Join AccountWorkflowTask awt1 
    on awt1.dtEnter=A.DecisionDate and awt1.AcctID=a.AcctID
), 

由于awt1.dtEnter=A.DecisionDate上的条件,此CTE返回重复记录,某些帐户的dtEnter完全相同。这就是它返回重复记录的原因。

我的问题是我应该用什么来防止这种情况。我不能在这里使用Distinct,因为它肯定会减慢搜索过程。我应该使用Rank还是稠密Rank,以便优化它,并且查询执行结果所需的时间更短?还是其他的技巧?请帮帮我,因为我被困在这里了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 07:16:22

显然,我不能在这里测试这个查询,但在这里,它似乎是一个很好的row_number候选(不是排名,相同的日期在相同的记录上,您仍然有多条记录):

代码语言:javascript
复制
select 
    A.AcctID,
    CAST(autoEnter AS SMALLINT) AS AutoApproved, 
    DecisionDate 
from 
(
    SELECT 
        awt.AcctID, 
        awt.dtEnter AS DecisionDate,
        autoEnter,
        row_number() over (partition by awt.acctid order by awt.dtEnter) rnr
    FROM
        dbo.AccountWorkflowTask awt 
        JOIN dbo.WorkflowTask wt ON awt.WorkflowTaskID = wt.WorkflowTaskID
        Join Task T on T.TaskID = wt.TaskID
    WHERE
        (
            (T.TaskStageID = 3 and awt.ReasonIDExit is NULL) 
            OR (wt.TaskID IN (9,15,201,208,220,308,319,320,408,420,508,608,620,1470,1608,1620))
        )
) A 
where rnr = 1

这样,分组就不再必要了:第一次约会是由row_number完成的。第二个联接也不是,子查询已经包含了所有的数据(优化器足够聪明,不会对它不需要的行做任何事情)

PS。因为sql server窗口函数的工作效率非常高,所以使用row_number而不是min() - join构造,很可能会提高性能,即使没有双行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31200259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档