Oracle 数据量非常大(上亿)时,使用存储过程中的游标返回分页查询的10条记录非常耗时,请问如何优化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 数据量非常大(上亿)时,使用存储过程中的游标返回分页查询的10条记录非常耗时,请问如何优化?相关的知识,希望对你有一定的参考价值。

只有10分,求大神指点
分页查询语句
SELECT LOGID,NO,FROM T_TAB_LOG U right join (SELECT RID
FROM (SELECT ROWID RID,
ROWNUM num
FROM (SELECT ROWID rid
FROM T_TAB_LOG t
WHERE part_date=... ) t
WHERE ROWNUM <= NVL(10, 15)) Y
WHERE Y.num >= NVL(1, 0)) t
on U.ROWID = RID
ORDER BY OPTTIME DESC;
还有优化的地方么?在表中,logI是主键,在part_date上建立分区表。NO号为1的数据有1.7亿条,NO号为2的数据有1700条,为什么查询NO=1的速度要比NO=2的速度快?求指教

参考技术A select * /*+ FIRST_ROWS */ from XXX where XXX
提高SQL语句的响应时间,快速的先返回 n 行。
SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21追问

查询语句是我上面的语句,请问:还有优化的地方么?在表中,logI是主键,在part_date上建立分区表。NO号为1的数据有1.7亿条,NO号为2的数据有1700条,为什么查询NO=1的速度要比NO=2的速度快?求指教

参考技术B With New_Table As
(Select Logid, No, Opttime, Rownum As Row_Num
From T_Tab_Log
Where Part_Date = ?)
Select Logid, No
From New_Table t
Where T.Row_Num <= ? And T.Row_Num >= ?
Order By Opttime Desc;本回答被提问者采纳
参考技术C 你应该把存储过程的语法贴出来 参考技术D 用oracle 的rownum

利用存储过程生成大量的数据(oracle,mysql)

在进行查询操作的性能测试时,往往需要测试大数据量模式下的查询功能的性能,这是就需要我们去创造一些测试数据来填充数据库,来模拟真是环境,造数据的方式有很多种,可以使用loadrunner,jmeter等压测工具压一些数据进去,但是这样做的效率不高,下面记录一个快速生成大量有规则数据的方法,那就是数据库的存储过程函数,通过运行函数快速的生成大量的数据。(使用这个方法的前提是你需要足够了解你要操作的数据库表的结构)

1、oracle数据库

DECLARE  --声明函数
i INT;
BEGIN 
i:=10;
WHILE(i<10000) 
LOOP  --设置loop循环
    i:=i+1;
    INSERT INTO PROJECT_ITEM (ID, CODE, VERSION, FOLDER_CODE, NAME, TYPE, ASSORT, PROGRESS, REGION_CODE, REGION_NAME, ORG_CODE, ORG_NAME, AGENT_CODE, AGENT_NAME, OBJECT, CONDITIONS, SCOPE, KIND, LAW_TIME, AGREE_TIME, ACCEPT_TIME, SEND_TIME, TOTAL_SIZE, IS_RATE, IS_CHARGE, IS_ONLINE, IS_FRONT, IS_PUBLIC, IS_PROCEDURE, PROCEDURE_NAME, PROCEDURE_TIME, IS_CATALOG, PAY_ONLINE, CONSULT_ONLINE, COMPLAIN_PHONE, WINDOW_PROCESS, ONLINE_PROCESS, POWER_PROCESS, TITLE_NAME, FUND_ACCOUNT, RELIEF_WAY, SORT_ORDER, CREATOR, CREATE_TIME, LAST_EDITOR, LAST_TIME, REMARK, PROPERTY, STATE, STATUS, FORM_KEYS, PROCEDURE_CODE, KIND_NAME, IS_COMPLE_FLOW, OLDITEMID, SERVICE_OBJECT, SERVICE_OBJECT_TYPE, XK_ITEM_PROPERTY, IS_AGENCYORGAN, TITLE_CODE, MODLE_ID) 
    VALUES (a94a341d2a3b4d25bd6212a1||i, 370000-SDGT-XK-||i||-||i, 1, 370000-SDGT-XK-||i, 批量新增测试事项||i, XK, 1, null, 370000000000, 山东省, SD370000GT, 山东省国土资源厅, SD370000GT, 山东省国土资源厅, null, null, null, null, 40, 20, null, null, 0, 0, 0, 0, null, 0, 0, null, 0, 0, 0, 0, null, null, null, null, null, null, null, 00001, null, TIMESTAMP 2015-05-24 13:01:09, null, TIMESTAMP 2015-07-23 09:37:37, , 0, 5, 5, null, null, null, null, null, 1, null, 0, null, null, null);END LOOP; 
COMMIT;   --循环执行完后进行提交
END;

备注:i变量可以通过“||”拼接到value中。

2、mysql数据库

 1 delimiter $$  --结束符为 $$
 2 DROP PROCEDURE IF EXISTS mytest; --判断进程是否存在,存在则删除
 3 CREATE PROCEDURE mytest()  --新建进程
 4 BEGIN
 5 declare i int;  
 6 DECLARE j varchar(200);
 7 set i = 2;
 8 while i < 11 do  --循环体
 9 SET j=CONCAT(wwq,i);  --拼接字符串
10 INSERT INTO pub_user(`ID`, `NAME`, `ACCOUNT`, `PASSWORD`, `USER_CODE`, `GRADE`, `GENDER`, `BIRTHDAY`, `IDENTITY_NUM`, `PHONE`, `MOBILE`, `EMAIL`, `POSITION`, `TYPE_CODE`, `LAST_LOGIN_TIME`, `ROLE_CODE`, `REGION_CODE`, `REGION_NAME`, `ORG_CODE`, `ORG_NAME`, `ORG_SHORT_CODE`, `ROLE_VALUE`, `IS_ADMIN`, `STATUS`) 
11 VALUES (i, 王馨, j, e10adc3949ba59abbe56e057f20f883e, ‘‘, 0, 1, 2015-06-25, ‘‘, ‘‘, 31f6fb51a5a8a901c96ace, aabb19d2e1ef19993095, LD, GWY, 2016-04-07 11:25:36, 95AC32C8B9874B4085A01187C341067B,AFB491C3A39C4FD4AA3008E32564A8D9,, 500000, 重庆市, 0410, 重庆市民防办, ‘‘, ROLE_USER,ROLE_HALLORG,, 0, 1);
12 INSERT INTO pub_user_post (`POST_CODE`, `USER_CODE`) 
13 VALUES (i, A685187D29AF4AD793F2753DC17C1435);
14 INSERT INTO pub_user_role (`ROLE_CODE`, `USER_CODE`, `APP_CODE`)
15 VALUES (95AC32C8B9874B4085A01187C341067B, i, INSPUR-DZZW-TYSP); 
16 set i=i+1;
17 end while;
18 end $$  --结束定义语句
19 delimiter ;  --先把结束符恢复为 ;
20 call mytest();  --调用进程

 



以上是关于Oracle 数据量非常大(上亿)时,使用存储过程中的游标返回分页查询的10条记录非常耗时,请问如何优化?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle亿级数据查询处理(数据库分表分区实战)

Oracle的极大数据量的分页查询问题

怎么样解决数据库中的数据量比较大时访问慢的问题?

Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?

oracle 大数据量 删除插入 有啥影响

利用存储过程生成大量的数据(oracle,mysql)