Oracle中的sql语句分页性能测试

建表:

-- Create table
create table T_CUSTOMINFO
(
  CUSTOMID            VARCHAR2(50) not null,
  CUSTOMNAME          VARCHAR2(200),
  CERTNO              VARCHAR2(50),
  CERTTYPE            VARCHAR2(50),
  TELNO               VARCHAR2(100),
  BIRTHDAY            DATE,
  REGISTDATE          DATE,
  ADDRESS             VARCHAR2(500),
  POSTCODE            VARCHAR2(10),
  EMAIL               VARCHAR2(200),
  FAXNO               VARCHAR2(100),
  SEX                 VARCHAR2(10),
  CORPID              VARCHAR2(50),
  BUYHOUSETYPE1       VARCHAR2(50),
  BUYHOUSETYPE2       VARCHAR2(50),
  BUYHOUSEAREABEGIN   NUMBER(5),
  BUYHOUSEAREAEND     NUMBER(5),
  ISATTIC             VARCHAR2(10),
  ISGARAGE            VARCHAR2(10),
  NATIONALITY         VARCHAR2(50),
  FAMILYNUM           NUMBER(2),
  HOUSEDECORATIONNEED VARCHAR2(50),
  BUYAIM              VARCHAR2(50),
  NATIVEPLACE         VARCHAR2(50)
)
tablespace HOUSE
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 5M
    minextents 1
    maxextents unlimited
    pctincrease 0
  );
-- Create/Recreate primary, unique and foreign key constraints
alter table T_CUSTOMINFO
  add constraint PK_T_CUSTOMINFO primary key (CUSTOMID)

 

批量插入数据:

insert into t_custominfo (CUSTOMID, CUSTOMNAME, CERTNO, CERTTYPE, TELNO, BIRTHDAY, REGISTDATE, ADDRESS, POSTCODE, EMAIL, FAXNO, SEX, CORPID, BUYHOUSETYPE1, BUYHOUSETYPE2, BUYHOUSEAREABEGIN, BUYHOUSEAREAEND, ISATTIC, ISGARAGE, NATIONALITY, FAMILYNUM, HOUSEDECORATIONNEED, BUYAIM, NATIVEPLACE)
SELECT ROWNUM||'_'||substr(t.customid,5,20), '张三', '242323523523523', '身份证', '124124214125', to_date('30-10-2008', 'dd-mm-yyyy'), to_date('07-04-2010', 'dd-mm-yyyy'), 'werwerwe ffwe', '', '1233@sohu.com', '23423523', '男', '7e28e618-6b6e-4ffc-be5a-91c36b766b38', '一室一厅', '一室一厅', null, null, '是', '是', '中国', 3, '无要求', '投资', ''
FROM T_CUSTOMINFO t

 

分页:

第一种分页:

WITH SQLRESULT AS
 (SELECT CUSTOMID,
         CUSTOMNAME,
         CERTNO,
         CERTTYPE,
         TELNO,
         BIRTHDAY,
         REGISTDATE,
         ADDRESS,
         POSTCODE,
         EMAIL,
         FAXNO,
         SEX,
         CORPID,
         BUYHOUSETYPE1,
         BUYHOUSETYPE2,
         BUYHOUSEAREABEGIN,
         BUYHOUSEAREAEND,
         ISATTIC,
         ISGARAGE,
         NATIONALITY,
         FAMILYNUM,
         HOUSEDECORATIONNEED,
         BUYAIM,
         NATIVEPLACE
    FROM T_CUSTOMINFO T
   WHERE T.CORPID LIKE '%%'
     AND ROWNUM <= ( /*INDEX*/
          8000 + 1) * 30 /*INDEX为第几页,应从0开始*/
  )
SELECT *
  FROM SQLRESULT A
MINUS
SELECT *
  FROM SQLRESULT B
 WHERE ROWNUM < /*INDEX*/
       8000 * 30 + 1;

 

第二种分页:

WITH SQLRESULT AS
 (SELECT CUSTOMID        
    FROM T_CUSTOMINFO T
   WHERE T.CORPID LIKE '%%'
     AND ROWNUM <= ( /*INDEX*/
          8000 + 1) * 30 /*INDEX为第几页,应从0开始*/
  )
SELECT * FROM T_CUSTOMINFO WHERE CUSTOMID IN
(
SELECT A.CUSTOMID
  FROM SQLRESULT A
MINUS
SELECT B.CUSTOMID
  FROM SQLRESULT B
 WHERE ROWNUM < /*INDEX*/
       8000 * 30 + 1
)

第三种分页:

WITH SQLRESULT AS
   (SELECT CUSTOMID,
           CUSTOMNAME,
           CERTNO,
           CERTTYPE,
           TELNO,
           BIRTHDAY,
           REGISTDATE,
           ADDRESS,
           POSTCODE,
           EMAIL,
           FAXNO,
           SEX,
           CORPID,
           BUYHOUSETYPE1,
           BUYHOUSETYPE2,
           BUYHOUSEAREABEGIN,
           BUYHOUSEAREAEND,
           ISATTIC,
           ISGARAGE,
           NATIONALITY,
           FAMILYNUM,
           HOUSEDECORATIONNEED,
           BUYAIM,
           NATIVEPLACE,
           ROWNUM AS row_num
      FROM T_CUSTOMINFO T
     WHERE T.Corpid LIKE '%%'
       AND ROWNUM <= (/*INDEX*/600+1) * 30  /*INDEX为第几页,应从0开始*/
     )
  SELECT *
    FROM SQLRESULT  A
  WHERE NOT EXISTS(SELECT * FROM SQLRESULT B WHERE B.row_num </*INDEX*/ (600*30+1) AND B.CUSTOMID=A.CUSTOMID);
 

 

按最坏情况(即最后的30行)测试所耗的时间

行数第一种分页第二种分页第三种分页
9000  很长几乎死机
600305秒0.781秒死机
1200309.266秒1.375秒
24476819.969秒4.19秒

 

自己在机子上进行了全部的测试欢迎网友继续测试给出新的建议.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值