'Oracle生成不重複字符串 sys_guid()'

數據庫 Java SQL 波波說運維 2019-08-29
"

概述

在oracle8i以後提供了一個生成不重複的數據的一個函數sys_guid()一共32位,生成的依據主要是時間和機器碼,具有世界唯一性,類似於java中的UUID(都是世界唯一的)。

"

概述

在oracle8i以後提供了一個生成不重複的數據的一個函數sys_guid()一共32位,生成的依據主要是時間和機器碼,具有世界唯一性,類似於java中的UUID(都是世界唯一的)。

Oracle生成不重複字符串 sys_guid()


SYS_GUID

SYS_GUID同Oracle管理員所使用的傳統的序列(sequence)相比具有諸多優勢。一個序列生成器只是簡單地創建從給定的起點開始的一系列整數值,而且它被用在選擇陳述式的時候自動地遞增該系列。

序列生成器所生成的數字只能保證在單個實例裡是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會生成相同的數字,從而導致衝突的發生。SYS_GUID會保證它創建的標識符在每個數據庫 裡都是唯一的。

此外,序列必須是DML陳述式的一部分,因此它需要一個到數據庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對數據庫進行訪問的時間戳和機器標識符,這就節省了查詢的消耗。


使用

SYS_GUID() 生成32位的唯一編碼。來生成唯一主鍵

例如:

create table test
(
id raw(16) default sys_guid() primary key,
name varchar2(100)
);
insert into test values(sys_guid(),'t1');

這樣就能生成唯一的主鍵id了,插入數據時不用插入id列。

"

概述

在oracle8i以後提供了一個生成不重複的數據的一個函數sys_guid()一共32位,生成的依據主要是時間和機器碼,具有世界唯一性,類似於java中的UUID(都是世界唯一的)。

Oracle生成不重複字符串 sys_guid()


SYS_GUID

SYS_GUID同Oracle管理員所使用的傳統的序列(sequence)相比具有諸多優勢。一個序列生成器只是簡單地創建從給定的起點開始的一系列整數值,而且它被用在選擇陳述式的時候自動地遞增該系列。

序列生成器所生成的數字只能保證在單個實例裡是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會生成相同的數字,從而導致衝突的發生。SYS_GUID會保證它創建的標識符在每個數據庫 裡都是唯一的。

此外,序列必須是DML陳述式的一部分,因此它需要一個到數據庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對數據庫進行訪問的時間戳和機器標識符,這就節省了查詢的消耗。


使用

SYS_GUID() 生成32位的唯一編碼。來生成唯一主鍵

例如:

create table test
(
id raw(16) default sys_guid() primary key,
name varchar2(100)
);
insert into test values(sys_guid(),'t1');

這樣就能生成唯一的主鍵id了,插入數據時不用插入id列。

Oracle生成不重複字符串 sys_guid()


SYS_GUID作為一個主關鍵字?

create table use_seq_table(id integer );
create sequence use_seq_sequence;
insert into use_seq_table values (use_seq_sequence_value.nextval );

create table use_guid_table(id raw (16));
insert into use_guid_table(sys_guid());

很多應用程序都依靠序列生成器來創建數據行的主關鍵字,這些數據行沒有一個明顯的主值,這也就是說,在這樣的數據集裡一條記錄的創建就會讓數據列發生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關鍵字而不使用序列數感興趣。這在對象在不同機器的不同數據庫裡生成以及需要在後來合併到一起的情況下很有用。

但是,SYS_GUID所生成的值是一個16位的原始值。序列所生成的整數不會使用16位(的值),除非它達到了10的30次方(每個字節有兩位),而且數字是相當獨特的:

SQL> select dump (123456789012345678901234567890) from dual ;
"

概述

在oracle8i以後提供了一個生成不重複的數據的一個函數sys_guid()一共32位,生成的依據主要是時間和機器碼,具有世界唯一性,類似於java中的UUID(都是世界唯一的)。

Oracle生成不重複字符串 sys_guid()


SYS_GUID

SYS_GUID同Oracle管理員所使用的傳統的序列(sequence)相比具有諸多優勢。一個序列生成器只是簡單地創建從給定的起點開始的一系列整數值,而且它被用在選擇陳述式的時候自動地遞增該系列。

序列生成器所生成的數字只能保證在單個實例裡是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會生成相同的數字,從而導致衝突的發生。SYS_GUID會保證它創建的標識符在每個數據庫 裡都是唯一的。

此外,序列必須是DML陳述式的一部分,因此它需要一個到數據庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對數據庫進行訪問的時間戳和機器標識符,這就節省了查詢的消耗。


使用

SYS_GUID() 生成32位的唯一編碼。來生成唯一主鍵

例如:

create table test
(
id raw(16) default sys_guid() primary key,
name varchar2(100)
);
insert into test values(sys_guid(),'t1');

這樣就能生成唯一的主鍵id了,插入數據時不用插入id列。

Oracle生成不重複字符串 sys_guid()


SYS_GUID作為一個主關鍵字?

create table use_seq_table(id integer );
create sequence use_seq_sequence;
insert into use_seq_table values (use_seq_sequence_value.nextval );

create table use_guid_table(id raw (16));
insert into use_guid_table(sys_guid());

