基於函式的索引 建立基於函式的索引

2021-08-01 18:38:25 字數 1546 閱讀 3135

基於函式的索引

1基於函式的索引是常規的b樹索引。

2該索引存放的資料是由表中的資料應用函式後得到的,而不是直接存放表中的資料本身。

3如果查詢條件包含與索引相同的函式,就可以使用基於函式的索引,提高查詢速度

舉例

測試表

create

table student2(

sno varchar2(10) primary

key,

sname varchar2(20),

sage number(2),

cno varchar2(2)

);insert

into zhou.student2 values('1','lilia',18,'1');

insert

into zhou.student2 values('2','lilib',18,'1');

這個時候select sname from student2 where sname='lilia';

是查不來資料的,要想忽略大小寫,那麼可以這樣寫

select sname from student2 where upper(sname)=upper('lilia');

但是這個會引發乙個問題?

這樣實現的話,某一列的普通b樹索引還有用嗎?沒有用

使用者使用這種查詢方式,使用者不是基於表中的儲存記錄進行搜尋的,即使在某一列上建立了索引,但是oracle會被破執行全表搜尋,為遇到的每一行都計算upper()函式。

如果解決?使用基於函式的索引

建立基於函式的索引1可以提高在查詢條件中使用函式和表示式時查詢的執行速度

2如果使用者在自己模式中建立基於函式的索引,那麼必須具有query rewrite系統許可權;

如果使用者想要在其他模式中建立基於函式的索引,需要create any index和global query rewrite許可權

3建立基於函式的索引時,oracle會首先對包含索引列的函式值或者表示式值進行求值,然後對求職後的結果進行排序,最後儲存到索引中。

舉例

查詢條件包含與索引相同的函式

select ….upper(sname):對該列使用的函式與基於函式的索引使用的函式一樣,查詢的時候就使用基於函式的索引,不全表查詢.

mysql 基於虛擬列建立函式索引

1.建立虛擬列 alter table otc transaction complete add column create time index datetime generated always as date format create time,y m d 上面這條語句解釋 執行上面這語句後...

專案02 基於Python的演算法函式建立

專案02 基於python的演算法函式建立 作業要求 根據不同題目,完成 書寫並成功執行 題目1 有1 2 3 4個數字,能組成多少個互不相同且無重複數字的兩位數?都是多少?該題目不用建立函式 import numpy as np import pandas as pd 方法1 from itert...

基於python的基本函式

什麼是函式?函式就是將一段 寫在一起,如果需要使用,直接呼叫即可 就是封裝一段功能 的 塊,這段 可以被多次使用 def define 定義 函式名稱命名規範 單詞全部小寫,多個單詞之間用 連線,函式名要和實現 的功能有關係,做到見名知意 def 函式名 引數列表 函式功能 def eat prin...