【问题标题】:adding conditions makes query slow-oracle添加条件使查询变慢oracle
【发布时间】:2020-06-17 17:02:13
【问题描述】:

亲爱的 Stackoverflow 国家,
这篇文章与查询的性能有关。
我执行如下简单查询

select wonum, siteid from workorder where workorder.siteid= 'MCT' and istask=0 和 decode(workorder.pmnum,null,workorder.reportdate,workorder.targstartdate) >= '12-MAR-18' 和 decode(workorder.pmnum,null,workorder.reportdate,workorder.targstartdate)

完美执行,耗时 6 秒
当我添加了一个条件 type ='MAINTENANCE' 时,查询需要 28 秒

select wonum, siteid from workorder where workorder.siteid= 'MCT' and istask=0 and type ='MAINTENANCE' 和 decode(workorder.pmnum,null,workorder.reportdate,workorder.targstartdate) >= '12-MAR-18' 和 decode(workorder.pmnum,null,workorder.reportdate,workorder.targstartdate) --28.73

据我所知,我需要在工单表上创建一个索引,
但我无法弄清楚哪个字段,我需要创建一个索引以及它如何帮助快速运行查询。
(注意:已经有一个索引(ind_1 - 带有属性 wonum,siteid )系统
请帮助。如果这是对专业人士的基本问题,请道歉

【问题讨论】:

    标签: database oracle performance


    【解决方案1】:

    一般来说,在where 子句中涉及的列上创建索引。正如您所描述的,索引type可能会有所帮助。

    真的有用吗?谁知道...检查解释计划。收集表的统计信息,以便优化器知道要做什么(即选择最佳执行计划)。然后你也许能弄清楚该怎么做。


    此外,您似乎在强制 Oracle 执行隐式转换。这么说

    some_date >= '12-mar-18'
    

    意味着 - 如果 some_date 列的数据类型是 date(看起来是这样;否则你会得到错误的结果) - Oracle 必须将 string '12-mar-18' 转换为有效的date 通过应用正确的格式掩码(例如dd-mon-yy)。你为什么想这么做?提供date重视自己!

    some_date >= date '2018-03-12'
    

    some_date >= to_date('12-mar-18', 'dd-mon-yy')
    

    但要小心; mar 表示“三月”。这个查询在我的克罗地亚语的数据库中肯定会失败,而且我们这里没有任何mar 月份(它是ožu)。 也许你宁愿在这里坚持使用数字,即12-03-18。再注意一点:这个值很难理解; 12 是什么?是这个月的第 12 天,还是 12 月? 03 也是如此。因此,总是 使用不会引起混淆的值,方法是提供日期文字(始终采用 yyyy-mm-dd 格式 - 我首先建议的格式),或者使用带有适当格式掩码的 to_date 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多