2011-03-02 73 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