2011-03-02 17 views
1

我的表使用UUID作爲主鍵並將它們作爲CHAR(36)存儲在Oracle數據庫中。大多數表包含可以使用任何語言的NVARCHAR列。我想在這些列上支持自然語言排序,並通過在oracle會話上設置NLS_SORT和NLS_COMP(通過ALTER SESSION)來實現。我遇到的問題是,oracle不會使用UUID列上的二進制索引,並始終執行全表掃描。使用UUID和Oracle的NLS_COMP&NLS_SORT設置

有沒有辦法在不丟失二進制索引的情況下獲得整理效果?我找到的一個解決方案是使用RAW(16)來表示UUID,在這種情況下,Oracle將使用二進制索引,而不管NLS sort/comp如何。但我希望有更好的選擇。

有什麼建議嗎?

回答

0

如果您爲每個會話設置NLS_SORT和NLS_COMP,您是否真的需要索引來使用默認排序?你能創建一個實現語言排序的function-based index instead嗎?

2

你能描述一下環境嗎?

如果您在同一列中存儲不同的語言,那麼任何形式的語言排序都會受到阻礙(例如,您有法語和德語混合,您是按照'法語'順序還是'德語'訂單)?

另外,爲什麼要使用NVARCHAR?如果您有多字節字符集作爲默認字符,那麼VARCHAR將存儲任何必需的字符。 (16)顯然比CHAR(36)小很多,並且更接近UUID的「原生」格式(儘管一個數字也可以工作)。十六進制格式更像是一個演示文稿問題,並不是我用作PK(特別是包括連字符)的東西。我可能從11gR2中派生出一個視圖或虛擬(派生)列。

尤其是在多語言應用程序中,將CHAR存儲爲UUID時存在字符集轉換的風險。我甚至不確定UUID應該如何在韓文或中文裏看到像'a','b'和'c'這樣的字母不是原生的。

+0

我只對一種語言進行排序(不混合)。該語言在安裝應用程序時設置,以後不能更改。 – mahdouch 2011-03-02 18:36:24