Sql 优化此查询?
我使用oracle作为RDBMS,我想优化这个查询Sql 优化此查询?,sql,oracle10g,Sql,Oracle10g,我使用oracle作为RDBMS,我想优化这个查询 计划 SELECT语句所有行成本:357字节:39基数:1 2排序聚合字节:39基数:1 1表访问完整表abc成本:357字节:312基数:8 你能发布查询计划吗 表上存在哪些索引 哪些引用是列名,哪些是绑定变量?我的猜测是P\u ID,FLAG,C\u NUMBER,M\u NUMBER和S\u NUMBER是ABC中的列,P\u ID,P\u C\u NUMBER,P\u M\u NUMBER是绑定变量,但这只是一个猜测 各种条件的选择性
2排序聚合字节:39基数:1
1表访问完整表abc成本:357字节:312基数:8
- 你能发布查询计划吗
- 表上存在哪些索引
- 哪些引用是列名,哪些是绑定变量?我的猜测是
,P\u ID
,FLAG
,C\u NUMBER
和M\u NUMBER
是S\u NUMBER
中的列,ABC
,P\u ID
,P\u C\u NUMBER
是绑定变量,但这只是一个猜测P\u M\u NUMBER
- 各种条件的选择性如何?特别是,表中哪一部分行具有特定的
值?哪个分数的P\u ID
标志
为“Y”
- 你能发布查询计划吗
- 表上存在哪些索引
- 哪些引用是列名,哪些是绑定变量?我的猜测是
,P\u ID
,FLAG
,C\u NUMBER
和M\u NUMBER
是S\u NUMBER
中的列,ABC
,P\u ID
,P\u C\u NUMBER
是绑定变量,但这只是一个猜测P\u M\u NUMBER
- 各种条件的选择性如何?特别是,表中哪一部分行具有特定的
值?哪个分数的P\u ID
标志
为“Y”
EXPLAIN
或类似命令查看查询的估计执行计划?在这些列中的大多数列周围创建索引可能会有所帮助,查询计划将帮助您查看哪些列。@cdhowie:在oracle中检索执行计划比像在mysql中一样只使用EXPLAIN
预写要稍微困难一些;-)但事实上,每次优化都需要从计划检查开始。我将向您发送解释计划。我并不是假装是Oracle专家,只是表明查看查询计划是比询问更好的第一步。提供问题中的计划肯定会有帮助。@gaurav-你能编辑你的帖子以包含查询计划吗?您是否尝试过使用RDBMS的EXPLAIN
或类似命令查看查询的估计执行计划?在这些列中的大多数列周围创建索引可能会有所帮助,查询计划将帮助您查看哪些列。@cdhowie:在oracle中检索执行计划比像在mysql中一样只使用EXPLAIN
预写要稍微困难一些;-)但事实上,每次优化都需要从计划检查开始。我将向您发送解释计划。我并不是假装是Oracle专家,只是表明查看查询计划是比询问更好的第一步。提供问题中的计划肯定会有帮助。@gaurav-你能编辑你的帖子以包含查询计划吗?通过这种方式,您可以对其进行格式化,使其更易于阅读。:index exist on flag,p_id不为null,并且对c_number、m_number和s_number没有约束,它们只是传递给上面游标的查询。p_id和flag value不为null,因此它存在于所有rows@gaurav-因此表上只有一个索引,标志上的索引
?P\u ID
上没有索引?还是表中的任何其他列?桌子上有多少行?有多少人的标志值为'Y'?记录计数为27138,标志值为99,但问题是我处理的是虚拟数据,而不是实际的生产数据,那里的数据不止这些。@gaurav-你是说真实数据没有这么严重的倾斜吗(即,超过0.33%的实际数据具有标志
的“Y”?)或者您只是说生产数据库中有更多的数据,但分布是相同的吗?其他任何列,如P\u ID
,是否比FLAG
,更具选择性?索引存在于FLAG上,P\u ID不为空,并且对c\u编号、m\u编号和s\u编号没有约束,它们只是传递给ab的查询ove cursor.p_id和标志值不为空,因此它存在于所有rows@gaurav-因此,表上只有一个索引,FLAG
上有一个索引?表中的P\u ID
或任何其他列上没有索引?表中有多少行?有多少行的FLAG
值为“Y”?记录计数为27,138,y值的标志是99,但问题是我处理的是虚拟数据,而不是实际的生产数据,而且那里的数据不止这些。@gaurav-你是说真实数据没有如此严重的倾斜(即超过0.33%的真实数据具有标志
的“y”?)或者您只是说生产数据库中有更多的数据,但分布是相同的?其他列,如P\u ID
,是否比标志
更具选择性?
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)
);