一、FastUnit平台的分页机制
使用2次查询来实现分页:
1. 获取总记录数
select
count
(
*
)
from
T
where
2. 利用Oracle的rownum获取指定页的数据
select
*
from
(
select
row_.
*
, rownum rownum_
from
(
SELECT
*
FROM
T
where
) row_
where
rownum
<=
?)
where
rownum_
>
?
(根据上一步得到的总记录数以及每页行数、当前页码计算出起始行号和结束行号,设置在上述SQL语句的“?”处)
二、测试环境
操作系统:Windows XP Professional SP1
CPU:迅驰1.6G
物理内存:1G
应用服务器:Tomcat 5.5.23
数据库:Oracle92(默认设置)
三、测试对象
FastUnit平台的日志表,脚本如下:
CREATE
TABLE
ACCESSLOG(
id NUMBER ( 10 , 0 ) NOT NULL ,
type NUMBER ( 1 , 0 ),
userid VARCHAR2 ( 50 ),
username VARCHAR2 ( 50 ),
org VARCHAR2 ( 50 ),
domain VARCHAR2 ( 50 ),
groupid VARCHAR2 ( 50 ),
groupname VARCHAR2 ( 50 ),
unitid VARCHAR2 ( 50 ),
unitname VARCHAR2 ( 50 ),
elementid VARCHAR2 ( 50 ),
elementname VARCHAR2 ( 50 ),
cost NUMBER ( 5 , 0 ),
ok NUMBER ( 1 , 0 ),
curtime DATE,
PRIMARY KEY (id)
);
CREATE INDEX AL_ct_idx on ACCESSLOG (curtime);
id NUMBER ( 10 , 0 ) NOT NULL ,
type NUMBER ( 1 , 0 ),
userid VARCHAR2 ( 50 ),
username VARCHAR2 ( 50 ),
org VARCHAR2 ( 50 ),
domain VARCHAR2 ( 50 ),
groupid VARCHAR2 ( 50 ),
groupname VARCHAR2 ( 50 ),
unitid VARCHAR2 ( 50 ),
unitname VARCHAR2 ( 50 ),
elementid VARCHAR2 ( 50 ),
elementname VARCHAR2 ( 50 ),
cost NUMBER ( 5 , 0 ),
ok NUMBER ( 1 , 0 ),
curtime DATE,
PRIMARY KEY (id)
);
CREATE INDEX AL_ct_idx on ACCESSLOG (curtime);
四、测试结果
本案例中,数据库除了索引未使用其他优化措施。
仅设置curtime条件时(使用索引),平均响应时间为620毫秒(如下图所示);
对比:
不设置任何条件时,平均响应时间为2300毫秒;
仅设置userid条件时(未使用索引),平均响应时间为5100毫秒。
(图中的测试数据由FastUnit的跟踪器统计的,用来跟踪进程内各断点之间时间消耗、数据库连接数、查询次数、增删改次数、内存消耗等,可以直观的判断出系统瓶颈的位置,为系统优化提供支持。)
五、对于大表的一般性优化措施
1. 表结构设计原则:数据类型尽量小(占用空间少,磁盘读入较快)、单独设置表空间
2. 应用程序:合理设计业务、SQL语句优化
3. 合理使用索引:只创建需要的索引,根据需要使用多列索引,存放于单独的表空间
4. 数据库设置:内存分配、查询优化器、分区、分表等
5. 硬件环境:硬盘、CPU、内存、网络带宽