Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化此查询?_Sql_Oracle10g - Fatal编程技术网

Sql 优化此查询?

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是绑定变量,但这只是一个猜测 各种条件的选择性

我使用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
      是绑定变量,但这只是一个猜测
    • 各种条件的选择性如何?特别是,表中哪一部分行具有特定的
      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”


        您是否尝试使用RDBMS的
        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)
               );