【问题标题】:Slow Oracle query缓慢的 Oracle 查询
【发布时间】:2014-12-18 18:44:49
【问题描述】:

我正在为客户构建 Web 应用程序,但我遇到了特定 SQL 查询的问题。

查询是:

select order_header.order_no,
       order_header.purchase_order_no,
       order_header.entry_date,
       order_header.delivery_date,
       order_totals.total_quantity
from   order_header,
       order_totals
where  order_header.order_no = order_totals.order_no

我已经做了一些故障排除,这个:

where  order_header.order_no = order_totals.order_no

是问题所在。使用此行的 SQL 查询需要 35 秒(导致 DataTables 有时甚至超时),没有它它是即时的。

所以,我知道问题所在,但我不是 DBA,所以不知道解决方案。

这不是我的数据库,所以我需要将解决方案发送给 DBA 进行排序,这样我才能继续我的工作。像

“嘿,你介意在 B 台上做 A 让 C 加速吗?”

我只是不知道实际需要做什么!

【问题讨论】:

  • 你调查过查询执行计划吗? order_header.order_noorder_totals.order_no 上是否有索引?
  • @SylvainLeroux 你好。查看一开始发送的 DBA 列表,order_header.order_noUnique Indexorder_totals.order_no 什么都没有......
  • 您确定第二个选项是“即时”吗?考虑到原件花了多长时间,仅打印出结果应该会花费很长时间。
  • @DaaaahWhoosh 1.5 秒无线路。 35 秒连线。

标签: php sql oracle oracle8i


【解决方案1】:

首先在 order_header.order_no 和 order_totals.order_no 上添加一个索引,并检查两个列是否属于同一类型。 对于其他优化,我们应该讨论数据。 不要忘记更新统计数据

【讨论】:

    【解决方案2】:

    请您的数据库

    在 order_header 和 order_total 的 order_no 列上添加索引

    这应该有助于解决您当前的问题。此外,查找 JOIN 并更改您的查询以使用 JOIN 语法。

     select order_header.order_no,
               order_header.purchase_order_no,
               order_header.entry_date,
               order_header.delivery_date,
               order_totals.total_quantity
        from   order_header 
        join   order_totals ON order_header.order_no = order_totals.order_no
    

    【讨论】:

    • 嗨。他们使用Oracle 8i,我认为这是不可能的。我记得一些关于 8i 的事情。感谢您的其他回答:-)
    • 在两个表上而不是只在一个表上都有一个索引可能只会用 index full scan 替换 table full scan。这真的能带来很大的进步吗?
    • Sylvain Leroux,你是认真问这个问题的吗???如果您不知道表扫描和索引扫描之间的区别,那么您不应该评论这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多