2011-08-11 115 views
0
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语句ALL_ROWSCost:357字节:39基数:1级
    2排序骨料字节:39基数:1
    1个TABLE ACCESS FULL TABLE ABC成本:357字节:312基数:8
+0

您是否尝试过使用RDBMS的'EXPLAIN'或类似命令来查看查询的预计执行计划?围绕大多数这些列创建索引可能会有所帮助,查询计划将帮助您查看哪些列。 – cdhowie

+0

@cdhowie:在oracle中执行计划的检索比仅仅在mysql中预先使用'EXPLAIN'要困难得多;-)但是的确,每个优化都需要在计划检查时开始 – zerkms

+0

我会给你发送解释计划 – gaurav

回答

3
  • 你能发布查询计划?
  • 什么指标在桌子上存在吗?
  • 其中这些引用的是列名的,哪些是绑定变量?我的猜测是P_IDFLAGC_NUMBERM_NUMBERS_NUMBERABCP_P_IDP_C_NUMBERP_M_NUMBERP_S_NUMBER是绑定变量,但是这只是一个猜测列。
  • 各种条件的选择性如何?特别是,表中的哪一部分行具有特定的P_ID值? 'Y'的分数是FLAG
+0

:索引存在在标志上,p_id不为空,并且对c_number,m_number和s_number没有约束,它们被传递给上述游标的查询。 – gaurav

+0

的p_id和标志值不为空,所以它在所有行存在 – gaurav

+0

@gaurav - 所以只存在一个索引放在桌子上,在'FLAG'的指数? “P_ID”没有索引?或者表格中的任何其他列?表中有多少行?有多少个'FLAG'值为'Y'? –