RSS订阅欢迎来到Java程序员学习天地!
你的位置:首页 » 小心坑!表并行对分页的影响

小心坑!表并行对分页的影响

--建立测试表

CREATE TABLE TEST_1(ID NUMBER,NAME VARCHAR2(100));


--插入数据

DECLARE 

I NUMBER;

BEGIN

FOR I IN 1 .. 10000 LOOP

  INSERT INTO TEST_1 VALUES(I,SYS_GUID());

END LOOP;

END;

SELECT COUNT(*) FROM TEST_1;


--建立唯一索引

CREATE UNIQUE INDEX IX_TEST1_ID ON TEST_1(ID);


--建立临时表(无数据),用以检测分页数据是否有重复

CREATE TABLE TEST_BAK AS 

SELECT * FROM 

     (SELECT ROW_.*, ROWNUM ROWNUM_

          FROM (SELECT * FROM TEST_1 ORDER BY ID) ROW_) WHERE 1=2;

SELECT COUNT(*) FROM TEST_BAK;


--建立临时表的唯一索引,如果数据存在重复,则PLSQL块执行会报错

CREATE UNIQUE INDEX IX_TESTBAK_ID ON TEST_BAK(ID);


--TEST_1表非并行,分页测试

DECLARE 

I NUMBER;

BEGIN

FOR I IN 1 .. 100 LOOP

  INSERT INTO TEST_BAK

  SELECT * FROM 

     (SELECT ROW_.*, ROWNUM ROWNUM_

          FROM (SELECT * FROM TEST_1) ROW_)

 WHERE ROWNUM_ BETWEEN 50*(I-1)+1 AND 50*I;

 END LOOP;

 COMMIT;

 END;

 插入成功,表明数据无重复

 

--清空中间表数据,并开启TEST_1并行

TRUNCATE TABLE TEST_BAK;

ALTER TABLE TEST_1 PARALLEL;


--TEST_1表并行,分页测试

DECLARE 

I NUMBER;

BEGIN

FOR I IN 1 .. 100 LOOP

  INSERT INTO TEST_BAK

  SELECT * FROM 

     (SELECT ROW_.*, ROWNUM ROWNUM_

          FROM (SELECT * FROM TEST_1) ROW_)

 WHERE ROWNUM_ BETWEEN 50*(I-1)+1 AND 50*I;

 END LOOP;

 COMMIT;

 END;

 插入失败,报违反唯一约束,表明存在重复数据

 

--换另一种分页方式测试

TRUNCATE TABLE TEST_BAK; 

DECLARE 

I NUMBER;

BEGIN

FOR I IN 1 .. 100 LOOP

  INSERT INTO TEST_BAK

        SELECT *

  FROM (SELECT ROW_.*, ROWNUM ROWNUM_

          FROM (SELECT * FROM TEST_1) ROW_

             WHERE ROWNUM <= 50*I)

 WHERE ROWNUM_ > 50*(I-1);

 END LOOP;

 COMMIT;

 END;

 同样的,插入失败,报违反唯一约束,表明存在重复数据

 

 结论:

 由此可见,表并行方式下,会影响分页数据库准确性,即出现重复数据,所以大家开发过程中还得注意,合理避坑。

  

 补充:

 如果想开表并行,但又想数据不重复,可以在最里层加ORDER BY排序,但是此处会全表排序,带来一定性能问题,需在实际环境中权衡利弊。


额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

控制面板
您好,欢迎到访网站!
随机文章
热门文章
热评文章
最近发表