代码之家  ›  专栏  ›  技术社区  ›  rfusca

使用NLS_COMP=语言进行Oracle分区修剪

  •  0
  • rfusca  · 技术社区  · 14 年前

    甲骨文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子句中添加硬编码的分区名,并且有人根据需要手动更新存储过程中的分区名……但总有一天会中断,而且会很难解决。我正试图找到一种侵入性最小的方法,但恐怕没有。

    最好的解决方案是只更改查询本身,而不更改底层数据库结构。就像我说的,这个解决方案可能根本不存在…

    1 回复  |  直到 14 年前
        1
  •  1
  •   Adam Musch    14 年前

    原型的一些解决方案:

    这个 CAST 功能。可以通过表达式进行分区;缺点是应用程序必须提供类似的表达式。

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

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