【发布时间】:2011-01-18 11:06:28
【问题描述】:
Oracle 10g。
我们有一个由 varchar2 列分区的大表(如果由我决定,它不会是这个列,但它是)每个分区都有一个值。前任。分区“PARTION1”值('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 子句中之外,还有什么可以在这里工作的吗?
此外,更改分区定义也已结束。我在我的团队中是少数,甚至认为这是一个问题。在我到达那里之前,前一个团队决定通过字符串查找和替换发送所有应用程序 sql 查询来“解决”这个问题,该字符串在 FROM 子句中添加硬编码的分区名称,并让某人手动更新存储过程中的分区名称根据需要...但有一天它会破裂并且会很难破裂。我正在尝试寻找侵入性最小的方法,但恐怕可能没有。
最好是只更改查询本身而不更改底层数据库结构的解决方案。就像我说的,这个解决方案可能根本不存在......
【问题讨论】:
标签: sql oracle partitioning