2016-09-17 87 views
0

我开始了解SQL中的保存点以回滚到特定的事务点。但是我们不知道可以创建多少个保存点?保存点是否会给数据库带来额外的负担!Oracle sql中允许有多少个SAVEPOINTS?

+1

我不认为他们有额外的成本,因为他们只存储对应于数据库所在状态的SCN。http://docs.oracle.com/database/121/CNCPT/transact.htm#CNCPT1121 –

回答

1

一个简单的测试证明保存点数量的限制足够大,可以覆盖任何实际的使用情况。这很可能只是资源的限制,UNDO表空间。

[email protected]_PDB_TCP> CREATE TABLE test1 (val NUMBER); 

Table created. 

[email protected]_PDB_TCP> BEGIN 
    2 FOR i IN 1..100000 LOOP 
    3 INSERT INTO test1 VALUES (dbms_random.value); 
    4 EXECUTE IMMEDIATE 'SAVEPOINT s' || i; 
    5 END LOOP; 
    6 END; 
    7/

PL/SQL procedure successfully completed. 

[email protected]_PDB_TCP> SELECT count(*) FROM test1; 

    COUNT(*) 
---------- 
    100000 

1 row selected. 

[email protected]_PDB_TCP> ROLLBACK TO SAVEPOINT s99999; 

Rollback complete. 

[email protected]_PDB_TCP> SELECT count(*) FROM test1; 

    COUNT(*) 
---------- 
    99999 

1 row selected. 

[email protected]_PDB_TCP> ROLLBACK TO SAVEPOINT s1; 

Rollback complete. 

[email protected]_PDB_TCP> SELECT count(*) FROM test1; 

    COUNT(*) 
---------- 
     1 

1 row selected. 

[email protected]_PDB_TCP> 
+0

我并不认为仅仅使用UNDO即可使用SAVEPOINT - 只有完成的更改才能生成UNDO(并且据我所知,保存点不会增加UNDO的大小 - 但我没有提及这一点) –

+0

你很可能是对的。试图发现在使用保存点与简单事务相比使用undo时的不同之处,但它看起来相同,所以我期望保存点只是在保存点创建时的特定快照中的UGA内存引用。我的意思是UNDO,因为这将最有可能成为第一个耗尽资源,因为未做出任何改变。 – Husqvik

0

我知道在Oracle 7上,默认值是5,可以通过设置Oracle SAVEPOINTS初始化参数将其设置为255。但在此之后,我从来没有遇到过问题。