基本介紹
- 外文名:sys_guid()
- 序列:必須是DML陳述式的一部分
- tsg和tsg2:擁有的行數相同
- tsg和tsg2:大小不同
sys_guid()和傳統的序列(sequence),性能比較,空間比較,執行計畫比較,小結,
sys_guid()和傳統的序列(sequence)
Oracle8i引入了SYS_GUID這個概念,它同Oracle管理員所使用的傳統的序列(sequence)相比具有諸多優勢。一個序列生成器只是簡單地創建從給定的起點開始的一系列整數值,而且它被用在選擇陳述式的時候自動地遞增該系列。
序列生成器所生成的數字只能保證在單個實例里是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會生成相同的數字,從而導致衝突的發生。SYS_GUID會保證它創建的標識符在每個資料庫里都是唯一的。
很多應用程式都依靠序列生成器來創建數據行的主關鍵字,這些數據行沒有一個明顯的主值,這也就是說,在這樣的數據集裡一條記錄的創建就會讓數據列發生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關鍵字而不使用序列數感興趣。這在對象在不同機器的不同資料庫里生成以及需要在後來合併到一起的情況下很有用。
但是,SYS_GUID所生成的值是一個16個位元組的原始值。序列所生成的整數不會使用16位元組(的值),除非它達到了10的30次方(每個位元組兩個16進制顯示位),而且數字是相當獨特的:
SQL> select dump(123456789012345678901234567890) from dual;
DUMP(123456789012345678901234567890)
--------------------------------------------------------------
Typ=2 Len=16: 207,13,35,57,79,91,13,35,57,79,91,13,35,57,79,91
使用SYS_GUID或者序列會在資料庫使用周期里的某些地方造成性能上的消耗;問題就是在那裡。對於SYS_GUID而言,性能上的影響在查詢時間和創建時間上(在表格里要創建更多的塊和索引以容納數據)。對序列而言,性能上的影響在查詢期間,在這個時候,SGA序列的緩衝區被用光。在預設情況下,一個序列一次會緩衝20個值。如果資料庫沒有使用這些值就關閉了,它們就會被丟失。
SYS_GUID生成的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過腳本來填充它們,或者將它們作為Web參數來傳遞。
性能比較
創建下列對象:
create table tsg as select RAWTOHEX(sys_guid()) sgid,a.* from all_objects a;