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