不能建立降序索引的問題的解決

space6212發表於2019-04-25

這兩天把資料庫從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 ;

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章