很多應用程序都依靠序列生成器來創建數據行的主關鍵字,這些數據行沒有一個明顯的主值,這也就是說,在這樣的數據集裡一條記錄的創建就會讓數據列發生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關鍵字而不使用序列數感興趣。這在對象在不同機器的不同數據庫裡生成以及需要在後來合併到一起的情況下很有用。

但是,SYS_GUID所生成的值是一個16位的原始值。序列所生成的整數不會使用16位(的值),除非它達到了10的30次方(每個字節有兩位),而且數字是相當獨特的:

SQL> select dump (123456789012345678901234567890) from dual ;
Oracle生成不重複字符串 sys_guid()

較短的值就意味著用於表格和索引的存儲空間更少,以及查詢訪問的時間更短。

使用SYS_GUID或者序列會在數據庫使用週期裡的某些地方造成性能上的消耗,對於SYS_GUID而言,性能上的影響在查詢時間和 創建時間上(在表格裡要創建更多的塊和索引以容納數據)。對序列而言,性能上的影響在查詢期間,在這個時候,SGA序列的緩衝區被用光。在缺省情況下,一 個序列一次會緩衝20個值。如果數據庫沒有使用這些值就關閉了,它們就會被丟失。

SYS_GUID生成的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過腳本來填充它們,或者將它們作為Web參數來傳遞。

出於這些原因,將SYS_GUID作為一個主關鍵字不是一個很好主意,除非是在一個並行的環境裡或者希望避免使用管理序列生成器的情況下。



總結

相比於JAVA的uuid,SYS_GUID優點就是生成的字符串是唯一的,但其和UUID有同樣的弊端:生成的序列過長並且沒有規律不方便記憶。SYS_GUID的應用場景是在於:當數據庫某字段設置為唯一,則可用次生成(比如主鍵)

後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

"

概述

在oracle8i以後提供了一個生成不重複的數據的一個函數sys_guid()一共32位,生成的依據主要是時間和機器碼,具有世界唯一性,類似於java中的UUID(都是世界唯一的)。

Oracle生成不重複字符串 sys_guid()


SYS_GUID

SYS_GUID同Oracle管理員所使用的傳統的序列(sequence)相比具有諸多優勢。一個序列生成器只是簡單地創建從給定的起點開始的一系列整數值,而且它被用在選擇陳述式的時候自動地遞增該系列。

序列生成器所生成的數字只能保證在單個實例裡是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會生成相同的數字,從而導致衝突的發生。SYS_GUID會保證它創建的標識符在每個數據庫 裡都是唯一的。

此外,序列必須是DML陳述式的一部分,因此它需要一個到數據庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對數據庫進行訪問的時間戳和機器標識符,這就節省了查詢的消耗。


使用

SYS_GUID() 生成32位的唯一編碼。來生成唯一主鍵

例如:

create table test
(
id raw(16) default sys_guid() primary key,
name varchar2(100)
);
insert into test values(sys_guid(),'t1');

這樣就能生成唯一的主鍵id了,插入數據時不用插入id列。

Oracle生成不重複字符串 sys_guid()


SYS_GUID作為一個主關鍵字?

create table use_seq_table(id integer );
create sequence use_seq_sequence;
insert into use_seq_table values (use_seq_sequence_value.nextval );

create table use_guid_table(id raw (16));
insert into use_guid_table(sys_guid());

很多應用程序都依靠序列生成器來創建數據行的主關鍵字,這些數據行沒有一個明顯的主值,這也就是說,在這樣的數據集裡一條記錄的創建就會讓數據列發生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關鍵字而不使用序列數感興趣。這在對象在不同機器的不同數據庫裡生成以及需要在後來合併到一起的情況下很有用。

但是,SYS_GUID所生成的值是一個16位的原始值。序列所生成的整數不會使用16位(的值),除非它達到了10的30次方(每個字節有兩位),而且數字是相當獨特的:

SQL> select dump (123456789012345678901234567890) from dual ;
Oracle生成不重複字符串 sys_guid()

較短的值就意味著用於表格和索引的存儲空間更少,以及查詢訪問的時間更短。

使用SYS_GUID或者序列會在數據庫使用週期裡的某些地方造成性能上的消耗,對於SYS_GUID而言,性能上的影響在查詢時間和 創建時間上(在表格裡要創建更多的塊和索引以容納數據)。對序列而言,性能上的影響在查詢期間,在這個時候,SGA序列的緩衝區被用光。在缺省情況下,一 個序列一次會緩衝20個值。如果數據庫沒有使用這些值就關閉了,它們就會被丟失。

SYS_GUID生成的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過腳本來填充它們,或者將它們作為Web參數來傳遞。

出於這些原因,將SYS_GUID作為一個主關鍵字不是一個很好主意,除非是在一個並行的環境裡或者希望避免使用管理序列生成器的情況下。



總結

相比於JAVA的uuid,SYS_GUID優點就是生成的字符串是唯一的,但其和UUID有同樣的弊端:生成的序列過長並且沒有規律不方便記憶。SYS_GUID的應用場景是在於:當數據庫某字段設置為唯一,則可用次生成(比如主鍵)

後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

Oracle生成不重複字符串 sys_guid()


"

相關推薦

推薦中...