在OracleE數(shù)據(jù)庫的字段上建立索引的方法建站知識
導讀:1建站知識在OracleE數(shù)據(jù)庫的字段上建立索引的方法建設(shè)網(wǎng)站公司網(wǎng)站建設(shè)。
當where子句對某一列使用函數(shù)時,除非利用這個簡單的技術(shù)強制索引,否則Oracle優(yōu)化器不能在查詢中使用索引。 通常情況下,如果在WHERE子句中不使用諸如UPPER、REPLACE 或SUBSTRD等函數(shù),就不能對指定列建立特定的條件。但如果使用了這些函數(shù),則會出現(xiàn)一個問題:這些函數(shù)會阻礙Oracle優(yōu)化器對列使用索引,因而與采用索引的情況相比較,查詢會花費更多的時間。 慶幸的是,如果在使用函數(shù)的這些列中包含了字符型數(shù)據(jù),可以用這樣一種方法修改查詢語句,以達到強制性使用索引,更有效地運行查詢。這篇文章介紹了涉及的技術(shù),并說明了在兩種典型情況下怎樣實現(xiàn)。 大小寫混合情況 在討論由于函數(shù)修改了列的內(nèi)容,如何強制使用索引前,讓我們首先看看為什么Oracle優(yōu)化器在這種情況下不能使用索引。假定我們要搜尋包含了大小寫混合的數(shù)據(jù),如在表1中ADDRESS表的NAME列。因為數(shù)據(jù)是用戶輸入的,我們無法使用已經(jīng)統(tǒng)一改為大寫的數(shù)據(jù)。為了找到每一個名為john的地址,我們使用包含了UPPER子句的查詢語句。如下所示:
SQL> select address from address where upper(name) like 'JOHN';
在運行這個查詢語句前,如果我們運行了命令"set autotrace on", 將會得到下列結(jié)果,其中包含了執(zhí)行過程:ADDRESS cleveland 1 row selected. Execution Plan SELECT STATEMENT TABLE ACCESS FULL ADDRESS
可以看到,在這種情況下,Oracle優(yōu)化器對ADDRESS 表作了一次完整的掃描,而沒有使用NAME 列的索引。這是因為索引是根據(jù)列中數(shù)據(jù)的實際值建立的,而UPPER 函數(shù)已經(jīng)將字符轉(zhuǎn)換成大寫,即修改了這些值,因此該查詢不能使用這列的索引。優(yōu)化器不能與索引項比較"JOHN",沒有索引項對應(yīng)于"JOHN"-只有"john" 。 值得慶幸的是,如果在這種情況下想要強制使用索引,有一種簡便的方法:只要在WHERE 子句中增加一個或多個特定的條件,用于測試索引值,并減少需要掃描的行,但這并沒有修改原來SQL 編碼中的條件。以下列查詢百度seo網(wǎng)站優(yōu)化語句為例:SQL> select address from address where upper(name) like 'JO%' AND (name like 'J%' or name like 'j%');
使用這種查詢語句(已設(shè)置AUTOTRACE),可得到下列結(jié)果:ADDRESS cleveland 1 row selected. Execution Plan SELECT STATEMENT CONCATENATION TABLE ACCESS BY INDEX ROWID ADDRESS INDEX RANGE SCAN ADDRESS_I TABLE ACCESS BY INDEX ROWID ADDRESS INDEX RANGE SCAN ADDRESS_I
聲明: 本文由我的SEOUC技術(shù)文章主頁發(fā)布于:2023-05-22 ,文章在OracleE數(shù)據(jù)庫的字段上建立索引的方法建站知識主要講述字段,索引,在OracleE數(shù)據(jù)庫的字段上建立索引的方網(wǎng)站建設(shè)源碼以及服務(wù)器配置搭建相關(guān)技術(shù)文章。轉(zhuǎn)載請保留鏈接: http://www.bifwcx.com/article/web_5409.html