亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在OracleE數(shù)據(jù)庫的字段上建立索引的方法

 更新時間:2007年04月02日 00:00:00   作者:  
當(dāng)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 編碼中的條件。以下列查詢語句為例:
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
現(xiàn)在,優(yōu)化器為WHERE 子句中AND 聯(lián)結(jié)的兩個語句中每一個語句確定的范圍進行掃描----第二個語句沒有引用函數(shù),因而使用了索引。在兩個范圍掃描后,將運行結(jié)果合并。 在這個例子中,如果數(shù)據(jù)庫有成百上千行,可以用下列方法擴充WHERE 子句,進一步縮小掃描范圍:
select address from address where upper(name) like 'JOHN' AND (name like 'JO%'   or name like 'jo%' or name like 'Jo' or name like 'jO' );
得到的結(jié)果與以前相同,但是,其執(zhí)行過程如下所示,表明有4個掃描范圍。
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            TABLE ACCESS BY INDEX ROWID ADDRESS                INDEX RANGE SCAN ADDRESS_I            TABLE ACCESS BY INDEX ROWID ADDRESS                 INDEX RANGE SCAN ADDRESS_I
如果試圖進一步提高查詢速度,我們可以在特定的"name like"條件中指明3個或更多的字符。然而,這樣做會使得WHERE子句十分笨重。因為需要大小寫字符所有可能的組合-joh ,Joh,jOh,joH等等。除此之外,指定一個或兩個字符已足以加快查詢的運行速度了。 現(xiàn)在讓我們看看,當(dāng)我們引用不同的函數(shù)時,怎樣運用這個基本技術(shù)。 使用REPLACE的情況 正如名字不總是以大寫輸入一樣,電話號碼也會以許多格式出現(xiàn): 如 123-456-7890, 123 456 7890,(123)456-7890 等等。 如果在列名為 PHONE_NUMBER中搜尋上述號碼時,可能需要使用函數(shù)REPLACE以保證統(tǒng)一的格式。如果在PHONE_NUMBER列中只包含空格、連字符和數(shù)字,where 子句可以如下所示:
WHERE replace(replace(phone_number , '-' ) , ' ' ) = '1234567890'
WHERE子句兩次使用REPLACE 函數(shù)去掉了連字符和空格,保證了電話號碼是簡單的數(shù)字串。然而,該函數(shù)阻止了優(yōu)化器在該列使用索引。因此,我們按如下方法修改WHERE子句,以強制執(zhí)行索引。
WHERE replace(replace(phone_number, '-' ) , ' ' ) = '1234567890'
AND phone_number like '123% '如果我們知道數(shù)據(jù)中可能包含圓括號,WHERE 子句會稍微復(fù)雜一點。我們可以再增加REPLACE 函數(shù)(去掉圓括號、連字符和空格),按如下所示擴充增加的條件:
WHERE replace(replace(replace(replace(phone_number , ' - ' ) ,' '), '( ' )   , ' ) ' ) = '1234567890'   AND (phone number like ' 123% ' or phone_number like ' (123% ' ) '
該例強調(diào)了巧妙地選用WHERE 子句條件的重要性,而且,這些條件不會改變查詢結(jié)果。你的選擇應(yīng)基于完全了解該列中存在的信息類型。在該例中,我們需要知道 PHONE_NUMBER 數(shù)據(jù)中存在幾種不同的格式,這樣,我們能夠修改WHERE 子句而不會影響查詢結(jié)果。 正確的條件 以后當(dāng)你遇到包含CHARACTER 數(shù)據(jù)修改函數(shù)列的WHERE 子句時,應(yīng)考慮怎樣利用增加一個或兩個特定的條件,迫使優(yōu)化器使用索引。適當(dāng)?shù)剡x擇一組特定的條件能減少掃描行,并且強制使用索引不會影響查詢結(jié)果----但卻提高了查詢的執(zhí)行速度。

相關(guān)文章

  • Oracle聯(lián)機日志文件與歸檔文件詳細介紹

    Oracle聯(lián)機日志文件與歸檔文件詳細介紹

    這篇文章主要介紹了Oracle聯(lián)機日志文件與歸檔文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • oracle scott 解鎖步驟

    oracle scott 解鎖步驟

    本節(jié)主要介紹了oracle scott 解鎖的具體步驟,需要的朋友可以參考下
    2014-07-07
  • Oracle數(shù)據(jù)庫自動備份腳本分享(超實用)

    Oracle數(shù)據(jù)庫自動備份腳本分享(超實用)

    這篇文章主要給大家分享介紹了關(guān)于Oracle數(shù)據(jù)庫自動備份腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Oracle EXP和IMP用法和介紹

    Oracle EXP和IMP用法和介紹

    正在看的ORACLE教程是:OracleEXP和IMP用法和介紹
    2007-03-03
  • 關(guān)于Oracle多表連接,提高效率,性能優(yōu)化操作

    關(guān)于Oracle多表連接,提高效率,性能優(yōu)化操作

    這篇文章主要介紹了關(guān)于Oracle多表連接,提高效率,性能優(yōu)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Oracle數(shù)據(jù)庫由dataguard備庫引起的log file sync等待問題

    Oracle數(shù)據(jù)庫由dataguard備庫引起的log file sync等待問題

    這篇文章主要介紹了Oracle數(shù)據(jù)庫由dataguard備庫引起的log file sync等待,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • oracle使用索引與不使用索引的性能詳析

    oracle使用索引與不使用索引的性能詳析

    索引是建立在表的一列或多個列上的輔助對象,目的是加快訪問表中的數(shù)據(jù),下面這篇文章主要給大家分析介紹了關(guān)于oracle使用索引與不使用索引的性能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-10-10
  • ORACLE實現(xiàn)字段自增示例說明

    ORACLE實現(xiàn)字段自增示例說明

    如何實現(xiàn)oracle中字段的自增,下面用一個例子來說明,有此需求的各位朋友可以參考下
    2013-11-11
  • 詳解Oracle隱式游標(biāo)和顯式游標(biāo)

    詳解Oracle隱式游標(biāo)和顯式游標(biāo)

    游標(biāo)是什么?就是在內(nèi)存開辟的一塊臨時存儲空間。下面通過本文給大家介紹Oracle隱式游標(biāo)和顯式游標(biāo)的相關(guān)知識,需要的朋友參考下吧
    2017-07-07
  • Oracle?創(chuàng)建和操作表的示例代碼

    Oracle?創(chuàng)建和操作表的示例代碼

    本節(jié)主要介紹Oracle創(chuàng)建、修改和刪除表的基本操作,對創(chuàng)建數(shù)據(jù)庫表一般有兩種方式,文中結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2023-12-12

最新評論