|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
碰到过很多多少成绩关于怎样在ORACLE中创立相似SQLSERVER或ACCESS中自增加字段。谜底多是先创建一个Sequence,然后在Trigger中将Sequence的NEXTVAL的取值付与所必要的列。看上往还不错。
可是统统真的那末顺遂吗?Sequence真的能够做到供应一序列一连没有漏掉的序列数值吗?
无妨作个实行:
SQL>createsequencetest_seqstartwith1;
Sequencecreated.
SQL>createtabletest_tab(xint);
Tablecreated.
SQL>insertintotest_tabvalues(test_seq.nextval);
1rowcreated.
SQL>insertintotest_tabvalues(test_seq.nextval);
1rowcreated.
SQL>insertintotest_tabvalues(test_seq.nextval);
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>select*fromtest_tab;
X
----------
1
2
3
SQL>conn/assysdba;
Connected.
SQL>altersystemflushshared_pool;
Systemaltered.
SQL>connuser1/user1
Connected.
SQL>insertintotest_tabvalues(test_seq.nextval);
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>select*fromtest_tab;
X
----------
1
2
3
21
从实验中能够看出,在缺省情形下,我们创建的是带有Cache选项的Sequence(缺省值是20),它的感化是事后将必定数目的序列值寄存在SGA中,便于疾速会见。但是它的反作用就是这部分数值大概会被扫除,当下一次猎取NEXTVAL时,就会不成制止地形成序列值丧失。
总结一下,在以下情形下,序列值会丧失:
1.数据库封闭或重起,因为全部SGA会被扫除,以是Cached的序列值一样会被扫除。
2.相似于一般的DataBlock,当SGA中必要安排新的数据,Cached的序列值大概会依照SGA的数据寄存划定规矩被扫除。
读到这里,仔细的读者大概会问,假如在创立Sequence时,成心不选用Cache选项,成绩不就办理了吗?且慢,另有两点必要注重:
1.会见效力下降,没有Cache功效的Sequence取值将没法间接会见内存
2.不管是Nocache仍是Cache,每次会见NEXTVAL的历程都是不成逆的,在统一session中,在实行一系列DML和Sequence的操纵后,用户实行Rollback,但愿将操纵回滚,可是Sequence此时就显得非常固执,用失落的NEXTVAL将没法被重现。当下一次试图读取NEXTVAL时,Sequence的指针又挪动到下一名了。
看来Oracle真是一个陆地,每一个微小的常识点都是那末饶风趣味,值得我们往勉力专研啊。
备注:利用Cache功效对Sequence读取效力的影响
Connectedto:
Oracle8iEnterpriseEditionRelease8.1.7.4.1-Production
WiththePartitioningoption
JServerRelease8.1.7.4.1-Production
SQL>settimingon
SQL>setautotracetraceonlystatistics
SQL>SELECT*FROMALL_OBJECTS;
14302rowsselected.
Elapsed:00:00:13.05
Statistics
----------------------------------------------------------
7recursivecalls
4dbblockgets
146635consistentgets
0physicalreads
0redosize
1633344bytessentviaSQL*Nettoclient
117520bytesreceivedviaSQL*Netfromclient
956SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
14302rowsprocessed
SQL>
SQL>--测试带有CACHE选项的Sequence:
SQL>
SQL>CREATESEQUENCEtest_seq1CACHE1000;
Sequencecreated.
Elapsed:00:00:00.00
SQL>SELECTx.*,test_seq1.NEXTVALFROMALL_OBJECTSx;
14303rowsselected.
Elapsed:00:00:13.09
Statistics
----------------------------------------------------------
202recursivecalls
64dbblockgets
146636consistentgets
0physicalreads
10468redosize
1752002bytessentviaSQL*Nettoclient
117543bytesreceivedviaSQL*Netfromclient
956SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
14303rowsprocessed
SQL>
SQL>--测试不带有CACHE选项的Sequence
SQL>
SQL>DROPSEQUENCEtest_seq1;
Sequencedropped.
Elapsed:00:00:00.00
SQL>CREATESEQUENCEtest_seq1NOCACHE;
Sequencecreated.
Elapsed:00:00:00.00
SQL>SELECTx.*,test_seq1.NEXTVALFROMALL_OBJECTSx;
14303rowsselected.
Elapsed:00:00:32.02(实行工夫分明长了)
Statistics
----------------------------------------------------------
185946recursivecalls
57216dbblockgets
160925consistentgets
0physicalreads
10004008redosize
1752002bytessentviaSQL*Nettoclient
117543bytesreceivedviaSQL*Netfromclient
956SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
14303rowsprocessed
BLACK_SNAIL
接待交换,转载说明
ligang1000@hotmail.com/ligang@fujitsu.sh.cn
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码 |
|