[20120319]使用sys_guid()做為主鍵的問題.txt

lfree發表於2012-03-19
最近一段時間都在最佳化一個專案,發現其表的主鍵是透過sys_guid()生成的,這樣的結果就是主鍵以及外來鍵在表中佔的比例很大。

SELECT count(*)  FROM dba_tab_columns WHERE wner = 'XXXX';


  COUNT(*)
----------
      1238
1 row selected.


SELECT count(*)  FROM dba_tab_columns WHERE wner = 'XXXX' AND data_type = 'VARCHAR2' AND data_length = 36;

  COUNT(*)
----------
       453
1 row selected.

--說明一下sys_guid() 生成的32位的,開發在中間插入'-'做為分隔,這樣data_length=36。

我粗略估算了一下,僅僅是表,這些主鍵佔用的空間大約40-50%。如果包括索引,可以到達60-65%。

我還仔細看了資料結構,發現這個專案主外來鍵定義很嚴謹。 真無法想象這個專案以後會怎麼樣?講句老實化,使用它最大的好處是簡單,其它根本看不出任何優點。

我google,發現UUID的相關資訊:



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

UUID 的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的 UUID。在這樣的情況下,就不需考慮資料庫建立時的名稱重複問題。目前最廣泛應用的 UUID,即是微軟的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的應用,則有 Linux ext2/ext3 檔案系統、LUKS 加密分割區、GNOME、KDE、Mac OS X 等等。另外我們也可以在 e2fsprogs 套件中的 UUID 函式庫找到實作。

定義

一組 UUID,是由一串 16 位元組(亦稱 16 位元組,或 128 位元)的16進位數字所構成,是故UUID理論上的總數為216 x 8=2128,約等於3.4 x 1038。也就是說若每奈秒產生1兆個UUID,要花100億年才會將所有UUID用完。

UUID的標準型式包含32個16進位數字,以連字號分為五段,形式為8-4-4-4-12的32個字元。範例;

    550e8400-e29b-41d4-a716-446655440000

UUID亦可刻意重複以表示同類。例如說微軟的COM中,所有元件皆必須實作出IUnknown介面,方法是產生一個代表IUnknown的UUID。無論是程式試圖存取元件中的IUnknown介面,或是實作IUnknown介面的元件,只要IUnknown一被使用,皆會被參考至同一個ID:00000000-0000-0000-C000-000000000046。

原來在linux中也有使用。
比如
# tune2fs -l /dev/sda2
tune2fs 1.35 (28-Feb-2004)
Filesystem volume name:   /
Last mounted on:         
Filesystem UUID:          550851f8-68ac-4fc3-a454-4359befb3dbc
Filesystem magic number:  0xEF53


也可以使用uuidgen命令生成uuid(在e2fsprogs軟體包中):
# uuidgen
ddbb2ded-bdeb-4b6d-b6f5-8aa304e15eb6

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-718928/,如需轉載,請註明出處,否則將追究法律責任。

相關文章