2010-02-18 34 views
0

Oracle 10g。用NLS_COMP修剪Oracle分区=语言

我们有一个由varchar2列分区的大表(如果它是由我决定的,它不会是这个列,但它是),每个分区都有一个值。防爆。 PARTITION“PARTION1”VALUE('C')。

我们也有NLS_COMP = LINGUISTIC。

分区修剪在指示该列中的值时不起作用。

SELECT * from table1 where column_partitioned_by = 'C' 

这对所有分区进行全表扫描,而不仅仅是相关的分区。

根据文档here,“NLS_COMP参数不影响分区表的比较行为。”

如果我发出:

ALTER SESSION SET NLS_COMP = BINARY 

然后:

SELECT * from table1 where column_partitioned_by = 'C' 

它不正确修剪分区下来。 (我正在修剪/不修剪生成的计划)

有什么,缺少硬编码分区名称到from子句,这将在这里工作?

此外,更改分区定义也是如此。我在我的团队中属于少数派,因为他甚至认为这是一个问题。在我到达那里之前,先前的团队决定通过在FROM子句中添加硬编码分区名称的字符串查找和替换来发送所有应用程序SQL查询来“解决”此问题,并且有人手动更新存储的特效中的分区名称根据需要...但它有一天会突破,而且会突破。我试图找到最少侵入性的方法,但恐怕可能没有。

最好,这将是一个解决方案,只改变查询本身而不是基础数据库结构。就像我说的,这种解决方案可能根本不存在......

回答

1

一些解决方案,以原型:

CAST功能。您可以通过表达式进行分区;缺点是您的应用程序必须提供类似的表达式。

分区NLS_SORT(column_partitioned_by, 'NLSSORT=BINARY')。同样,需要更改应用程序。

column_partitioned_by转换为数值,可能使用代码表在两者之间进行转换。不过,您必须在整个应用程序中为该表添加一个连接。

+0

我希望我能做任何事情,但看到我上面的编辑。我会在修改之前为您提供技术上正确的投票和我的问题范围。 – rfusca 2010-02-18 20:05:59