1. 程式人生 > >oracle 常用函式,Parallel並行查詢--工作備忘2016/1/18

oracle 常用函式,Parallel並行查詢--工作備忘2016/1/18


在執行DML(insert,update,delete)語句時,可以用到以下三個隱式遊標(遊標是維護查詢結果的記憶體中的一個區域,執行DML時開啟,完成時關閉,用sql%isopen檢查是否開啟):

sql%rowcount用於記錄修改的條數,就如你在sqlplus下執行delete from之後提示已刪除xx行一樣,這個引數必須要在一個修改語句和commit之間放置,否則你就得不到正確的修改行數。 

sql%found (布林型別,預設值為null

sql%notfound(布林型別,預設值為null)

sql%rowcount(數值型別預設值為0)

sql%isopen(

布林型別)

當執行一條DML語句後,DML語句的結果儲存在四個遊標屬性中,這些屬性用於控制程式流程或者瞭解程式的狀態。當執行DML語句時,PL/SQL開啟一個內建遊標並處理結果,遊標是維護查詢結果的記憶體中的一個區域,遊標在執行DML語句時開啟,完成後關閉。隱式遊標只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個屬性.SQL%FOUND,SQL%NOTFOUND是布林值,SQL%ROWCOUNT是整數值。

SQL%FOUND和SQL%NOTFOUND在執行任何DML語句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,

在執行DML語句後,SQL%FOUND的屬性值將是:

  . TRUE :INSERT

  . TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.

  . TRUE :SELECT INTO至少返回一行

  當SQL%FOUND為TRUE時,SQL%NOTFOUND為FALSE。

  SQL%ROWCOUNT

  在執行任何DML語句之前,SQL%ROWCOUNT的值都是NULL,對於SELECT INTO語句,如果執行成功,SQL%ROWCOUNT的值為1,如果沒有成功或者沒有操作(如update、insert、delete為0條),SQL%ROWCOUNT的值為0.

  SQL%ISOPEN

  SQL%ISOPEN

是一個布林值,如果遊標開啟,則為TRUE, 如果遊標關閉,則為FALSE.對於隱式遊標而言SQL%ISOPEN總是FALSE,這是因為隱式遊標在DML語句執行時開啟,結束時就立即關閉。

no_data_found 與sql%notfound 以及sql%rowcount 的區別:

NO_DATA_FOUND:該異常可以在兩種不同的情況下出現:第一種:當SELECT。。。。INTO語的 WHERE子句 沒匹配任何資料行時;第二種:試圖引用尚未賦值的PL/SQL index-by表元素時。

SQL%NOTFOUND:是隱匿遊標的屬性,當沒有可檢索的資料時,該屬性為:TRUE;常作為檢索迴圈退出的條件。若某UPDATE或DELETE語句的WHERE子句不匹配任何資料行,該屬性為:TRUE,但不併不出現NO_DATA_FOUND異常.

SQL%ROWCOUNT:該數字屬性返回了到目前為止,遊標所檢索資料庫行的個數。

2、substr(SQLERRM, 1, 70)  :SQLERRM為錯誤程式碼

3、異常

EXCEPTION
  when others then
    rollback;
    dbms_output.put_line('code:' || sqlcode);
    dbms_output.put_line('errm:' || sqlerrm);

    raise;
when others then和raise:
異常分很多種類,如NO_FOUND。others處本應該寫異常名稱,如果不想把異常分得那麼細,可以籠統一點用others來捕獲,即所有異常均用others來捕獲。
when others then表示是其它異常。
raise表示丟擲異常,讓User可以看到。

4、並行查詢

Parallel分類
l  並行查詢parallel query
l  並行dml parallel dml pdml
l  並行ddl parallel ddl pddl
 
一、 並行查詢
並行查詢允許將一個sql select語句劃分為多個較小的查詢,每個部分的查詢併發地執行,然後將各個部分的結果組合起來,提供最終的結果,多用於全表掃描,索引全掃描等,大表的掃描和連線、建立大的索引、分割槽索引掃描、大批量插入更新和刪除
 
1.    啟用並行查詢
SQL> ALTER TABLE T1 PARALLEL;
告知oracle,對T1啟用parallel查詢,但並行度要參照系統的資源負載狀況來確定。
利用hints提示,啟用並行,同時也可以告知明確的並行度,否則oracle自行決定啟用的並行度,這些提示只對該sql語句有效。
SQL> select /*+ parallel(t1 8) */ count(*)from t1;
 
SQL> select degree from user_tables where table_name='T1';
DEGREE
--------------------
  DEFAULT
 
並行度為Default,其值由下面2個引數決定
SQL> show parameter cpu
 
NAME                                TYPE       VALUE
----------------------------------------------- ------------------------------
cpu_count                           integer    2
parallel_threads_per_cpu            integer    2
 
cpu_count表示cpu數
parallel_threads_per_cpu表示每個cpu允許的並行程序數
default情況下,並行數為cpu_count*parallel_threads_per_cpu
 
2.    取消並行設定
SQL> alter table t1 noparallel;
SQL> select degree from user_tables wheretable_name='T1';
 
DEGREE
----------------------------------------
        1
 
3.    資料字典檢視
v$px_session
sid:各個並行會話的sid
qcsid:query coordinator sid,查詢協調器sid
 
二、 並行dml
並行dml包括insert,update,delete,merge,在pdml期間,oracle可以使用多個並行執行伺服器來執行insert,update,delete,merge,多個會話同時執行,同時每個會話(併發程序)都有自己的undo段,都是獨立的一個事務,這些事務要麼由pdml協調器程序提交,要麼都rollback。
在一個有充足I/o頻寬的多cpu主機中,對於大規模的dml,速度可能會有很大的提升,尤其是在大型的資料倉庫環境中。
並行dml需要顯示的啟用
SQL> alter session enable parallel dml;
 
Disable並行dml
SQL> alter session disable parallel dml;
 
三、 並行ddl
並行ddl提供了dba使用全部機器資源的能力,常用的pddl有
create table as select ……
create index
alter index rebuild
alter table move
alter table split
在這些sql語句後面加上parallel子句

SQL> alter table t1 move parallel;
Table altered
SQL> create index T1_IDX on T1 (OWNER,OBJECT_TYPE)
 2   tablespace SYSTEM
3        parallel;
4        ;




1.  用途


強行啟用並行度來執行當前SQL。這個在Oracle 9i之後的版本可以使用,之前的版本現在沒有環境進行測試。也就是說,加上這個說明,可以強行啟用Oracle的多執行緒處理功能。舉例的話,就像電腦裝了多核的CPU,但大多情況下都不會完全多核同時啟用(2核以上的比較明顯),使用parallel說明,就會多核同時工作,來提高效率。


但本身啟動這個功能,也是要消耗資源與效能的。所有,一般都會在返回記錄數大於100萬時使用,效果也會比較明顯。


2.  語法


/*+parallel(table_short_name,cash_number)*/


這個可以加到insert、delete、update、select的後面來使用(和rule的用法差不多,有機會再分享rule的用法)


開啟parallel功能的語句是:


alter session enable parallel dml;


這個語句是DML語句哦,如果在程式中用,用execute的方法開啟。


3.  例項說明


用ERP中的transaction來說明下吧。這個table記錄了所有的transaction,而且每天資料量也算相對比較大的(根據企業自身業務量而定)。假設我們現在要檢視對比去年一年當中每月的進、銷情況,所以,一般都會寫成:


select to_char(transaction_date,'yyyymm') txn_month,


       sum(


        decode(


            sign(transaction_quantity),1,transaction_quantity,0
              )


          ) in_qty,


       sum(


        decode(


            sign(transaction_quantity),-1,transaction_quantity,0
              )


          ) out_qty


  from mtl_material_transactions mmt


 where transaction_date >= add_months(


                            to_date(    


                                to_char(sysdate,'yyyy')||'0101','yyyymmdd'),


                                -12)


   and transaction_date <= add_months(


                            to_date(


                                to_char(sysdate,'yyyy')||'1231','yyyymmdd'),


                                -12)


group by to_char(transaction_date,'yyyymm') 


這個SQL執行起來,如果transaction_date上面有加index的話,效率還算過的去;但如果沒有加index的話,估計就會半個小時內都執行不出來。這是就可以在select 後面加上parallel說明。例如:
select /*+parallel(mmt,10)*/
       to_char(transaction_date,'yyyymm') txn_month,


...


 


這樣的話,會大大提高執行效率。如果要將檢索出來的結果insert到另一個表tmp_count_tab的話,也可以寫成:
insert /*+parallel(t,10)*/
  into tmp_count_tab


(


    txn_month,


    in_qty,


    out_qty


)


select /*+parallel(mmt,10)*/
       to_char(transaction_date,'yyyymm') txn_month,


...


 


插入的機制和檢索機制差不多,所以,在insert後面加parallel也會加速的。關於insert機制,這裡暫不說了。
Parallel後面的數字,越大,執行效率越高。不過,貌似跟server的配置還有oracle的配置有關,增大到一定值,效果就不明顯了。所以,一般用8,10,12,16的比較常見。我試過用30,發現和16的效果一樣。不過,數值越大,佔用的資源也會相對增大的。如果是在一些package、function or procedure中寫的話,還是不要寫那麼大,免得佔用太多資源被DBA開K。
  


4.  Parallel也可以用於多表


多表的話,就是在第一後面,加入其他的就可以了。具體寫法如下:


/*+parallel(t,10) (b,10)*/


5.  小結


關於執行效率,建議還是多按照index的方法來提高效果。Oracle有自帶的explan road的方法,在執行之前,先看下執行計劃路線,對寫好的SQL tuned之後再執行。實在沒辦法了,再用parallel方法。Parallel比較邪惡,對開發者而言,不是好東西,會養成不好習慣,導致很多bad SQL不會暴漏,SQL Tuning的能力得不到提升。我有見過某些人create table後,從不create index或primary key,認為寫SQL時加parallel就可以了。

引用文章:http://blog.csdn.net/jojo52013145/article/details/7460121

5、

ORDERED提示強制Oracle按照From子句中表出現的順序進行表連線。

     通過ORDERED提示,可以避免CBO SQL解析過程中的表連線評估,從而避免Oracle產生錯誤的執行計劃,或者強制Oracle按照我們指定的方式執行。在很多時候,當我們清楚地瞭解資料結構和資料分佈之後,就可以通過ORDERED提示來提高SQL效能。

1SQL>SELECT/*+ ordered */COUNT (*)
22FROM t_middle, t_small, t_max
33WHERE t_small.object_id= t_middle.object_id44AND t_middle.object_id= t_max.object_id;

相關推薦

oracle 常用函式Parallel並行查詢--工作2016/1/18

在執行DML(insert,update,delete)語句時,可以用到以下三個隱式遊標(遊標是維護查詢結果的記憶體中的一個區域,執行DML時開啟,完成時關閉,用sql%isopen檢查是否開啟): sql%rowcount用於記錄修改的條數,就如你在sqlplu

Mysql04各種函式加密,條件查詢

本章節主要說一下mysql的各種函式用法以及條件子查詢,廢話不多說,大家看的時候概念瀏覽一下就可以,重點看下面的例子程式碼。 Mysql函式  字串  數字  日期 字串函式 char_length(‘a中’) - 字元數 length(‘a中’) - 位元組數 concat(

ORACLE常用函式彙總【轉】

前一段時間學習Oracle 時做的學習筆記,整理了一下,下面是分享的Oracle常用函式的部分筆記,以後還會分享其他部分的筆記,請大家批評指正。 1.Oracle 資料庫中的to_date()函式的使用:   往emp表中插入一條記錄: SQL> insert into emp

C++實現的splite函式記錄便於查詢

記錄方便查詢 vector<string> splite(const string &s, const string &c)//分割字元用的 { std::string::size_type pos1, pos2; vector<stri

生產環境中Oracle常用函式總結

1>to_char,將日期轉換為字元;add_months,在第一個引數的日期上加或者減第二個引數的值 select dkzh,jkhtbh,yhkrq,dkffrq,shqs,dqyqcs,to_char(add_months(dkffrq,shqs+dqyqcs+1),'yyyymm'

oracle常用函式案例

--INSTR函式 SELECT INSTR(' HELLO WORLD','H') FROM DUAL; --LTRIM RTRIM函式 SELECT LTRIM('*HELLO=','*') FROM DUAL; SELECT RTRIM('=HELLO=','=') FROM DUAL; SELE

oracle-常用函式

--substr(擷取字串,含頭不含尾) concat(拼接字串) length(獲取字串長度)        select id,substr(id , 0, 1), concat(id, name) name, id || name, length(name), sala

python pip常用命令根據關鍵詞查詢第三方庫

基本的命令解釋,如下圖: 安裝 sudo easy_install pip 列出已安裝的包 pip freeze or pip list 匯出requirements.txt pip freeze > <目錄>/requirements.txt

Oracle 常用函式/語法總結

1. case when then case end構成語法開始和結束 when 條件滿足執行 then 否則執行 else case when ba.org is not null and ba.org = 'GD' then 'GD' else

Oracle常用函式——TO_DATE

TO_DATE 含義:將具有固定格式的字串型別的資料轉化為相對應的Date型別資料,官網解釋如下圖   使用方法 TO_DATE("需要轉換的字串","日期格式") 引數詳解:日期格式 組成元素

oracle常用函式(二)---日期函式

<div>作者:<a target=_blank href="http://www.cnblogs.com/kerrycode/" target="_blank">瀟湘隱者</a></div><div>出處:<

oracle常用函式(四)----轉換函式

<div>作者:<a target=_blank href="http://www.cnblogs.com/kerrycode/" target="_blank">瀟湘隱者</a></div><div>出處:<

C語言版字串查詢函式字串中查詢子串

作業系統: Windows10 64位 執行環境: Visual Studio 10 依賴的標頭檔案: #include <string.h> #include <stdlib.h

oracle常用函式(七)-----ORACLE一些不常用的指令碼

本篇介紹一下一些不太常用的指令碼,它們往往有“奇能異效”,但是由於不太常用、不常見、或效率方面的原因,往往被大多數人給遺忘在某些角落裡。呵呵,不知道你看見下面這些指令碼,是否覺得眼熟呢? 1: 如果我需要從SCOTT模式下EMP表中查詢職位為CLERK(祕書)、SALES

GreenPlum 開源大規模並行查詢平臺

本博文主要介紹 GreenPlum 特點,核心元件以及底層架構 簡介 世界上第一個開源,大規模並行資料平臺。 GreenPlum 資料庫是一個高階的,功能齊全的開源資料平臺。它提供了PB級資料量上強

oracle時間函式new_day()

閒話不說,直接進入主題。 一,首先我的實驗都是在虛表中進行的。當然,也有人叫做偽表,就是dual。 dual簡單說下。dual說他是虛表,其實其中沒有存什麼資料;再則,我們查詢的格式都是select * from table,所以查詢一些特殊的東西

Oracle INSTR函式(子字串查詢)語法詳解及應用例項

 據說以下這道看似簡單的問題可以測試Oracle查詢的能力: 問題: 答案: select c.ci_id,wm_concat(s.stu_name) from pm_ci c,pm_stu s where instr(c.stu_ids,s.stu_

SQLServer和Oracle常用函式對比@http://www.enet.com.cn/article/2004/1207/A20041207369373.shtml

SQLServer和Oracle是大家經常用到的資料庫,在此感謝作者總結出這些常用函式以供大家參考。  數學函式    1.絕對值    S:select abs(-1) value    O:select abs(-1) value from dual    2.取整(大

oracle last_day()函式返回當月最後一天即 last_day(date)

格式:LAST_DAY(DATE) 即 LAST_DAY(日期) LAST_DAY函式返回指定日期對應月份的最後一天。例:last_day(to_date('1999.11.29','yyyy.mm.dd')) 返回 1999年11月31日例:last

一些常用函式as:strnstrmemchr。。。。。

1‘ strnstr   //   從 s 串 中 找到 子串 find  並且 返回 find 在s 中的 位置   slen表示find 的長度!。。 1 #include<stdio.h> 2 #include<string.h>