甲骨文10g。
我们有一个由varchar2列划分的大表(如果由我来决定,它不会是这个列,但它是)每个分区都有一个值。Ext分区“PARTISO1”值(“C”)。
我们还有语言方面的。
分区修剪在指示该列中的值时不起作用。
SELECT * from table1 where column_partitioned_by = 'C'
它对所有分区(而不仅仅是相关分区)执行完整的表扫描。
根据文件
here
,“NLS_COMP参数不影响分区表的比较行为。”
如果我发布:
ALTER SESSION SET NLS_COMP = BINARY
然后:
从表1中选择*其中列分区为'C'
它确实正确地修剪了分区。(我是在删减/而不是删减生成的计划)
除了在from子句中硬编码分区名之外,还有什么可以在这里工作的吗?
此外,更改分区定义也是不可能的。我在我的团队中是少数,因为我甚至认为这是一个问题。在我到达那里之前,前一个团队决定通过字符串find and replace发送所有应用程序sql查询来“解决”这个问题,该字符串在FROM子句中添加硬编码的分区名,并且有人根据需要手动更新存储过程中的分区名……但总有一天会中断,而且会很难解决。我正试图找到一种侵入性最小的方法,但恐怕没有。
最好的解决方案是只更改查询本身,而不更改底层数据库结构。就像我说的,这个解决方案可能根本不存在…