有关分区表的另一点

本文讨论了在使用Oracle分区表时遇到的问题,特别是涉及SQL语句中隐式类型转换导致的性能问题。通过修改SQL语句避免类型转换,可以显著降低成本并提高查询效率。同时,文章还分享了如何处理分区条件为数值型时,即使在SQL语句中使用单引号也能选择到正确分区的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     很久以前写了一个关于分区表的博文(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语句中条件里写了单引号,还是可以选择到恰当的分区。现在在上班,有时间了在截图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值