0

甲骨文 10g。

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

我们还有 NLS_COMP = LINGUISTIC。

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

SELECT * from table1 where column_partitioned_by = 'C'

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

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

如果我发出:

ALTER SESSION SET NLS_COMP = BINARY

接着:

SELECT * from table1 where column_partitioned_by = 'C'

它确实正确地修剪了分区。(我基于生成的计划进行修剪/不修剪)

除了将分区名称硬编码到 from 子句中之外,还有什么可以在这里工作的吗?

此外,更改分区定义也已结束。我在我的团队中是少数,甚至认为这是一个问题。在我到达那里之前,前一个团队决定通过字符串查找和替换发送所有应用程序 sql 查询来“解决”这个问题,该字符串在 FROM 子句中添加硬编码的分区名称,并让某人手动更新存储过程中的分区名称根据需要......但它会打破一天,它会很难打破。我正在尝试找到侵入性最小的方法,但恐怕可能没有。

最好是只更改查询本身而不更改底层数据库结构的解决方案。就像我说的那样,这个解决方案可能根本不存在......

4

1 回答 1

1

原型的一些解决方案:

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

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

转换column_partitioned_by为数值,可能使用代码表在两者之间进行转换。但是,您必须在整个应用程序中包含对该表的连接。

于 2010-02-18T19:13:08.667 回答