通用唯一識別碼(UUID)


PostgreSQL 是目前唯一支援 UUID 資料型別的先進ORDBMS.

通用唯一識別碼 (Universally Unique Identifier, UUID) 是一個軟體建構的標準,
亦為開放軟體基金會 (Open Software Foundation, OSF) 的組織在分散式計算環境 (Distributed Computing Environment, DCE) 領域的一部份。 

UUID 的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的 UUID。在這樣的情況下,就不需考慮資料庫建立時的名稱重複問題。

也就是說若每奈秒產生1兆個UUID,要花100億年才會將所有UUID用完。 

UUID的標準型式包含32個16進位數字,以連字號分為五段,形式為8-4-4-4-12的36個字元。
範例 :
  • 550e8400-e29b-41d4-a716-446655440000
Ref: http://zh.wikipedia.org/w/index.php?title=UUID&variant=zh-tw


9.2+




UUID OSSP (Extension)


UUID OSSP模塊提供功能生成通用唯一標識(UUID)使用幾個標準的算法之一。 也有功能產生某些特殊的UUID常數。

此模塊取決於的OSSP UUID庫,該庫可以發現在http://www.ossp.org/pkg/lib/uuid/的的



  • http://en.wikipedia.org/wiki/Universally_unique_identifier#Variants_and_versions
  • Java UUID, http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html#version()
  • http://www.blogjava.net/feelyou/archive/2008/10/14/234320.html
  • http://www.myexception.cn/software-architecture-design/863490.html
  • http://hi.baidu.com/thinkinginlamp/item/2756b34cbc0176addf2a9f9e
    • 由於UUID的無序性,InnoDB會產生巨大的IO壓力,此時不適合使用UUID做物理主鍵,可以把它作為邏輯主鍵,物理主鍵依然使用自增ID。
  • http://www.admpub.com/blog/?post=176
    • 經過測試,5萬記錄用UUID做主鍵多表關聯,性能和用VARCHAR做主鍵相差不大;
    • 和Number的相比呢? 百萬級,uuid和number就有十倍以上的性能差距了。就算和varchar相比,varchar(10)和varchar(36)那也是有很大差別的。













Ref


在系統上線初期並沒有暴露出嚴重的高IO/CPU問題, 跟進後面的分析這個應該是和業務量的增長有關, 增長後暴露出UUID index的問題.
  1. 在做主鍵的類型選擇時, 儘量不要使用UUID類型的字段, 如果要使用, 請使用有序生成的UUID, 不要使用無序生成的UUID.
  2. 使用離散uuid值和text類型作為主鍵的IO等待大概是6%, int8作為主鍵IO等待大概是0.25% , 從這裡看使用離散uuid作為主鍵值帶來的IO開銷是使用序列插入int8類型字段帶來IO開銷的24倍. 當表裡面的數據越多, 使用離散uuid作為主鍵值帶來的IO開銷會越來越大, 與INT8的性能相差就更加大了. 幾百倍都有可能.
  3. checkpoint時, UUID索引所在的硬盤有大量的IO操作, 持續時間較長. 而表數據文件所在的硬盤IO操作很快完成.



E.3. Release 8.3.1
    Release date: 2008-03-17
  • Enable building contrib/uuid-ossp with MSVC (Hiroshi Saito)


E.4. Release 8.3
    Release date: 2008-02-04
  • Universally Unique Identifier (UUID) data type

http://www.pgsqldb.org/mwiki/index.php/Uuid-ossp
http://java.sun.com/javase/6/docs/api/java/util/UUID.html


http://www.postgresql.org/docs/8.3/static/datatype-uuid.html

數據類型uuid商店普遍唯一標識符( UUID )所界定的符合RFC 4122 ,的ISO / IEC 9834-8:2005 ,以及相關的標準。 (Some systems refer to this data type as globally unique identifier, or GUID, (有些系統參照此數據類型的全局唯一標識符,或GUID ,  instead.) Such an identifier is a 128-bit quantity that is generated by an algorithm chosen to make it very unlikely that the same identifier will be generated by anyone else in the known universe using the same algorithm.不是。 )這樣的標識是一個128位的數量,所產生的一種算法選擇,使其不太可能,同樣的標識將所產生的任何人在宇宙中已知的使用相同的算法。 Therefore, for distributed systems, these identifiers provide a better uniqueness guarantee than that which can be achieved using sequence generators, which are only unique within a single database.因此,分佈式系統,這些標識提供更好的唯一保障,而不是可以實現使用序列發生器,這是只有唯一的一個單一的數據庫。

A UUID is written as a sequence of lower-case hexadecimal digits, in several groups separated by hyphens, specifically a group of 8 digits followed by three groups of 4 digits followed by a group of 12 digits, for a total of 32 digits representing the 128 bits.阿書面UUID是作為一個序列的小寫十六進位數字,在一些團體連字符分隔的,特別是一組8位數其次是三組4位數其次是一組12位,共32位代表128位。 An example of a UUID in this standard form is:一個例子UUID在此標準形式是:

 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 a0eebc99 - 9c0b - 4ef8 - bb6d - 6bb9bd380a11

PostgreSQL also accepts the following alternative forms for input: use of upper-case digits, the standard format surrounded by braces, and omitting the hyphens. PostgreSQL的也接受了下列其他形式的輸入:使用大寫數字,標準格式由括號包圍,並省略連字符。 Examples are:例如:

 A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11 A0EEBC99 - 9C0B - 4EF8 - BB6D - 6BB9BD380A11
 {a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} ( a0eebc99 - 9c0b - 4ef8 - bb6d - 6bb9bd380a11 )
 a0eebc999c0b4ef8bb6d6bb9bd380a11

Output is always in the standard form.輸出始終是在標準形式。

PostgreSQL provides storage and comparison functions for UUIDs, but the core database does not include any function for generating UUIDs, because no single algorithm is well suited for every application. PostgreSQL數據庫提供了存儲和比較功能UUIDs ,但核心數據庫不包含任何功能產生UUIDs ,因為沒有一個單一的算法非常適合各種應用的要求。 The contrib module contrib/uuid-ossp provides functions that implement several standard algorithms.該contrib模塊contrib / uuid - ossp提供職能,實施若干標準的算法。


The J2SE 5.0 release of Java provides a class that will produce 128-bit UUIDs, although it only implements version 3 and 4 generation methods, not the original method (due to lack of means to access MAC addresses using pure Java). The API documentation for the java.util.UUID class refers to ISO/IEC 11578:1996.
http://en.wikipedia.org/wiki/Universally_Unique_Identifier

http://www.99inf.net/SoftwareDev/Java/53780.htm
http://www.0531s.com/www/29/2007-12/14522.html

http://hi.baidu.com/thinkinginlamp/blog/item/c609d10979710e81d0581b60.html
http://forum.dabutek.com/showthread.php?t=18516

http://www.javayou.com/diary/566
http://javag.javaeye.com/blog/127753


http://jochem.vandieten.net/2008/02/06/postgresql-uuids-and-coldfusion-1/
http://www.nabble.com/Howto-set-UUID-parameter-for-PGSQL-8.3rc1---postgresql-8.3dev-602.jdbc3.jar-td14779582.html


Try PreparedStatement.setObject(...,Types.OTHER)


http://plog.longwin.com.tw/programming/2008/09/25/uuid-generator-function-php-javascript-ruby-2008
Comments