基於函式index的一點簡單測試!
SQL> create table tt as select *from t;
表已建立。
SQL> select *from tt;
ID NAME
---------- ----------
1 abc
2 bcd
3 cde
123 test
321 testabc
SQL> insert into tt values(null,null);
已建立 1 行。
SQL> insert into tt values(null,null);
已建立 1 行。
SQL> commit;
提交完成。
SQL> create index idx_tt_id on tt(id desc);
索引已建立。
--================================
Ascending unique indexes allow multiple NULL values. However, in descending unique indexes, multiple NULL values are treated as duplicate values and therefore are not permitted.
--================================
SQL> create unique index idx_tt_name on tt(name desc);
create unique index idx_tt_name on tt(name desc)
*
第 1 行出現錯誤:
ORA-01452: 無法 CREATE UNIQUE INDEX; 找到重複的關鍵字
SQL> create or replace function fun_test(p_a varchar2)
2 return varchar2
3 is
4 begin
5 return upper(p_a);
6 end;
7 /
函式已建立。
SQL> DROP INDEX IDX_TT_NAME;
索引已刪除。
SQL> create index idx_tt_name on tt(fun_test(name));
create index idx_tt_name on tt(fun_test(name))
*
第 1 行出現錯誤:
ORA-30553: 函式不能確定
SQL> create or replace function fun_test(p_a varchar2)
2 return varchar2 deterministic
3 is
4 begin
5 return upper(p_a);
6 end;
7 /
函式已建立。
--使用自定義函式建立函式index時需要加上關鍵字deterministic,否則無法建立。
SQL> create index idx_tt_name on tt(fun_test(name));
索引已建立。
SQL> set autotrace on
SQL> select * from tt where fun_test(name)='ABC';
ID NAME
---------- ----------
1 abc
執行計劃
----------------------------------------------------------
Plan hash value: 3830807321
--------------------------------------------------------------------------------
-----------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
Time |
--------------------------------------------------------------------------------
-----------
| 0 | SELECT STATEMENT | | 1 | 7 | 1 (0)|
00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TT | 1 | 7 | 1 (0)|
00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT_NAME | 1 | | 1 (0)|
00:00:01 |
--------------------------------------------------------------------------------
-----------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("SYS"."FUN_TEST"("NAME")='ABC')
統計資訊
----------------------------------------------------------
63 recursive calls
0 db block gets
9 consistent gets
0 physical reads
0 redo size
460 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> SET AUTOTRACE OFF
SQL> select index_name,status from dba_indexes where index_name='IDX_TT_NAME';
INDEX_NAME STATUS
------------------------------ --------
IDX_TT_NAME VALID
SQL> drop function fun_test;
函式已刪除。
--函式被drop之後,index的status不變
SQL> select index_name,status from dba_indexes where index_name='IDX_TT_NAME';
INDEX_NAME STATUS
------------------------------ --------
IDX_TT_NAME VALID
--optimizer在使用函式index時如果函式被drop此時會提示錯誤
SQL> set autotrace on
SQL> select * from tt where fun_test(name)='ABC';
select * from tt where fun_test(name)='ABC'
*
第 1 行出現錯誤:
ORA-00904: "FUN_TEST": 識別符號無效
SQL> set autotrace off
SQL> select index_name,status from dba_indexes where index_name='IDX_TT_NAME';
INDEX_NAME STATUS
------------------------------ --------
IDX_TT_NAME VALID
--函式被drop之後FUNCIDX_STATUS會變成disable,正常是enable
SQL> select index_name,status,funcidx_status from dba_indexes where index_name='
IDX_TT_NAME';
INDEX_NAME STATUS FUNCIDX_
------------------------------ -------- --------
IDX_TT_NAME VALID DISABLED
SQL> create or replace function fun_test(p_a varchar2)
2 return varchar2 deterministic
3 is
4 begin
5 return upper(p_a);
6 end;
7 /
函式已建立。
--====================================
If the function on which the index is based becomes invalid or is dropped, then Oracle Database marks the index DISABLED. Queries on a DISABLED index fail if the optimizer chooses to use the index. DML operations on a DISABLED index fail unless the index is also marked UNUSABLE and the parameter SKIP_UNUSABLE_INDEXES is set to true. Please refer to ALTER SESSION for more information on this parameter.
--====================================
SQL> select index_name,status,funcidx_status from dba_indexes where index_name='
IDX_TT_NAME';
INDEX_NAME STATUS FUNCIDX_
------------------------------ -------- --------
IDX_TT_NAME VALID DISABLED
SQL> alter index idx_tt_name rebuild;
索引已更改。
SQL> select index_name,status,funcidx_status from dba_indexes where index_name='
IDX_TT_NAME';
INDEX_NAME STATUS FUNCIDX_
------------------------------ -------- --------
IDX_TT_NAME VALID ENABLED
SQL> drop function fun_test;
函式已刪除。
SQL> select index_name,status,funcidx_status from dba_indexes where index_name='
IDX_TT_NAME';
INDEX_NAME STATUS FUNCIDX_
------------------------------ -------- --------
IDX_TT_NAME VALID DISABLED
SQL> insert into tt values(8,'b');
insert into tt values(8,'b')
*
第 1 行出現錯誤:
ORA-30554: 基於函式的索引SYS.IDX_TT_NAME被禁用
SQL> show parameter skip
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
skip_unusable_indexes boolean TRUE
SQL> alter table tt move;
表已更改。
SQL> select index_name,status,funcidx_status from dba_indexes where index_name='
IDX_TT_NAME';
INDEX_NAME STATUS FUNCIDX_
------------------------------ -------- --------
IDX_TT_NAME UNUSABLE DISABLED
SQL> insert into tt values(8,'b');
已建立 1 行。
SQL> commit;
提交完成。
SQL>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1016675/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ 虛解構函式簡單測試C++函式
- match函式簡單介紹以及與index函式結合應用函式Index
- C++ 成員函式指標簡單測試C++函式指標
- 簡單對比測試了幾個基於 swoole 的框架框架
- 基於函式計算一鍵部署簡易論壇函式
- 基於Serverless雲函式站點監控的方法Server函式
- 封裝一個簡單的動畫函式封裝動畫函式
- 簡單的 ping 測試
- 對Largest函式的測試函式
- 軟體測試基礎 (一): 單元測試
- 軟體測試基礎 (一):單元測試
- 一個簡單的介面測試框架 demo框架
- 快取函式的簡單使用快取函式
- 關於Python一等函式的一點實踐Python函式
- InnoSetup簡單教程一,安裝使用和簡單測試
- C++ 成員資料指標成員函式指標簡單測試C++指標函式
- mysql 函式substring_index()MySql函式Index
- 記一次簡單的vue元件單元測試Vue元件
- 記一次想簡單化的單元測試
- 建立簡單的表測試
- try的簡單效能測試
- 簡單的檔案快取函式快取函式
- 簡單探索Python中的filter函式PythonFilter函式
- 關於MongoDB的簡單理解(一)--基礎篇MongoDB
- 基於 Hyperf 的 RPC 簡單微服務架構試探RPC微服務架構
- 基於opencv實現簡單人臉檢測OpenCV
- Golang 基於單節點 Redis 實現的分散式鎖GolangRedis分散式
- LinkIQ線纜網路測試儀基於單項測試方法
- 關於單元測試的一些想法
- Dapr實現一個簡單的基於.net分散式事務之Saga模式分散式模式
- Jest基於dva框架的單元測試最佳實踐框架
- SpringBoot基於資料庫實現簡單的分散式鎖Spring Boot資料庫分散式
- Hibernate對注入的簡單測試
- 讓 API 測試變的簡單API
- 簡單歡樂的依賴注入函式依賴注入函式
- 三角函式形成簡單的波浪函式
- 對高階函式的簡單認識函式
- 一個簡單的基於Debian的開發環境。開發環境
- Fission:基於Kubernetes的Serverless函式框架Server函式框架