【问题标题】:Oracle index maximum key length exceeded超出 Oracle 索引最大键长度
【发布时间】:2018-04-11 16:28:48
【问题描述】:

我收到错误 ORA-01450: 超出最大密钥长度 (6398),因为我尝试在下面创建索引

CREATE INDEX FORENAME_SURNAME ON CARD_HOLDER( REGEXP_REPLACE (UPPER( FORENAME ),'\\s|-|_|\\.|\\:|\\,',''), REGEXP_REPLACE (UPPER( SURNAME ),'\\s|-|_|\\.|\\:|\\,','') );

错误代码很清楚,但我的列是 100Bytes,所以如何可能的索引超过最大值?

而 db_block_size = 8192 而不是 6398。

列定义下方

  CREATE TABLE CARD_HOLDER
(   "CARD_HOLDER_ID" NUMBER NOT NULL ENABLE, 
"TITLE" VARCHAR2(10 BYTE), 
"FORENAME" VARCHAR2(100 BYTE), 
"SURNAME" VARCHAR2(100 BYTE) NOT NULL ENABLE, 
)

【问题讨论】:

    标签: oracle indexing oracle11g


    【解决方案1】:

    您可以尝试将其与连接而不是两个不同的列一起使用。但是,这只是一种解决方法,除非您将查询与串联一起使用,否则可能没有用处。

    CREATE INDEX forename_surname ON
        card_holder ( regexp_replace(upper(forename),'\\s|-|_|\\.|\\:|\\,','')
        || regexp_replace(upper(surname),'\\s|-|_|\\.|\\:|\\,','') );
    

    【讨论】:

      【解决方案2】:

      6398的长度是8KB块大小表空间中索引键的最大长度,因为块必须包含键加上一些开销

      您为什么会收到 100 字节列的错误可以很容易地演示。

      让我们用你的附加列定义一个视图

      create view ch2 as
      select c.*, REGEXP_REPLACE (UPPER( FORENAME ),'\\s|-|_|\\.|\\:|\\,','') for2,
      REGEXP_REPLACE (UPPER( SURNAME ),'\\s|-|_|\\.|\\:|\\,','') sur2 
      from CARD_HOLDER c
      

      如果您检查所看到的新列的数据类型

      select COLUMN_NAME, DATA_TYPE, DATA_LENGTH
      from user_tab_columns where table_name = 'CH2' and column_name in ('FOR2','SUR2');
      
      COLUMN_NAME, DATA_TYPE, DATA_LENGTH
      FOR2         VARCHAR2   4000
      SUR2         VARCHAR2   4000
      

      Oracle 预计 regexp_replace 的结果最大长度为 4000,最终总共为 8000。

      那该怎么办?

      Ask Tom 很好地概述了如何解决密钥长度问题。

      在其他解决方案中,您可以为索引定义具有更大块大小的表空间。

      您也可以退后一步,使用TRANSLATE(或REPLACE)删除不需要的字符,例如

      TRANSLATE(upper(FORENAME),'x'||CHR(9)||CHR(10)||CHR(11)||CHR(12)||CHR(13)||' -_.:,','x')
      

      这里 Oracle 假设结果只有 400 个字符长,因此索引键不会有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 2011-04-20
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多