甲骨文 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 子句中添加硬编码的分区名称,并让某人手动更新存储过程中的分区名称根据需要......但它会打破一天,它会很难打破。我正在尝试找到侵入性最小的方法,但恐怕可能没有。
最好是只更改查询本身而不更改底层数据库结构的解决方案。就像我说的那样,这个解决方案可能根本不存在......