Oracle 10g。
我们有一个由varchar2列分区的大表(如果它由我决定,它不是这个列,但它是),每个分区都有一个值。防爆。 PARTITION“PARTION1”VALUES('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查询来“解决”此问题。根据需要...但它会破坏一天,它会破碎。我试图找到最少侵入性的方法,但我担心可能没有。
优选地,它将是仅改变查询本身而不是基础数据库结构的解决方案。就像我说的,这个解决方案可能根本就不存在......
答案 0 :(得分:1)
原型的一些解决方案:
CAST
功能。您可以按表达式进行分区;缺点是你的应用程序必须提供类似的表达。
NLS_SORT(column_partitioned_by, 'NLSSORT=BINARY')
上的分区。同样,需要更改应用程序。
将column_partitioned_by
转换为数值,可能使用代码表在两者之间进行转换。但是,您必须在整个应用程序中包含该表的连接。