基於函式的索引狀態變化
基於自定義函式的索引在使用時,需要注意因修改函式導致的索引狀態變化。
需要關注兩點:
*** user_indexes.FUNCIDX_STATUS
*** create or replace 方式修改函式後,雖然索引狀態有效,但索引本身因為沒有重建,仍返回原值,需要關注。
需要關注兩點:
*** user_indexes.FUNCIDX_STATUS
*** create or replace 方式修改函式後,雖然索引狀態有效,但索引本身因為沒有重建,仍返回原值,需要關注。
版本:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
1,建立測試表
drop table test;
create table test(x int,y int);
insert into test
select rownum,rownum from dual connect by level<20;
select rownum,rownum from dual connect by level<20;
commit;
create or replace function f(x in int) return int deterministic
as
begin
return x;
end;
/
create index idx_test_x on test(f(x));
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
select x,y from test where f(x)=5;
X Y
--- ---
5 5
2,create or replace方式修改函式
create or replace function f(x in int) return int deterministic
as
begin
return x-1;
end;
/
as
begin
return x-1;
end;
/
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
==>索引狀態VALID ENABLED
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
==>索引狀態VALID ENABLED
select x,y from test where f(x)=5;
X Y
--- ---
5 5
==>結果有誤,應返回6,6!!!
X Y
--- ---
5 5
==>結果有誤,應返回6,6!!!
alter index idx_test_x rebuild;
select x,y from test where f(x)=5;
X Y
---- ---
6 6
3,drop & create方式修改函式
drop function f;
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
create function f(x in int) return int deterministic
as
begin
return x-2;
end;
/
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
select x,y from test where f(x)=6;
ORA-30554: function-based index BOCNET.IDX_TEST_X is disabled
--重建索引
alter index idx_test_x rebuild;
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
==>索引狀態為 VALID ENABLED
select x,y from test where f(x)=6;
X Y
---- ----
8 8
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-773501/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於函式的索引函式索引
- Oracle基於函式的索引Oracle函式索引
- [20171202]關於函式索引的狀態.txt函式索引
- OCP之基於函式的索引函式索引
- 測試建立基於函式的索引函式索引
- Oracle 19c中基於函式的索引Oracle函式索引
- 函式索引使用細節——自定義函式的索引化函式索引
- [Q]怎樣建立基於函式索引zt函式索引
- 狀態變化模式模式
- query rewrite和基於函式的索引有關係?函式索引
- 基於函式的索引(function-based index,FBI)函式索引FunctionIndex
- 函式的動態引數 及函式巢狀函式巢狀
- (譯)函式式 JS #3: 狀態函式JS
- 關於函式索引的問題?函式索引
- SQL優化--函式索引SQL優化函式索引
- 函式的靜態變數 static函式變數
- MySQL函式索引及優化MySql函式索引優化
- 函式正規化入門(惰性求值與函式式狀態)函式
- 5 個處理狀態列的函式函式
- 基於Redux/Vuex/MobX等庫的通用化狀態OOPReduxVueOOP
- 基於 Riverpod 的 Flutter 狀態管理Flutter
- 外層函式的變數直接被巢狀函式引用計算函式變數巢狀
- Android 沉浸式狀態列攻略 讓你的狀態列變色吧Android
- Solidity之旅(十三)函式及其可見性和狀態可變性Solid函式
- android狀態列一體化(沉浸式狀態列)Android
- C++ 接受狀態變數的lambda表示式C++變數
- android狀態列一體化(改變狀態列的背景顏色)Android
- Python基礎之函式的巢狀Python函式巢狀
- mysql優化篇(基於索引)MySql優化索引
- 關於函式索引(function-based index)函式索引FunctionIndex
- 複合索引與函式索引優化一例索引函式優化
- Oracle索引或這類索引的分割槽處於不可用狀態 查詢Oracle索引
- [zt] 基於索引的SQL語句優化索引SQL優化
- 函式索引的問題函式索引
- 函式索引的儲存函式索引
- [快速搞定]android 狀態列一體化 沉浸式狀態列Android
- 圖靈機狀態轉移函式為什麼是部分函式?圖靈函式
- 基於websocket的celery任務狀態監控Web