为什么我在 Sybase 数据库中的查询花费太多时间?

Why does my Query in Sybase database take too much time?

我的查询执行时间大约需要 27 分钟。我真的不知道为什么要花这么长时间。特别是我有一个具有相同输出的其他查询,但这个只需要 1.4 秒。 我想知道这两个查询之间的平均区别是什么,以及为什么第一个查询需要这么长时间才能执行。

第一个,大约需要 27 分钟:

select ATTACHMENT_ID from PES_ESB_ATTACHMENT where ATTACHMENT_ID in(                                                                        
            select distinct ATTACHMENT_ID from PES_ESB_ATTACHMENT A 
                left outer join PES_ESB_SHIFTDOCUMENTATION SD on A.MOMENT=SD.ATTACHMENT_MOMENT 
                left outer join PES_ESB_SHIFTTASK T on A.MOMENT=T.ATTACHMENT_MOMENT
                where 
                                                                           SD.ATTACHMENT_MOMENT is null
                                                                          and 
                                                                           T.ATTACHMENT_MOMENT is null
                                                                          And ( 163697831 - A.MOMENT ) > 86400 
            )

第二个 1.4 秒:

select ATTACHMENT_ID from PES_ESB_ATTACHMENT where ATTACHMENT_ID in(                                                                        
            select ATTACHMENT_ID from (
                           select distinct ATTACHMENT_ID, A.MOMENT
                                           from PES_ESB_ATTACHMENT A 
                               left outer join PES_ESB_SHIFTDOCUMENTATION SD on A.MOMENT=SD.ATTACHMENT_MOMENT 
                               left outer join PES_ESB_SHIFTTASK T on A.MOMENT=T.ATTACHMENT_MOMENT
                               where 
                                                                                           SD.ATTACHMENT_MOMENT is null
                                                                                          and 
                                                                                           T.ATTACHMENT_MOMENT is null
                           )tbl1
            )
            and 
                           ( 163697831 - MOMENT ) > 86400

怎么会有这么大的差距?

简单。 在第二个查询中,优化器在 PES_ESB_ATTACHMENT.

查询的最外层有一个额外的过滤器可用

and ( 163697831 - MOMENT ) > 86400

看起来这是在长查询的相关查询中。 这显然允许服务器通过相关子查询减少它必须 运行 的记录。

我建议您查看查询计划,它们看起来会有很大不同。