DB2編程序技巧 (六)
更新時(shí)間:2007年03月06日 00:00:00 作者:
正在看的db2教程是:DB2編程序技巧 (六)。2.2 SQL語句盡量寫復(fù)雜SQL
盡量使用大的復(fù)雜的SQL語句,將多而簡(jiǎn)單的語句組合成大的SQL語句對(duì)性能會(huì)有所改善。
DB2的SQL Engieer對(duì)復(fù)雜語句的優(yōu)化能力比較強(qiáng),基本上不用當(dāng)心語句的性能問題。
Oracle 則相反,推薦將復(fù)雜的語句簡(jiǎn)單化,SQL Engieer的優(yōu)化能力不是特別好。
這是因?yàn)槊恳粋€(gè)SQL語句都會(huì)有reset SQLCODE和SQLSTATE等各種操作,會(huì)對(duì)數(shù)據(jù)庫(kù)性能有所消耗。
一個(gè)總的思想就是盡量減少SQL語句的個(gè)數(shù)。
2.3 SQL SP及C SP的選擇
首先,C的sp的性能比sql 的sp 的要高。
一般而言,SQL語句比較復(fù)雜,而邏輯比較簡(jiǎn)單,sql sp 與 c sp 的性能差異會(huì)比較小,這樣從工作量考慮,用SQL寫比較好。
而如果邏輯比較復(fù)雜,SQL比較簡(jiǎn)單,用c寫比較好。
2.4 查詢的優(yōu)化(HASH及RR_TO_RS)
db2set DB2_HASH_JOIN=Y (HASH排序優(yōu)化)
指定排序時(shí)使用HASH排序,這樣db2在表join時(shí),先對(duì)各表做hash排序,再join,這樣可以大大提高性能。
劇沈剛說做實(shí)驗(yàn),7個(gè)一千萬條記錄表的做join取10000條記錄,再?zèng)]有索引的情況下 72秒。
db2set DB2_RR_TO_RS=Y
該設(shè)置后,不能定義RR隔離級(jí)別,如果定義RR,db2也會(huì)自動(dòng)降為RS.
這樣,db2不用管理Next key,可以少管理一些東西,這樣可以提高性能。
2.5 避免使用count(*) 及exists的方法
1、首先要避免使用count(*)操作,因?yàn)閏ount(*)基本上要對(duì)表做全部掃描一遍,如果使用很多會(huì)導(dǎo)致很慢。
2、exists比count(*)要快,但總的來說也會(huì)對(duì)表做掃描,它只是碰到第一條符合的記錄就停下來。
如果做這兩中操作的目的是為
select into 服務(wù)的話,就可以省略掉這兩步。
直接使用select into 選擇記錄中的字段。
如果是沒有記錄選擇到的話,db2 會(huì)將 sqlcode=100 和 sqlstate='20000'
如果是有多條記錄的話,db2會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
程序可以創(chuàng)建 continue handler for exception
continue handler for not found
來檢測(cè)。
這是最快速的方法。
3、如果是判斷是不是一條,可以使用游標(biāo)來計(jì)算,用一個(gè)計(jì)數(shù)器,累加,達(dá)到預(yù)定值后就離開。這個(gè)速度也比count(*) 要快,因?yàn)樗灰獟呙璧筋A(yù)定值就不再掃描了,不用做全表的scan,不過它寫起來比較麻煩。
3 DB2表及sp管理
3.1 看存儲(chǔ)過程文本
select text from syscat.procedures where procname='PROC1';
3.2 看表結(jié)構(gòu)
describe table syscat.procedures
describe select * from syscat.procedures
3.3 查看各表對(duì)sp的影響(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname='TB_BRANCH'))
<
盡量使用大的復(fù)雜的SQL語句,將多而簡(jiǎn)單的語句組合成大的SQL語句對(duì)性能會(huì)有所改善。
DB2的SQL Engieer對(duì)復(fù)雜語句的優(yōu)化能力比較強(qiáng),基本上不用當(dāng)心語句的性能問題。
Oracle 則相反,推薦將復(fù)雜的語句簡(jiǎn)單化,SQL Engieer的優(yōu)化能力不是特別好。
這是因?yàn)槊恳粋€(gè)SQL語句都會(huì)有reset SQLCODE和SQLSTATE等各種操作,會(huì)對(duì)數(shù)據(jù)庫(kù)性能有所消耗。
一個(gè)總的思想就是盡量減少SQL語句的個(gè)數(shù)。
2.3 SQL SP及C SP的選擇
首先,C的sp的性能比sql 的sp 的要高。
一般而言,SQL語句比較復(fù)雜,而邏輯比較簡(jiǎn)單,sql sp 與 c sp 的性能差異會(huì)比較小,這樣從工作量考慮,用SQL寫比較好。
而如果邏輯比較復(fù)雜,SQL比較簡(jiǎn)單,用c寫比較好。
2.4 查詢的優(yōu)化(HASH及RR_TO_RS)
db2set DB2_HASH_JOIN=Y (HASH排序優(yōu)化)
指定排序時(shí)使用HASH排序,這樣db2在表join時(shí),先對(duì)各表做hash排序,再join,這樣可以大大提高性能。
劇沈剛說做實(shí)驗(yàn),7個(gè)一千萬條記錄表的做join取10000條記錄,再?zèng)]有索引的情況下 72秒。
db2set DB2_RR_TO_RS=Y
該設(shè)置后,不能定義RR隔離級(jí)別,如果定義RR,db2也會(huì)自動(dòng)降為RS.
這樣,db2不用管理Next key,可以少管理一些東西,這樣可以提高性能。
2.5 避免使用count(*) 及exists的方法
1、首先要避免使用count(*)操作,因?yàn)閏ount(*)基本上要對(duì)表做全部掃描一遍,如果使用很多會(huì)導(dǎo)致很慢。
2、exists比count(*)要快,但總的來說也會(huì)對(duì)表做掃描,它只是碰到第一條符合的記錄就停下來。
如果做這兩中操作的目的是為
select into 服務(wù)的話,就可以省略掉這兩步。
直接使用select into 選擇記錄中的字段。
如果是沒有記錄選擇到的話,db2 會(huì)將 sqlcode=100 和 sqlstate='20000'
如果是有多條記錄的話,db2會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
程序可以創(chuàng)建 continue handler for exception
continue handler for not found
來檢測(cè)。
這是最快速的方法。
3、如果是判斷是不是一條,可以使用游標(biāo)來計(jì)算,用一個(gè)計(jì)數(shù)器,累加,達(dá)到預(yù)定值后就離開。這個(gè)速度也比count(*) 要快,因?yàn)樗灰獟呙璧筋A(yù)定值就不再掃描了,不用做全表的scan,不過它寫起來比較麻煩。
3 DB2表及sp管理
3.1 看存儲(chǔ)過程文本
select text from syscat.procedures where procname='PROC1';
3.2 看表結(jié)構(gòu)
describe table syscat.procedures
describe select * from syscat.procedures
3.3 查看各表對(duì)sp的影響(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname='TB_BRANCH'))
<
相關(guān)文章
DB2獲取當(dāng)前用戶表、字段、索引等詳細(xì)信息
這篇文章主要介紹了DB2獲取當(dāng)前用戶表、字段、索引等詳細(xì)信息的sql,需要的朋友可以參考下2014-07-07使用SQL Server連接服務(wù)器訪問DB2 Server
這篇文章主要介紹了使用SQL Server連接服務(wù)器訪問DB2 Server,需要的朋友可以參考下2016-12-12DB2 UDB V8.1管理學(xué)習(xí)筆記(三)
DB2 UDB V8.1管理學(xué)習(xí)筆記(三)...2007-03-03常見數(shù)據(jù)庫(kù)系統(tǒng)比較 DB2數(shù)據(jù)庫(kù)
常見數(shù)據(jù)庫(kù)系統(tǒng)比較 DB2數(shù)據(jù)庫(kù)...2007-03-03