【问题标题】:Optimize this query?优化这个查询?
【发布时间】:2011-08-11 06:18:39
【问题描述】:
SELECT MAX (tran_date)
FROM   abc
WHERE  p_id = p_p_id
AND    flag = 'Y'
AND    (   (    p_c_number IS NULL
            AND c_number IS NULL
           )
        OR (c_number = p_c_number)
       )
AND    (   (    p_m_number IS NULL
            AND m_number IS NULL
           )
        OR (m_number = p_m_number)
       )
AND    (   (    p_s_number IS NULL
            AND s_number IS NULL
           )
        OR (s_number = p_s_number)
       );

我使用 oracle 作为 RDBMS,我想优化这个查询

  1. 计划 SELECT STATEMENT ALL_ROWSCost:357 字节:39 基数:1
    2 SORT AGGREGATE 字节:39 基数:1
    1 表访问全表 abc 成本:357 字节:312 基数:8

【问题讨论】:

  • 您是否尝试过使用 RDBMS 的 EXPLAIN 或类似命令来查看查询的估计执行计划?围绕这些列中的大多数创建索引可能会有所帮助,查询计划将帮助您查看哪些列。
  • @cdhowie:在 oracle 中检索执行计划比像在 mysql 中那样仅在 EXPLAIN 前加 ;-) 但实际上,每个优化都需要从计划检查开始跨度>
  • 我会把解释计划发给你
  • 对,我不是在假装是Oracle专家,只是表示看查询计划比问SO更好。提供问题中的计划肯定会有所帮助。
  • @gaurav - 您可以编辑您的帖子以包含查询计划吗?这样您就可以对其进行格式化,使其更易于阅读。

标签: sql oracle10g


【解决方案1】:
  • 能否发布查询计划?
  • 表上有哪些索引?
  • 哪些引用是列名,哪些是绑定变量?我的猜测是P_IDFLAGC_NUMBERM_NUMBERS_NUMBERABC 中的列,而P_P_IDP_C_NUMBERP_M_NUMBER 和@98765430 是bind变量,但这只是猜测。
  • 各种条件的选择性如何?特别是,表中的哪一部分行具有特定的P_ID 值? FLAG 为“Y”的分数是多少?

【讨论】:

  • :index存在于flag上,p_id不为null,c_number,m_number,s_number没有约束,直接传给上面游标的查询。
  • p_id 和标志值不为空,所以它存在于所有行中
  • @gaurav - 所以表上只有一个索引,FLAG 上的索引? P_ID 上没有索引?或者表中的任何其他列?表中有多少行?有多少 FLAG 值为“Y”?
  • 记录数为 27,138,带有 y 值的标志为 99,但问题是我正在处理虚拟数据而不是实际生产数据,而且数据不止于此。
  • @gaurav - 您是在说真实数据并没有如此严重的偏差(即超过 0.33% 的真实数据的 FLAG 为“Y”?)或者您只是在说生产数据库中有更多数据但分布相同?是否有任何其他列(例如 P_ID)比 FLAG 更具选择性?
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2011-04-25
  • 2011-11-25
相关资源
最近更新 更多