1. 程式人生 > >oracle Like模糊查詢與帶有關鍵字Reverse的索引應用

oracle Like模糊查詢與帶有關鍵字Reverse的索引應用

在對oracle的SQL優化過程中經常會遇到【like'%abc'】破壞索引的問題,但是如果真有此類需求,該如何在不破壞索引的基礎上進行查詢呢。

上程式碼

[email protected]> select reverse('123') from dual;

REVERSE('123')
--------------------------------
321
1 row selected.

[email protected]> create table test_like as select object_id,object_name from dba_objects;

Table created.

[email protected]
> create index test_like__name on test_like(object_name); Index created. [email protected]> create index test_like__name_reverse on test_like(reverse(object_name)); Index created. [email protected]> analyze table test_like compute statistics for table for all indexes; Table analyzed.
[email protected]
> set autotrace trace exp -- '常量開頭的like , 會利用index ,沒問題…… ' [email protected]> select * from test_like where object_name like AS%'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655Bytes=15720) 2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME' (NON-UNIQUE) (Cost=2 Card=118) --'開頭和結尾都是 % ,對不起,很難優化'
[email protected]
> select * from test_like where object_name like '%%'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720) 1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 ytes=15720) -- '以常量結束,直接寫的時候是不能應用index的' [email protected]> select * from test_like where object_name like '%S'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720) 1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 Bytes=15720) --'以常量結束的,加個reverse 函式,又可以用上index了' [email protected]> select * from test_like where reverse(object_name)like reverse('%AS'); Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655 Bytes=15720) 2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME_REVERSE' (NON-UNIQUE) (Cost=2 Card=118)


相關推薦

oracle Like模糊查詢帶有關鍵字Reverse索引應用

在對oracle的SQL優化過程中經常會遇到【like'%abc'】破壞索引的問題,但是如果真有此類需求,該如何在不破壞索引的基礎上進行查詢呢。 上程式碼 [email protected]> select reverse('123') from dua

oracle like模糊查詢簡單用法

簡單 rom 模糊 acl 用法 介紹 情況 文章 分享圖片 like 用法介紹: 1、“_”:匹配單個任意字符 select * from bqh3 where name like ‘_崔‘; 2、“%”:匹配0個或多個任意字符。但有三種情況如下:

Oracle like模糊查詢-無效的列索引

1、當寫成like('%?%')時會提示無效的列索引 改成like('%'||?||'%')時可以解決 下面為轉載內容 java.sql.SQLException: 無效的列索引 “無效的列索引”其實是個低階的錯誤,原因無非幾個: 1、sql串的?號數目

oracle like模糊查詢的優化測試

三種like模糊查詢的優化: 第一種:like 'a%'這種,直接可走索引 第二種:like '%a'這種,需要用reverse反轉函式改寫SQL,再建立函式索引,如下:   改寫前:    select * from test where owner like '%SCO

Oraclelike模糊查詢及萬用字元

like 模糊查詢 我們只知道個別字母或者欄位,不太確定要查詢的準確資訊時,可以使用模糊查詢(即like),查詢出所有與自己已知的"零碎"資訊有關的全部資訊。 這就要用的like模糊查詢了,其萬用字

.net like模糊查詢參數化

string sha parameter 錯誤 and 程序 報錯 sel csharp List<SqlParameter> paras = new List<SqlParameter>();

sql like模糊查詢的條件拼接

body con ted cond -c where sel apple b- 被坑了兩次,記錄加深記憶 oracle : select * from table_name where 1=1 <#if secondName?? &&

python中的mysql數據庫like模糊查詢

script art exec -m con python abc san exe 近期工作在使用python語言開發項目,工作中遇到了一個python連接mysq

記一次使用mybatis進行like 模糊查詢遇到的問題

bat 通過 模糊查詢 date 但是 AR 通配符 問題 解決辦法 "bdate like ‘#{date}%‘ and ..." 最開始這樣寫的· 將傳入的參數和%用單引號包起來,但是這會報錯 java.sql.SQLException: Parameter in

mybatis xml檔案中的大於、小於、及like模糊查詢的寫法

在xml中,特殊符號的轉義寫法如下: &lt; < &gt; > &lt;&gt; <> &amp; & &

mysql中like模糊查詢的優化

這是我在一個百萬級資料庫資料匯出遇到的問題 比如這個語句在這個資料庫查詢很慢: select a from tms where b like ‘%haha%’ order by time limit 100; 第一種優化方法(注意:這種方法只適用於haha開頭的): //將haha欄位和

mybaits LIKE 模糊查詢

1.  引數中直接加入%%   param.setUsername("%CD%");       param.setPassword("%11%"); <select id="selectPersons" resultTy

mybatis Example Criteria like 模糊查詢

用Mybatis程式碼生成工具會產生很多個XXXExample類,這些類的作用是什麼? 查閱了很多資料,在這裡總結歸納一下 簡介 XXXExample類用於構造複雜的篩選條件 它包含一個名為Criteria的內部靜態類,它包含將在where子句中一起結合的條件列

mybatis做like模糊查詢

1.  引數中直接加入%%   param.setUsername("%CD%");       param.setPassword("%11%"); <select id="selectPersons" resultType="person" para

laravel原生sql操作以及like模糊查詢的坑點

此篇文章基於 laravel版本:5.5 laravel基於DB的原生查詢可以使用 DB facade 執行查詢。DB facade 為每種型別的查詢提供了方法:select、update、insert、delete 和 statement。以下是知識點: (1)執行

Oracle模糊查詢中轉義用法

Oracle中模糊查詢中轉義的關鍵字是escape 具體用法如下 select * from DEPT_02_tmp a  where a.dname like 'IT/_%'escape'/'; escape後面接的是轉義識別符號  識別符號後面跟的是 需要轉義的內

SQL---模糊查詢正則表示式詳解和對比

1:模糊查詢 在進行資料庫查詢的時候,有完整查詢和模糊查詢之分; 完整查詢就是我們平時查詢的普通語句(對某個查詢條件確定的前提下),而模糊查詢就是常見的where 後面增加了 like 關鍵字。 一般模糊查詢語句如下: select 欄位 from 表 where 某欄位 l

mysql 優化 - like模糊查詢優化

在使用msyql進行模糊查詢的時候,很自然的會用到like語句,通常情況下,在資料量小的時候,不容易看出查詢的效率,但在資料量達到百萬級,千萬級的時候,查詢的效率就很容易顯現出來。這個時候查詢的效率就顯得很重要! 一般情況下like模糊查詢的寫法為(field已建立索引): SE

mysql正則表示式,實現多個欄位匹配多個like模糊查詢

現在有這麼一個需求 一個questions表,欄位有題目(TestSubject),選項(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求欄位不包含png,jpg,jpeg,gif  正常情況下會這麼寫 select * from questions

MyBatis like (模糊查詢)

  select * from user where user_name like concat('%',#{userName},'%'); select * from user where user_name like concat(#{userName},'%'); select *