ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 不能建立降序索引的问题的解决

不能建立降序索引的问题的解决

原创 Linux操作系统 作者:space6212 时间:2019-04-25 17:18:06 0 删除 编辑

这两天把数据库从9204升级到9208,一路顺利。
今天发现一个奇怪的问题:


SQL> create index IDX_ITEM_UPDATE_DATE on ITEM (ITEM_CATEGORY, ITEM_TYPE, ITEM_SEQ_NUMBER, UPDATE_DATE DESC, ITEM_ID DESC);

Index created

但发现建立出来的索引忽略了desc这个关键字


SQL> select TABLE_NAME,COLUMN_NAME, COLUMN_POSITION,DESCEND from user_ind_columns where index_name='IDX_ITEM_UPDATE_DATE';

TABLE_NAME COLUMN_NAME COLUMN_POSITION DESCEND
------------------------------ -------------------- --------------- -------
ITEM ITEM_TYPE 2 ASC
ITEM ITEM_SEQ_NUMBER 3 ASC
ITEM UPDATE_DATE 4 ASC
ITEM ITEM_ID 5 ASC
ITEM ITEM_CATEGORY 1 ASC


SQL> select dbms_metadata.get_ddl('INDEX','IDX_ITEM_UPDATE_DATE') ddl from dual;

DDL
------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE INDEX "TEST_TAG_GROUP"."IDX_ITEM_UPDATE_DATE" ON "TEST_TAG_GROUP"."ITEM" ("ITEM_CATEGORY", "ITEM_TYPE", "ITEM_SEQ_NUMBER", "UPDATE_DATE", "ITEM_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST3"

我的环境是9208+linux as 4
从9204升级到9208,中间没有修改过任何参数,在原来的9204版本是可以建立降序索引的。
我在另外一台同样环境(9208+linux as 4)的db就没有问题

首先怀疑的是compatible参数问题,但在数据库compatible=9.2.0.0。

多方查找资料无果,还是把注意力返回到参数上。先对比两个库参数的异同:

SQL> SELECT NAME,VALUE FROM v$parameter MINUS SELECT NAME,VALUE FROM v$parameter@wai.souchang.com;

NAME VALUE
---------------------------------------------------------------- ------------------------------------------
_ignore_desc_in_index TRUE
aq_tm_processes 1
background_dump_dest /opt/oracle/admin/sc2test/bdump
control_files /opt/oracle/oradata/sc2test/control01.ctl,
core_dump_dest /opt/oracle/admin/sc2test/cdump
db_cache_size 838860800
db_keep_cache_size 0
db_name sc2test
dml_locks 1232
enqueue_resources 1452
global_names FALSE
instance_name sc2test
java_pool_size 16777216
log_buffer 524288
max_rollback_segments 61
mts_service sc2test
open_cursors 300
pga_aggregate_target 314572800
processes 250
service_names sc2test

NAME VALUE
---------------------------------------------------------------- -------------------------------------------
session_cached_cursors 0
sessions 280
sga_max_size 1074861452
shadow_core_dump partial
shared_pool_reserved_size 8388608
shared_pool_size 167772160
timed_statistics FALSE
transactions 308
undo_tablespace UNDOTBS1
user_dump_dest /opt/oracle/admin/sc2test/udump

30 rows selected

SQL>

发现一个可疑参数:_ignore_desc_in_index,用来忽略索引中的desc关键字。
这个参数是几个月前为了fix一个bug修改的。
把它修改后重建索引。

SQL> alter system set "_ignore_desc_in_index"=false;

System altered.

SQL> drop index IDX_ITEM_UPDATE_DATE;

Index dropped

SQL> create index IDX_ITEM_UPDATE_DATE on ITEM (ITEM_CATEGORY, ITEM_TYPE, ITEM_SEQ_NUMBER, UPDATE_DATE DESC, ITEM_ID DESC) compute statistics;

Index created

SQL> select TABLE_NAME,COLUMN_NAME, COLUMN_POSITION,DESCEND from user_ind_columns where index_name='IDX_ITEM_UPDATE_DATE';

TABLE_NAME COLUMN_NAME COLUMN_POSITION DESCEND
------------------------------ -------------------- --------------- -------
ITEM ITEM_TYPE 2 ASC
ITEM ITEM_SEQ_NUMBER 3 ASC
ITEM SYS_NC00040$ 4 DESC
ITEM SYS_NC00041$ 5 DESC
ITEM ITEM_CATEGORY 1 ASC


如我们所愿,降序索引已经建立。

那么原来的降序索引为什么能够建立呢?我猜测可能原因是:
1、_ignore_desc_in_index在9204中无用,但在9208中修正了,它才真正起作用(这可能是一个BUG)
2、索引是在修改_ignore_desc_in_index前建立的(时间太长,忘记了)

不管怎么样,隐含参数还是不动为妙!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63766/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2005-01-25

  • 博文量
    245
  • 访问量
    168521