zoukankan      html  css  js  c++  java
  • 有关分区表的另一点

         很久以前写了一个关于分区表的博文(http://www.cnblogs.com/wingsless/archive/2012/08/06/2625809.html),后来在实际的工作中发现,我们的存储过程中存在很多这样子的写法:

         

    CREATE OR REPLACE PROCEDURE P_TEST_PAR(V_DAY IN VARCHAR2) AS
      V_SQL VARCHAR2(1000);
    BEGIN
      V_SQL := 'INSERT INTO TEST_PAR
        SELECT * FROM TEST_PAR T WHERE T.DAY_ID =' || V_DAY;
      EXECUTE IMMEDIATE V_SQL;
      COMMIT;
    END
    

          这里面的v_day是存储过程中传入的变量。

          这个分区表是按照day_id字段范围分区的,分区的字段是varchar2型的。这个v_sql打印出来是这样子的:

         

    INSERT INTO TEST_PAR
        SELECT * FROM TEST_PAR T WHERE T.DAY_ID =20130101
    

          主要看底下的select语句。

         

          看,只选择了20130101一天的数据,但是读取分区的时候却将所有的分区都读取上了,这显然没有达到我们的要求,问题很简答,就在于下面的隐式类型转换中。如果语句换成下面这个就不一样了:

         

    SELECT * FROM TEST_PAR T WHERE T.DAY_ID ='20130101'
    

        

         这样子就好了,cost也降下来了。以前写过一个索引不可用的(http://www.cnblogs.com/wingsless/archive/2011/11/19/2255647.html),没想到相同的时候也发生在了分区上。

         过程这样改:

        

    CREATE OR REPLACE PROCEDURE P_TEST_PAR(V_DAY IN VARCHAR2) AS
      V_SQL VARCHAR2(1000);
    BEGIN
      V_SQL := 'INSERT INTO TEST_PAR
        SELECT * FROM TEST_PAR T WHERE T.DAY_ID =''' || V_DAY ||'''';
      EXECUTE IMMEDIATE V_SQL;
      COMMIT;
    END;

         后来我又发现一个问题,如果分区条件是number型,但是在SQL语句中条件里写了单引号,还是可以选择到恰当的分区。现在在上班,有时间了在截图。

  • 相关阅读:
    图形合并
    启动脚本
    图形合并
    :(){:|:&};:
    C言语教程第八章:列举,位运算(5)
    C言语图形情势编程,赋性鼠标(4)
    C言语教程第十章:文件(6)
    C言语教程第十章:文件(4)
    红帽为什么要连结桌面Linux
    阶乘较劲争论器改善版
  • 原文地址:https://www.cnblogs.com/wingsless/p/2951618.html
Copyright © 2011-2022 走看看