標籤:
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 資料庫編程中的效能最佳化