我來自SQL服務器世界,我們有uniqueidentifier。在oracle中有沒有相當的東西?本專欄將經常被查詢,所以表演是關鍵。我應該如何在Oracle中存儲GUID?
我在.Net中生成GUID並將它傳遞給Oracle。由於幾個原因,它不能由oracle生成,所以我不能使用序列。
我來自SQL服務器世界,我們有uniqueidentifier。在oracle中有沒有相當的東西?本專欄將經常被查詢,所以表演是關鍵。我應該如何在Oracle中存儲GUID?
我在.Net中生成GUID並將它傳遞給Oracle。由於幾個原因,它不能由oracle生成,所以我不能使用序列。
CREATE table test (testguid RAW(16) default SYS_GUID())
This blog研究了相對錶現。
Oracle中沒有唯一標識符。
您可以使用RAW(某種疼痛)或CHAR自己實現一個。與使用整數相比,在CHAR字段上JOIN的查詢的性能會受到影響(可能高達40%)。
如果你正在做分佈式/複製數據庫,性能命中是值得的。否則,只需使用一個整數。
使用Oracle的一般做法是創建一個人工密鑰。這是一個定義爲數字的列。它通過一個序列填充。它通過主鍵定義被索引/約束。
如果我正確理解這個問題,當你在db中插入一行時,你想要生成一個唯一的id。
您可以使用序列來執行此操作。 link here
一旦你創建你的序列,你可以使用它像這樣:
INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
GUID是不是在Oracle用作MSSQL,我們往往有一個域(NOT NULL &主鍵),一序列和插入時的觸發器來填充它(對於每個表)。
正如其他人所說的那樣,與數字序列相比,使用GUID的性能有所提高。這就是說,有一個由於Oracle 8i中提供的原始相當於命名爲「SYS_GUID()」可用的功能:
SQL> SELECT SYS_GUID() FROM DUAL;
SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5
函數可以創建返回一個格式化的GUID:
CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
SELECT SYS_GUID() INTO guid FROM DUAL ;
guid :=
'{' || SUBSTR(guid, 1, 8) ||
'-' || SUBSTR(guid, 9, 4) ||
'-' || SUBSTR(guid, 13, 4) ||
'-' || SUBSTR(guid, 17, 4) ||
'-' || SUBSTR(guid, 21) || '}' ;
RETURN guid ;
END GET_FORMATTED_GUID ;
/
因此返回可互換字符串:
SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;
GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}
需要注意一些Oracle平臺返回相似但仍然唯一的GUID值as noted Steven Feuerstein。
RAW(16)顯然是唯一標識符MS SQL類型的首選等效項。
該博客只比較工作與從數據庫生成的GUID作爲與sequence.nextval一起工作,但我不知道如何使用.net代碼生成的GUID工作時的性能? – gillyb 2011-02-21 15:02:51