【问题标题】:Oracle partition pruning with NLS_COMP = Linguistic使用 NLS_COMP = 语言进行 Oracle 分区修剪
【发布时间】: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


    【解决方案1】:

    原型的一些解决方案:

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

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

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

    【讨论】:

    • 我希望我可以做任何这些,但请参阅上面的编辑。在编辑之前,我会为您在技术上正确且在我的问题范围内投赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2020-01-28
    • 2017-11-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多