可用instr函數(shù)。
為陽春等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及陽春網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都做網(wǎng)站、網(wǎng)站設計、陽春網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
如:
select?instr('sdfcontain234','contain')?from?dual;
結(jié)果:
如果返回值大于0,則表示字符串中包含contain。
再如:
select?instr('sdfcontn234','contain')?from?dual;
結(jié)果:
如果返回值為0,則代表字符串中不包含contain。
前閉后開(30 = xxx 50)只能用 = xxx 來連接
WHERE xxx = 30 AND xxx 50
如果是前后都閉合(30= xxx = 50)那么可以用BETWEEN XX AND xxx
WHERE XXX BETWEEN 30 AND 50
使用 like 關(guān)鍵字即可。 如查查詢 test 表的 name 列, 所有包括A開頭的值
select * from test where name like 'A%';
并行概念
并行執(zhí)行(parallel execution)是Oracle企業(yè)版才有的特性(標準版中沒有這個特性),指能夠?qū)⒁粋€大型串行任務(任何DML,或者一般的DDL)物理地劃分為多個較小的部分,這些較小的部分可以同時得到處理。
并行包括:
并行查詢:這是指能使用多個操作系統(tǒng)進程或線程來執(zhí)行一個查詢。Oracle會發(fā)現(xiàn)能并行執(zhí)行的操作(如全表掃描或大規(guī)模排序),并創(chuàng)建一個查詢計劃來實現(xiàn))。
并行DML(PDML):這在本質(zhì)上與并行查詢很相似,但是PDML主要是使用并行處理來執(zhí)行修改(INSERT、UPDATE、DELETE和MERGE)。
并行DDL:并行DDL是指Oracle能并行地執(zhí)行大規(guī)模的DDL操作。例如,索引重建、創(chuàng)建一個新索引、數(shù)據(jù)加載以及大表的重組等都可以使用并行處理。
并行恢復:這是指數(shù)據(jù)庫能并行地執(zhí)行實例(甚至介質(zhì))恢復,以減少從故障恢復所需的時間。
過程并行化:這是指能并行地運行所開發(fā)的代碼。
何時使用并行
在應用并行執(zhí)行之前,需要保證以下兩點成立:
必須有一個非常大的任務,如對50GB數(shù)據(jù)進行全面掃描。
必須有足夠的可用資源(CPU、I/O、內(nèi)存)。在并行全面掃描50GB數(shù)據(jù)之前,你要確保有足夠的空閑CPU(以容納并行進程),還要有足夠的I/O通道。
如果只有一個小任務(通常OLTP系統(tǒng)中執(zhí)行的查詢就是這種典型的小任務),或者你的可用資源不足(這也是OLTP系統(tǒng)中很典型的情況),其中CPU和I/O資源通常已經(jīng)得到最大限度的使用,那就根本不用考慮并行執(zhí)行。
如果一個任務只需要幾秒(或更短時間)就能串行地完成,引入并行執(zhí)行后,相關(guān)的管理開銷可能會讓整個過程花費更長的時間。
舉例如,寫一頁文檔若12個人來寫,需要開會分段等,可能并不如一個人來寫更快。而如果寫1200頁,12個人寫需要的時間只為原來的1/12,就算分配任務可能也就1/12,還是比一個人寫要快多了。
并行查詢
并行查詢允許將一個SQL SELECT語句劃分為多個較小的查詢,每個部分的查詢并發(fā)地運行,然后會將各個部分的結(jié)果組合起來,提供最終的答案。
在并行進程和掃描文件之間并不存在1對1映射,可以多個進程掃描同一個文件。
各個并行進程可稱為并行執(zhí)行服務器(parallel execution server),有時也稱為并行查詢(parallel
query,PQ)從屬進程。各個并行執(zhí)行服務器都是單獨的會話,就像是專業(yè)服務器進程一樣連接數(shù)據(jù)庫。每個并行執(zhí)行服務器分別負責掃描表中一個部分(各
個部分都不重疊),匯總其結(jié)果子集,將其輸出發(fā)回給協(xié)調(diào)服務器(即原始會話的服務器進程),它再將這些子結(jié)果匯總為最終答案。
在默認情況下,Oracle是不啟用并行查詢的。啟用并行查詢有多種方法,可以直接在查詢中使用一個提示,或者修改表要求考慮并行執(zhí)行路徑等。
【并行查詢方法】
1)暗示hints式,臨時有效
select /*+parallel(table_name num)*/ count(*) from table_name;
多表關(guān)聯(lián)時多表并行:
select /*+parallel(table_name1,num1) parallel(table_name2,num2)*/ count(*) from table_name1, table_name2;
2)alter table對象式,長期有效
alter table table_name parallel num;
3)alter session會話式,會話生命周期有效
alter session force parallel query parallel num;
4)并行DDL式,會話生命周期有效
alter session enable parallel dml;
對于前兩種方式,若省略num則Oracle將自動根據(jù)負載確定并行度。并行度要隨著系統(tǒng)上工作負載的增減而變化。如果有充足的空閑資源,并行度會
上升;如果可用資源有限,并行度則會下降。這樣就不會為機器強加一個固定的并行度。利用這種方法,允許Oracle動態(tài)地增加或減少查詢所需的并發(fā)資源
量。
【查看默認并行數(shù)】
1)確定會話SID
select sid from v$mystat where rownum = 1;
2)在其他會話中查詢
select sid,qcsid,server#,degree from v$px_session where qcsid = num;
一般而言,如果能訪問盡可能多的資源(CPU、內(nèi)存和I/O),并行執(zhí)行就能最好地發(fā)揮作用。但這并不是說如果整個數(shù)據(jù)集都在一個磁盤上,就從并行
查詢得不到任何好處。不過如果整個數(shù)據(jù)集都在一個磁盤上,可能確實不如使用多個磁盤那樣能有更多收獲。即使使用一個磁盤,在響應時間上也可能可以得到一定
的速度提升。原因在于:給定的一個并行執(zhí)行服務器在統(tǒng)計行時并不讀取這些行,反之亦然。所以,與執(zhí)行串行相比,兩個并行執(zhí)行服務器可以在更短的時間內(nèi)完成
所有行的統(tǒng)計。
數(shù)據(jù)分布在多個物理設備上可以提高I/O,如表分區(qū)、跨磁盤等。
在Oracle 11g Release2及以上版本中,引入了一項新功能來限制資源過度使用:并行語句排除(Parallel
Statement
Queuing,PSQ)。使用PSQ時,數(shù)據(jù)庫會限制并發(fā)執(zhí)行的并行查詢數(shù),并把更多的并行請求放在一個執(zhí)行隊列中。CPU資源用盡時數(shù)據(jù)庫會阻止新的
請求變?yōu)榛顒訝顟B(tài)。這些請求并沒有失敗,它們只是會延遲開始,也就是說它們將排隊。資源可用時,數(shù)據(jù)庫就會開始執(zhí)行隊列中的查詢。
并行DML
Oracle文檔將并行DML(PDML)一詞的范圍限制為只包括INSERT、UPDATE、DELETE和MERGE(不像平常的DML那樣還
包括SELECT)。在PDML期間,Oracle可以使用多個并行執(zhí)行服務器來執(zhí)行INSERT、UPDATE、DELETE或MERGE,而不是只利
用一個串行進程。在一個有充足I/O帶寬的多CPU主機上,對于大規(guī)模的DML操作,可能會得到很大的速度提升。
不過,不能把PDML當成提高OLTP應用速度的一個特性。因為并行操作設計為要充分、完全地利用一臺機器上的所有資源。通過這種設計,一個用戶可
以完全使用機器上的所有磁盤、CPU和內(nèi)存。在某些數(shù)據(jù)倉庫中(有大量數(shù)據(jù),而用戶很少),這可能正是你想要的。而在一個OLTP系統(tǒng)中(大量用戶都在做
很短、很快的事務),可能就不能希望如此了,你不想讓用戶能夠完全占用機器資源。
類似于Oracle執(zhí)行的分布式查詢,PDML操作采用同樣的方式執(zhí)行,即每個并行執(zhí)行服務器相當于一個單獨數(shù)據(jù)庫實例中的一個進程。這些事務都結(jié)束后,會執(zhí)行一個相當于快速2PC的過程來提交這些單獨的獨立事務。這些事務要么都由PDML協(xié)調(diào)會話提交,要么無一提交。
由于PDML采用的一種偽分布式的實現(xiàn),因此存在一些限制:
PDML操作期間不支持觸發(fā)器。這是一個很合理的限制,因為觸發(fā)器可能會向更新增加大量開銷,而你使用PDML的本來目的是為了更快一些,這兩方面是矛盾的,不能放在一起。
PDML期間,不支持某些聲明方式的引用完整性約束,因為表中的每一片(部分)會在單獨的會話中作為單獨的事務進行修改。例如,PDML操作不支持自引用完整性。如果真的支持自引用完整性,可能會出現(xiàn)死鎖和其他鎖定問題。
在提交或回滾之前,不能訪問用PDML修改的表。
PDML不支持高級復制(因為復制特性的實現(xiàn)要基于觸發(fā)器)。
不支持延遲約束(也就是說,采用延遲模式的約束)。
如果表是分區(qū)的,PDML只可能在有位圖索引或LOB列的表上執(zhí)行,而且并行度取決于分區(qū)數(shù)。在這種情況下,無法在分區(qū)內(nèi)并行執(zhí)行一個操作,因為每個分區(qū)只有一個并行執(zhí)行服務器來處理。
執(zhí)行PDML時不支持分布式事務。
PDML不支持聚簇表。
并行DDL
從維護的觀點看,以及從管理的角度來說,并行DDL才是Oracle中并行執(zhí)行最突出的優(yōu)點。如果認為并行查詢主要是為最終用戶設計的,那么并行
DDL則是為DBA/開發(fā)人員設計的。如果沒有并行執(zhí)行,DBA將很難真正充分利用硬件的全部能力。但如果利用并行執(zhí)行,則完全可以做到。以下SQL
DDL命令允許“并行化”:
CREATE INDEX:多個并行執(zhí)行服務器可以掃描表、對數(shù)據(jù)排序,并把有序的段寫出到索引結(jié)構(gòu)。
CREATE TABLE AS SELECT:執(zhí)行SELECT的查詢可以使用并行查詢來執(zhí)行,表加載本身可以并行完成。
ALTER INDEX REBUILD:索引結(jié)構(gòu)可以并行重建。
ALTER TABLE MOVE:表可以并行移動。
ALTER TABLE SPLIT|COALESCE PARTITION:單個表分區(qū)可以并行地分解或合并。
ALTER INDEX SPLIT PARTITION:索引分區(qū)可以并行地分解。
前4個命令還適用于單個的表/索引分區(qū),也就是說,可以并行地MOVE一個表的單個分區(qū)。
并行DDL和使用外部表的數(shù)據(jù)加載
利用并行DDL,再加上外部表,就能通過一個簡單的CREATE TABLE AS SELECT or INSERT /*+ APPEND
*/來實現(xiàn)并行直接路徑加載。不用再編寫腳本,不必再分解文件,也不用協(xié)調(diào)要運行的N個腳本。簡單地說,通過結(jié)合并行DDL和外部表,不僅提供了純粹的易
用性,而且全無性能損失。
并行DDL和區(qū)段截斷
并行DDL依賴于直接路徑操作。也就是說,數(shù)據(jù)不傳遞到緩沖區(qū)緩存以便以后寫出;而是由一個操作(如CREATE TABLE AS
SELECT)來創(chuàng)建新的區(qū)段,并直接寫入這些區(qū)段,數(shù)據(jù)直接從查詢寫到磁盤(放在這些新分配的區(qū)段中)。每個并行執(zhí)行服務器執(zhí)行自己的部分CREATE
TABLE AS SELECT工作,并且都會寫至自己的區(qū)段。INSERT /*+ APPEND
*/(直接路徑插入)會在一個段的HWM“之上“寫,每個并行執(zhí)行服務器再寫至其自己的一組區(qū)段,而不會與其他并行執(zhí)行服務器共享。因此,如果執(zhí)行一個并
行CREATE TABLE AS
SELECT,并使用4個并行執(zhí)行服務器來創(chuàng)建表,就至少有4個分區(qū),可能還會更多。每個并行執(zhí)行服務器會分配其自己的區(qū)段,向其寫入,等填滿時,再分配
另一個新的區(qū)段,并行執(zhí)行服務器不會使用由其他并行執(zhí)行服務器非品牌的區(qū)段。
在數(shù)據(jù)倉庫環(huán)境中,執(zhí)行一個大規(guī)模的加載之后,這可能導致“過渡浪費“。假設你想加載1,010MB的數(shù)據(jù)(大約1GB),而且正在使用一個有
100MB區(qū)段的表空間,你決定使用10個并行執(zhí)行服務器來加載這個數(shù)據(jù)。每個并行執(zhí)行服務器先分配其自己的100MB區(qū)段(總共會有10個100MB的
區(qū)段),并在其中填入數(shù)據(jù)。由于每個并行執(zhí)行服務器都要加載101MB的數(shù)據(jù),所以它會填滿第一個區(qū)段,然后再繼續(xù)分配另一個100MB的區(qū)段,但實際上
只會使用這個區(qū)段中1MB的空間?,F(xiàn)在就有了20區(qū)段,其中10個是滿的,另外10個則不同,這10個區(qū)段中都各有1MB的數(shù)據(jù),因此,總共會有
990MB的空間是”已分配但未使用的“。下一次加載是可以使用這個空間,但是對現(xiàn)在來說,你就有了990MB的死空間。此時區(qū)段截斷(extend
trimming)就能派上用場了。Oracle會試圖取每個并行執(zhí)行服務器的最后一個區(qū)段,并將其”截斷為“可能的最小大小。
區(qū)段截斷和字典管理表空間
如果使用傳統(tǒng)的字典管理表空間,Oracle可以把只包含1MB數(shù)據(jù)的各個100MB區(qū)段轉(zhuǎn)變或1MB的區(qū)段。遺憾的是,(在字典管理的表空間中)
這會留下10個不連續(xù)的99MB空閑區(qū)段,因為你的分配機制采用的是100MB區(qū)段,所以這990MB空間就會用不上!下一次分配100MB時,往往無法
使用現(xiàn)有的這些空間,因為現(xiàn)在的情況是:有99MB的空閑空間,接下來是1MB的已分配空間,然后又是99MB空閑空間,依此類推。
區(qū)段截斷和本地管理表空間
本地管理表空間有兩種類型:UNIFORM SIZE 和AUTOALLOCATE,UNIFORM
SIZE是指表空間中的每個區(qū)段大小總是完全相同;AUTOALLOCATE則表示Oracle會使用一種內(nèi)部算法來確定每個區(qū)段應該是多大。這些方法都
能很好地解決上述問題,不過,這兩種方法的解決策略截然不同。
在字典管理的表空間中,如果請求一個100MB區(qū)段,倘若Oracle只找到了99MB的自由區(qū)段,請求還是會失敗。與字典管理表空間不同,有AUTOALLOCATE區(qū)段的本地管理表空間可以更為靈活。為了試圖使用所有空閑空間,它可以減小所請求的空間大小。
隨著使用并行直接路徑操作向表UNIFORM_TEST加載越來越多的數(shù)據(jù),過一段時間后,空間利用情況會變得越來越糟糕。對此,我們可能希望使用
一個更小的統(tǒng)一區(qū)段大小,或者使用AUTOALLOCATE。一段時間后,AUTOALLOCATE也可能生成更多的區(qū)段,但是由于會發(fā)生區(qū)段截斷,所以
空間利用情況要好得多。
plsql developer中 有個“小望遠鏡圖標的”搜索功能
select TABLE_NAME from user_tab_columns where column_name Like '%K%'
描述再詳細些,這兩個表的字段是否以知,確定,如果能確定是哪連個字段可用如下SQL
select *
from table1
where exists (select 1
from table2
where table1.columA like '%' || table2.columB || '%')
如果不確定想要所有匹配,那就寫存儲過程吧