JAVA 資料庫編程中的效能最佳化

來源:互聯網
上載者:User

標籤:

 1、 禁止自動認可:
在預設情況下,程式執行的任何sql 語句都是自動認可的
向一個表中插入2000條記錄,
自動認可所用的時間  11666毫秒
禁止自動認可(顯示提交) 3450毫秒

2、 批處理:
多用批處理,減少操作資料庫次數。
(1)、禁止自動認可
setAutoCommit(false);
(2)、準備一個語句對象
PreparedStatement myPrepStatement = myConnection.prepareStatement(“insert into test_tab(value) values(?)”;
(3)、將語句添加進批中
addBatch();
(4)、執行這批語句
executeBatch();
(5)、提交執行的語句
myConnection.commit();

Oracle新的改進後的批處理:(JDBC2.0以上支援)
   只能對OraclePreparedStatement對象進行處理,其中的sql語句在5-30個是最佳化的)
   改進的地方是,可以預設批大小,SQL 語句就會自動添加進批中。
(1)、禁止提交
(2)、設定批值
myoracleConnection.setDefaultExecuteBatch(10);
(3)、對SQL語句進行批處理
for (int count = 0;count<20;count++){
myOraclePrepStatement.setInt(1,count);
int rowsInserted = myOraclePrepStatement.executeUpdate();
}
註:還可以強制執行int rowsInserted = myOraclePrepStatement.sendBatch();

3、 行預擷取
預設情況下,結果集擷取的行數是10,對大多數程式都是合適的,但是,如果要擷取的行非常多,那麼可以增加擷取尺寸以便進一步提高程式效能。
通常採用Oracle行預擷取,而不用標用行預擷取

標準行預擷取
Statement myStatement = myConnection.CreateStatement();
myStatement.setFetchSize(20);
從資料庫取2000條記錄
當設為1  1642毫秒
10 161毫秒
20 91毫秒

Oracle行預擷取
OracleStatement myOracleStatement = (OracleSTatement) myConntion.CreateStatement();
myOracleStatement.setRowPrefetch(20);

當設為1  1532毫秒
11 140毫秒
21 80毫秒


4、 定義結果集類型及長度
預先定義結果集列的Java類型,可以節省判斷結果集類型往返。
當查詢發送到資料庫時,會有一次往返判斷結果集應該使用的Java類型。
((OracleStatement) myStatement).defineColumnType(1,java.sql.Types.INTEGER);

5、 語句緩衝
使用緩衝的語句,通常可以將準備語句的時間減少一半,同時還要以避免使用結果集時建立新的遊標。
兩種類型: 
隱式語句緩衝 
前後兩次使用的語句字串完全一樣。
  顯示語緩衝
((OracleStatement)myPrepStatement).closeWithKey(“myCachedStatement”);
6、 資料類型定義
定義成與SQL一樣的資料類型。
7、 變數名定義規則
變數大小寫一至,SQL 語句字串大小寫一至。

>>>等值關聯
select  a.id,a.title,b.columnid
from articleinfo a,articlecolumn b
where a.id=b.articlei;

>>>外關聯
select  a.id,a.title,b.columnid
from articleinfo a,articlecolumn b
where a.id=b.articlei(+) and b.articleid not null;

>>>內關聯
select  a.id,a.title,b.columnid
from articleinfo a,articlecolumn b
where b.articlei(+)=a.id and b.articleid not null;

>>>等值關聯
select a.id,a.title 
from articleinfo a,articlecolumn b
where a.id=b.articleid;

>>>IN關聯
Select a.id,a.title from articleinfo a 
Where a.id in(select articleid from articlecolumn b);

>>>等值關聯 (40%)
select a.id,a.title 
from articleinfo a
where exists(select b.articleid  from articlecolumn b
where a.id=b.articleid);

>>>建立函數索引
select a.id,a.title
from articleinfo
where trunc(entertime)>=sysdate-30;

create index fun_trunc_entertime on articleinfo(trunc(entertime))

>>>顯示使用某個索引
select /*+  articleinfo(fun_trunc_entertime) */ id from articleinfo
where trunc(entertime)>=sysdate-30;

>>>Where子句中的條件順序
範圍越小越靠後
select a.id,b.columnid from articleinfo a,articlecolumn b
where a.id=b.articleid(+) and b.articleid is not null and b.columnid>=353454564564576 and b.columnid<234345344565676; 
• Nested Loops (NL) Join 
• Sort-Merge Join 
• Hash Join (not available with the RBO) 
• Cluster Join 

JAVA 資料庫編程中的效能最佳化

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.