創(chuàng)建一個序列:abc_table_s
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),慶城企業(yè)網(wǎng)站建設(shè),慶城品牌網(wǎng)站建設(shè),網(wǎng)站定制,慶城網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,慶城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
插入表的value里引用:abc_table_s.nextval
并行概念
并行執(zhí)行(parallel execution)是Oracle企業(yè)版才有的特性(標(biāo)準(zhǔn)版中沒有這個特性),指能夠?qū)⒁粋€大型串行任務(wù)(任何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ù)加載以及大表的重組等都可以使用并行處理。
并行恢復(fù):這是指數(shù)據(jù)庫能并行地執(zhí)行實例(甚至介質(zhì))恢復(fù),以減少從故障恢復(fù)所需的時間。
過程并行化:這是指能并行地運行所開發(fā)的代碼。
何時使用并行
在應(yīng)用并行執(zhí)行之前,需要保證以下兩點成立:
必須有一個非常大的任務(wù),如對50GB數(shù)據(jù)進行全面掃描。
必須有足夠的可用資源(CPU、I/O、內(nèi)存)。在并行全面掃描50GB數(shù)據(jù)之前,你要確保有足夠的空閑CPU(以容納并行進程),還要有足夠的I/O通道。
如果只有一個小任務(wù)(通常OLTP系統(tǒng)中執(zhí)行的查詢就是這種典型的小任務(wù)),或者你的可用資源不足(這也是OLTP系統(tǒng)中很典型的情況),其中CPU和I/O資源通常已經(jīng)得到最大限度的使用,那就根本不用考慮并行執(zhí)行。
如果一個任務(wù)只需要幾秒(或更短時間)就能串行地完成,引入并行執(zhí)行后,相關(guān)的管理開銷可能會讓整個過程花費更長的時間。
舉例如,寫一頁文檔若12個人來寫,需要開會分段等,可能并不如一個人來寫更快。而如果寫1200頁,12個人寫需要的時間只為原來的1/12,就算分配任務(wù)可能也就1/12,還是比一個人寫要快多了。
并行查詢
并行查詢允許將一個SQL SELECT語句劃分為多個較小的查詢,每個部分的查詢并發(fā)地運行,然后會將各個部分的結(jié)果組合起來,提供最終的答案。
在并行進程和掃描文件之間并不存在1對1映射,可以多個進程掃描同一個文件。
各個并行進程可稱為并行執(zhí)行服務(wù)器(parallel execution server),有時也稱為并行查詢(parallel
query,PQ)從屬進程。各個并行執(zhí)行服務(wù)器都是單獨的會話,就像是專業(yè)服務(wù)器進程一樣連接數(shù)據(jù)庫。每個并行執(zhí)行服務(wù)器分別負(fù)責(zé)掃描表中一個部分(各
個部分都不重疊),匯總其結(jié)果子集,將其輸出發(fā)回給協(xié)調(diào)服務(wù)器(即原始會話的服務(wù)器進程),它再將這些子結(jié)果匯總為最終答案。
在默認(rèn)情況下,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ù)負(fù)載確定并行度。并行度要隨著系統(tǒng)上工作負(fù)載的增減而變化。如果有充足的空閑資源,并行度會
上升;如果可用資源有限,并行度則會下降。這樣就不會為機器強加一個固定的并行度。利用這種方法,允許Oracle動態(tài)地增加或減少查詢所需的并發(fā)資源
量。
【查看默認(rèn)并行數(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ù)集都在一個磁盤上,可能確實不如使用多個磁盤那樣能有更多收獲。即使使用一個磁盤,在響應(yīng)時間上也可能可以得到一定
的速度提升。原因在于:給定的一個并行執(zhí)行服務(wù)器在統(tǒng)計行時并不讀取這些行,反之亦然。所以,與執(zhí)行串行相比,兩個并行執(zhí)行服務(wù)器可以在更短的時間內(nèi)完成
所有行的統(tǒng)計。
數(shù)據(jù)分布在多個物理設(shè)備上可以提高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í)行服務(wù)器來執(zhí)行INSERT、UPDATE、DELETE或MERGE,而不是只利
用一個串行進程。在一個有充足I/O帶寬的多CPU主機上,對于大規(guī)模的DML操作,可能會得到很大的速度提升。
不過,不能把PDML當(dāng)成提高OLTP應(yīng)用速度的一個特性。因為并行操作設(shè)計為要充分、完全地利用一臺機器上的所有資源。通過這種設(shè)計,一個用戶可
以完全使用機器上的所有磁盤、CPU和內(nèi)存。在某些數(shù)據(jù)倉庫中(有大量數(shù)據(jù),而用戶很少),這可能正是你想要的。而在一個OLTP系統(tǒng)中(大量用戶都在做
很短、很快的事務(wù)),可能就不能希望如此了,你不想讓用戶能夠完全占用機器資源。
類似于Oracle執(zhí)行的分布式查詢,PDML操作采用同樣的方式執(zhí)行,即每個并行執(zhí)行服務(wù)器相當(dāng)于一個單獨數(shù)據(jù)庫實例中的一個進程。這些事務(wù)都結(jié)束后,會執(zhí)行一個相當(dāng)于快速2PC的過程來提交這些單獨的獨立事務(wù)。這些事務(wù)要么都由PDML協(xié)調(diào)會話提交,要么無一提交。
由于PDML采用的一種偽分布式的實現(xiàn),因此存在一些限制:
PDML操作期間不支持觸發(fā)器。這是一個很合理的限制,因為觸發(fā)器可能會向更新增加大量開銷,而你使用PDML的本來目的是為了更快一些,這兩方面是矛盾的,不能放在一起。
PDML期間,不支持某些聲明方式的引用完整性約束,因為表中的每一片(部分)會在單獨的會話中作為單獨的事務(wù)進行修改。例如,PDML操作不支持自引用完整性。如果真的支持自引用完整性,可能會出現(xiàn)死鎖和其他鎖定問題。
在提交或回滾之前,不能訪問用PDML修改的表。
PDML不支持高級復(fù)制(因為復(fù)制特性的實現(xiàn)要基于觸發(fā)器)。
不支持延遲約束(也就是說,采用延遲模式的約束)。
如果表是分區(qū)的,PDML只可能在有位圖索引或LOB列的表上執(zhí)行,而且并行度取決于分區(qū)數(shù)。在這種情況下,無法在分區(qū)內(nèi)并行執(zhí)行一個操作,因為每個分區(qū)只有一個并行執(zhí)行服務(wù)器來處理。
執(zhí)行PDML時不支持分布式事務(wù)。
PDML不支持聚簇表。
并行DDL
從維護的觀點看,以及從管理的角度來說,并行DDL才是Oracle中并行執(zhí)行最突出的優(yōu)點。如果認(rèn)為并行查詢主要是為最終用戶設(shè)計的,那么并行
DDL則是為DBA/開發(fā)人員設(shè)計的。如果沒有并行執(zhí)行,DBA將很難真正充分利用硬件的全部能力。但如果利用并行執(zhí)行,則完全可以做到。以下SQL
DDL命令允許“并行化”:
CREATE INDEX:多個并行執(zhí)行服務(wù)器可以掃描表、對數(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í)行服務(wù)器執(zhí)行自己的部分CREATE
TABLE AS SELECT工作,并且都會寫至自己的區(qū)段。INSERT /*+ APPEND
*/(直接路徑插入)會在一個段的HWM“之上“寫,每個并行執(zhí)行服務(wù)器再寫至其自己的一組區(qū)段,而不會與其他并行執(zhí)行服務(wù)器共享。因此,如果執(zhí)行一個并
行CREATE TABLE AS
SELECT,并使用4個并行執(zhí)行服務(wù)器來創(chuàng)建表,就至少有4個分區(qū),可能還會更多。每個并行執(zhí)行服務(wù)器會分配其自己的區(qū)段,向其寫入,等填滿時,再分配
另一個新的區(qū)段,并行執(zhí)行服務(wù)器不會使用由其他并行執(zhí)行服務(wù)器非品牌的區(qū)段。
序列+觸發(fā)器 實現(xiàn),代碼如下:
CREATE SEQUENCE SEQname
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999
/
CREATE TRIGGER TRGname
BEFORE INSERT ON table_name
REFERENCING
NEW AS :NEW
FOR EACH ROW
Begin
SELECT SEQname.NEXTVAL
INTO :NEW.FIELDname
FROM DUAL;
End;
dbms_job.submit( job out binary_integer,
what in archar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
●job:輸出變量,是此任務(wù)在任務(wù)隊列中的編號;
●what:執(zhí)行的任務(wù)的名稱及其輸入?yún)?shù);
●next_date:任務(wù)執(zhí)行的時間;
●interval:任務(wù)執(zhí)行的時間間隔。
interval取值'SYSDATE + 1/24'就是每天運行一次
參考dbms_aqadm.create_queue_table
1.存儲參數(shù)storage_clause 可以是 MAXTRANS,LOB等
2.sort_list 可以是PRIORITY,enq_time這2個參數(shù)或者其中一個。具體可以察看對應(yīng)的 隊列表的數(shù)據(jù)結(jié)構(gòu)。例如下面的例子
--創(chuàng)建隊列表,‘sms_aq_tab’ 隊列表名,' sms_aq_tab '隊列對象名(充當(dāng)消息體的對象名稱),以下同
dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG');
--創(chuàng)建具有排序功能的隊列表
dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list = 'PRIORITY,enq_time');
3。消息分組參數(shù) message_grouping 可以是 NONE,或 TRANSACTIONAL
-- message grouping
dbms_aqadm.TRANSACTIONAL CONSTANT BINARY_INTEGER := 1;
dbms_aqadm.NONE CONSTANT BINARY_INTEGER := 0;后者表示一個與事務(wù)相關(guān)的消息分成1組,在提取消息的時候可以當(dāng)成一組相關(guān)消息來提取。例如:
--創(chuàng)建帶帶分組功能的消息隊列表
dbms_aqadm.create_queue_table('WDZGROUPAQTABLE','WDZAQMSG',
sort_list = 'PRIORITY,enq_time',
message_grouping =dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/ );
4.multiple_consumers表示消息接受者是否為多個用戶。默認(rèn)是只有1個接收者。如果要多個用戶可以接受消息,需要設(shè)置=true
--創(chuàng)建多個接收者的消息隊列表
dbms_aqadm.create_queue_table('WDZMUTIAQTABLE','WDZAQMSG',sort_list = 'PRIORITY,enq_time',
message_grouping =dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/
,multiple_consumers = true);
4.2刪除隊列表
Exec dbms_aqadm.drop_queue_table(queue_table = 'sms_mt_tab');
Exec dbms_aqadm.drop_queue_table(queue_table = 'sms_mo_tab');
4.3建立隊列
建立隊列代碼如下:
exec dbms_aqadm.create_queue(queue_name='sms_mt_queue', queue_table='sms_mt_tab');
exec dbms_aqadm.create_queue(queue_name='sms_mt_queue_exception', queue_table='sms_mt_tab',queue_type=dbms_aqadm.EXCEPTION_QUEUE);
exec dbms_aqadm.create_queue(queue_name='sms_mt_queue_backup', queue_table='sms_mt_tab');
這個問題在MyOracleSupport上有文檔講
Getting ORA-600 [kcbgcur_3] When Creating a Queue Table (Doc ID 555035.1)
這個錯誤是因為之前有人drop過這個隊列表,但是沒有成功。導(dǎo)致AQ Metadata損壞。
依次嘗試如下步驟
DBMS_AQADM.DROP_QUEUE_TABLE(queue_table = 'qtable_name');
DBMS_AQADM.DROP_QUEUE_TABLE(queue_table = 'qtable_name', force = TRUE);
嘗試創(chuàng)建隊列表,如果不行
重啟實例以清除內(nèi)存殘留信息
嘗試創(chuàng)建隊列表,如果還不行,需要手動的清除AQ metadata.這個得找Oracle Support部門開SR。我也不知道怎么手動清除。