分区查询比较慢,如何优化分区查询速度

[复制链接]
查看11 | 回复5 | 2007-9-26 18:42:10 | 显示全部楼层 |阅读模式
本帖最后由 woaini7374 于 2016-12-5 12:39 编辑
本人刚接触Oracle数据不久,现在遇到一个分区查询慢的问题,有一张TEST表,表一天建立一个分区,分区键RECORD_DATE ,之所以没有用DATE类型是考虑到使用的方便性,表的结构如下所示(介于某种原因,表名和字段暂用其他字符代替):
create table TEST(
TESTCOL_ID
VARCHAR2(128)
not null,
TESTCOL_SEQ
NUMBER(3)
not null,
TESTCOL_TYPE NUMBER(5),
RECORD_DATE
NUMBER(10)
not null,
RECORD_TIME
NUMBER(10)
not null,
TESTCOL2_ID
NUMBER(5),
TESTCOL2_NAME
VARCHAR2(64),
TESTCOL3_ID
NUMBER(10),
TESTCOL3_NAME
VARCHAR2(64),
TESTCOL4_ID
NUMBER(5),
TESTCOL4_NAME
VARCHAR2(64),
TESTCOL5_MARK
NUMBER(3),
TESTCOL5_DATE
NUMBER(10),
TESTCOL5_TIME
NUMBER(10),
TESTCOL6_TYPE
NUMBER(3),
TESTCOL6_ID
NUMBER(10),
TESTCOL6_NAME
VARCHAR2(64),
TESTCOL_DESC VARCHAR2(4000),
RESET
NUMBER(3),
TESTCOL7_LEVEL NUMBER(3)
)
tablespace TS_TEST
partition by range (RECORD_DATE)
interval(1)
(partition
P0
values less than (20161001));
create index IDX_TEST_TIME on TEST (
RECORD_DATE ASC,
RECORD_DATE ASC
)
local
tablespace TS_IDX_TEST;
create index IDX_TEST on TEST (
RECORD_DATE ASC,
TESTCOL2_ID ASC,
TESTCOL_TYPE ASC,
TESTCOL7_LEVEL ASC
)
local
tablespace TS_IDX_TEST;
create index IDX_TEST2 on TEST (
TESTCOL_ID ASC
)
local
tablespace TS_IDX_TEST;
目前表里有10万多的数据。如果我用select * from TEST where ( RECORD_DATE=20161203 and RECORD_TIME>=131140847 and RECORD_TIME=142212378) or (RECORD_DATE>20161103 and RECORD_DATE<=20161202) or (RECORD_DATE=20161203 and RECORD_TIME<=142212378) )AND TESTCOL2_ID in ( 95,96,97,98 )AND TESTCOL_TYPE in ( 52 , 51 , 12 , 31 , 32 , 33 , 34 , 35 , 36 , 53 , 44 , 43 , 16 , 14 , 15 , 17 , 99 , 11 , 19 , 62 , 63 , 61 , 42 , 41 , 18 , 103 , 125 , 121 , 120 , 102 , 128 , 122 , 127 , 100 , 101 , 104 , 140 , 110 , 126 , 123 , 129 , 124 )ANDTESTCOL7_LEVEL in ( 4 , 6 , 5 , 1 , 7 , 8 , 3 , 2 , 33 , 31 , 32 , 0 )。所以还请各位大牛帮我分析分析,究竟导致查询缓慢的原因是什么,哪里需要优化的(暂不考虑select * 的优化),感激不尽!!!

回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
建立索引的时候不需要把 分区列RECORD_DATE 作为索引列,oracle本身就会数据分区裁剪
3万多数据的回表 3秒 也不算慢了,而且你是 select *又不算select (*)
数据量决定速度
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
carcase 发表于 2016-12-5 13:55
建立索引的时候不需要把 分区列RECORD_DATE 作为索引列,oracle本身就会数据分区裁剪
3万多数据的回表 3秒 ...

那还有更高效的做法吗?我担心以后随着分区数据量的激增,查询将更加缓慢
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
减少查询时间的间隔,减少每次查询的数据量
比如1分钟有6万数据
那么你可以10秒查询一次,一次就只用查询1万数据
而不算5分钟查询一次,那么一次就需要查询30万数据
多次查询,每次查询少量,当然要根据需要合理解决问题
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
一份钱一份货
一万行一秒钟
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
实时把没用分区的数据给清理掉。如果最早的分区没有用,可以merge操作。反正保留数据量的大小是让语句查询快的法宝。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行