有关分区表的另一点
来源:互联网 发布:交换机端口设248 编辑:程序博客网 时间:2024/06/04 17:54
很久以前写了一个关于分区表的博文(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
;
- 有关分区表的另一点
- 另一道与fork()有关的面试题
- 有关eclipse的几点
- 有关调试的几点
- 有关割点的求法
- 有关锚点的问题
- 如何将分区表的一个分区导出,然后导入到另一张表
- 已知一点的经纬度和该点到另一点的距离,求另一点的经纬度
- 有关FreeBSD的几点误区
- 有关FreeBSD的几点误区
- 有关.NET方面的几个点
- 解答有关REST的十点疑惑
- 聊点倒计时有关的东西
- 有关printf函数的几点注意事项
- 有关游戏开发的几点体会
- 有关前端开发的几点想法
- 与CPU有关的那点事
- 有关FreeBSD的几点误区
- c# 通过CreateDC,BitBlt实现截图
- xorg-x11-drv-vmware
- C++中的_declspec(novtable)
- Ubuntu如何管理(添加或删除)开机启动程序
- 一步一步建立10万IP电影网站
- 有关分区表的另一点
- 32位整型“无穷大”“无穷小”的理解
- 2013第二周上机任务项目四(动态链表初试)
- 八字神煞合婚算法,看看自己中了几枪
- TCP/IP四层模型和OSI七层模型
- C++ 中的接口继承与实现继承
- UML之用例图
- 使用Bundle进行VIM插件的管理
- 39 胃泰-java,哈哈