【问题标题】:Why does my Query in Sybase database take too much time?为什么我在 Sybase 数据库中的查询花费了太多时间?
【发布时间】:2020-04-26 22:14:16
【问题描述】:

我的查询的执行时间大约需要 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

怎么会有这么大的差距?

【问题讨论】:

  • 但是两个查询的连接是一样的
  • 一般来说,拥有查询计划、表/索引结构以及在某些情况下为所有引用表提供 optdiag 输出会有所帮助;实际查询运行的性能指标(通过 MDA 表和/或set statistics io,time on 也可以提供帮助);当然,我们现在谈论的是一项对于这种交换媒介来说可能“太大”的事业;另一种选择是尽可能简单地解释查询试图完成什么,例如,在其他 2x 表中找到没有匹配项的 PES_ESB_ATTACHMENT/ATTACHMENT_IDs
  • 我之前的评论假设这是 Sybase ASE; Sybase 有 4 种不同的 RDBM 产品(ASE、SQLAnywhere、IQ、Advantage),因此了解您使用的 Sybase 产品以及版本也会有所帮助

标签: sql database performance sybase


【解决方案1】:

简单。 在第二个查询中,优化器在 PES_ESB_ATTACHMENT 查询的最外层有一个额外的过滤器可用。

and ( 163697831 - MOMENT ) > 86400

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

我建议您查看查询计划,它们看起来会非常不同。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多