由于開(kāi)發(fā)經(jīng)驗(yàn)較少,數(shù)據(jù)量較大(千萬(wàn)級(jí),日有40萬(wàn)條數(shù)據(jù)左右),導(dǎo)致這個(gè)分頁(yè)jsp頁(yè)面做的效率非常低,通過(guò)一系列的優(yōu)化后,效果明顯得到了提高,記錄一下筆記:
1、分頁(yè)獲取的list對(duì)象集合由于沒(méi)有預(yù)料到數(shù)據(jù)量的大小,是直接一次性讀取然后展示到前臺(tái)的,導(dǎo)致查詢(xún)展示效率非常低:
更改SQL語(yǔ)句,改為按照當(dāng)前需要展示的數(shù)據(jù)行數(shù),通過(guò)SQL的ROWNUM來(lái)進(jìn)行控制查詢(xún)的數(shù)據(jù)量大小,(插入數(shù)據(jù)時(shí),打開(kāi)一個(gè)數(shù)據(jù)庫(kù)連接即一次性插入100條數(shù)據(jù)(可以配置的模式)):
SELECT BRAS_ADDRESS, APPLYTIMES, ALLFAILTIMES,SUCCESSRATE, RN
FROM
(SELECT BRAS_ADDRESS, APPLYTIMES, ALLFAILTIMES,SUCCESSRATE, ROWNUM AS RN
FROM
(SELECT BRAS_ADDRESS, APPLYTIMES, ALLFAILTIMES,1-ALLFAILTIMES/DECODE(APPLYTIMES,0,1,APPLYTIMES) AS SUCCESSRATE
FROM
(SELECT BRAS_ADDRESS,
SUM(DECODE(AUTNCOUNTTYPE,'REQ_CHALLENGE',APPLYTIMES,0)) AS APPLYTIMES,
SUM(DECODE(AUTNCOUNTTYPE,'ACK_CHALLENGE',APPLYTIMES,'ACK_AUTH',APPLYTIMES,'REQ_LOGOUT',APPLYTIMES,0)) AS ALLFAILTIMES
FROM T_BRAS_XXXX
WHERE READTIME between TO_DATE('2012-06-01 00:00:00','yyyy-MM-dd HH24:mi:ss')
and TO_DATE('2012-06-12 23:59:59','yyyy-MM-dd HH24:mi:ss')
GROUP BY BRAS_ADDRESS
)
ORDER BY SUCCESSRATE
)
WHERE ROWNUM <= 180
)
WHERE RN > 165 2、建立索引,建立索引的字段不能使用函數(shù)避免索引失效;
3、建立分區(qū)表,將間隔5天的數(shù)據(jù)放在一個(gè)表中:


----------------------刪除原表,新建分區(qū)表
--刪除表
drop table T_BRAS_XXXX;
commit;

--創(chuàng)建分區(qū)表:利用Oracle11g INTERVAL進(jìn)行分區(qū)的方法
create table T_BRAS_XXXX
(
BRAS_XXXX_ID integer NOT NULL PRIMARY KEY,
BRAS_XXXX VARCHAR2(64),
AUTNCOUNTTYPE VARCHAR2(50),
SUCCESSTIMES NUMBER,
APPLYTIMES NUMBER,
INTERVALTIME NUMBER,
UPDATETIME DATE DEFAULT SYSDATE,
READTIME DATE
)
PARTITION BY RANGE (READTIME)
INTERVAL (NUMTODSINTERVAL(5,'day'))
(
PARTITION T_BRAS_XXXX_PART01 VALUES LESS THAN (TO_DATE('2012-07-01 00:00:00','yyyy-MM-dd HH24:mi:ss'))
)
--保留原來(lái)創(chuàng)建的BRAS_XXXX_ID自增序列
--創(chuàng)建索引
create index idx_t_bras_XXXX on t_bras_XXXX(readtime,bras_address);
commit;

--查看分區(qū)是否成功:
select table_name,partition_name from user_tab_partitions where table_name='T_BRAS_XXXX';
CREATE OR REPLACE PROCEDURE "LARGEDATA_INSERT" (ip_table_name in varchar2, --目標(biāo)表
ip_table_column in varchar2, --目標(biāo)字段
ip_table_select in varchar2, --SELECT 查詢(xún)語(yǔ)句
return_result out number --返回的結(jié)果1,表示成功,0表示失敗
) as
--適合大數(shù)據(jù)量的插入模板 create Templates by chenzhoumin 20110614
runTime number;--運(yùn)行總次數(shù)
i number;--當(dāng)前行數(shù)
amount number;--總行數(shù)
s_sql varchar2(10000);--SQL語(yǔ)句
e_sql varchar2(10000);--執(zhí)行SQL語(yǔ)句
countNumber number;--一次插入的數(shù)據(jù)量
begin
--set serveroutput on size 20000000000000
countNumber := 10000;
return_result := 0; --開(kāi)始初始化為0
--核必邏輯內(nèi)容,可根據(jù)具體的業(yè)務(wù)邏輯來(lái)定義,統(tǒng)計(jì)數(shù)據(jù)總行數(shù)
s_sql := 'select count(1) from (' || ip_table_select || ')';
execute immediate s_sql
into amount;
--每100萬(wàn)提交一次
runTime := amount mod countNumber;
if (runTime > 0) then
runTime := 1 + trunc(amount / countNumber);
end if;
if (runTime = 0) then
runTime := 0 + trunc(amount / countNumber);
end if;
FOR i IN 1 .. runTime LOOP
e_sql := 'insert into '||ip_table_name ||'
('||ip_table_column ||')
select '|| ip_table_column ||'
from
(select selectSec.*, rownum rownumType
from ('|| ip_table_select ||') selectSec
WHERE ROWNUM <= '|| i * countNumber ||')
WHERE rownumType > '||(i - 1) * countNumber;
dbms_output.enable(99999999999999);
dbms_output.put_line(e_sql);
execute immediate e_sql;
--提交
commit;
END LOOP;
return_result := 1;
return;
exception
when others then
return_result := 0;
raise;
dbms_output.enable(99999999999999);
dbms_output.put_line('結(jié)束');
return;
end;
以上測(cè)試通過(guò)。
ORACLE數(shù)據(jù)庫(kù)空間不足,會(huì)發(fā)生登錄出錯(cuò),數(shù)據(jù)無(wú)法插入等錯(cuò)誤發(fā)生,可以根據(jù)實(shí)際錯(cuò)誤代碼查詢(xún)?cè)颍贿^(guò)更多是平時(shí)多看看數(shù)據(jù)庫(kù)空間是否足夠;
解決辦法有兩個(gè):
1、使用linux命令或者工具增加空間或者增加硬盤(pán),沒(méi)有實(shí)際操作過(guò);
2、給oracel數(shù)據(jù)庫(kù)增加系統(tǒng)表空間和臨時(shí)表空間,記錄下操作方法:
如果臨時(shí)表空間或者SYSTEM表空間不足,可以進(jìn)行新增數(shù)據(jù)文件到其它盤(pán)符(增加opt盤(pán)符目錄):
select ts#, name from v$datafile;--查看當(dāng)前的表空間狀況
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';--查看默認(rèn)的臨時(shí)文件
create temporary tablespace temp2 tempfile '/opt/oracle/oracle_tmp/temp02.dbf' size 5000M autoextend on next 100M; --新增臨時(shí)文件
alter database default temporary tablespace "TEMP2"; --修改默認(rèn)臨時(shí)文件設(shè)置
alter database tempfile '/home/oracle/oracle/oradata/portal/temp01.dbf' autoextend off; --關(guān)閉原來(lái)的臨時(shí)文件自增長(zhǎng)
增加系統(tǒng)表空間:
alter tablespace SYSTEM add datafile '/opt/oracle/oracle_tmp/system02.dbf' size 500M autoextend on next 5M;
如果startup數(shù)據(jù)庫(kù)時(shí),提示:prifile文件找不到,可以從一個(gè)$ORACLE_BASE/admin/portal/pfile目錄下拷貝內(nèi)容過(guò)去就可以(注意文件命名和原來(lái)使用的保持一樣,只是內(nèi)容不同):
當(dāng)前正在使用的pfile:startup force pfile='/home/oracle/oracle/product/11.0.1/db_1/dbs/initportal.ora';
拷貝:cp $ORACLE_BASE/admin/portal/pfile/init.ora.452011185827 /home/oracle/oracle/product/11.0.1/db_1/dbs/spfileportal.ora
oracle 臨時(shí)表空間的增刪改查
1、查看臨時(shí)表空間 (dba_temp_files視圖)(v_$tempfile視圖)
select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_files;
select status,enabled, name, bytes/1024/1024 file_size from v_$tempfile;--sys用戶(hù)查看
2、縮小臨時(shí)表空間大小
alter database tempfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TELEMT\TEMP01.DBF' resize 100M;
3、擴(kuò)展臨時(shí)表空間:
方法一、增大臨時(shí)文件大小:
SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize 100m;
方法二、將臨時(shí)數(shù)據(jù)文件設(shè)為自動(dòng)擴(kuò)展:
SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend on next 5m maxsize unlimited;
方法三、向臨時(shí)表空間中添加數(shù)據(jù)文件:
SQL> alter tablespace temp add tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ size 100m;
4、創(chuàng)建臨時(shí)表空間:
SQL> create temporary tablespace temp1 tempfile ‘/u01/app/oracle/oradata/orcl/temp11.dbf’ size 10M;
5、更改系統(tǒng)的默認(rèn)臨時(shí)表空間:
--查詢(xún)默認(rèn)臨時(shí)表空間
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
--修改默認(rèn)臨時(shí)表空間
alter database default temporary tablespace temp1;
所有用戶(hù)的默認(rèn)臨時(shí)表空間都將切換為新的臨時(shí)表空間:
select username,temporary_tablespace,default_ from dba_users;
--更改某一用戶(hù)的臨時(shí)表空間:
alter user scott temporary tablespace temp;
6、刪除臨時(shí)表空間
刪除臨時(shí)表空間的一個(gè)數(shù)據(jù)文件:
SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ drop;
刪除臨時(shí)表空間(徹底刪除):
SQL> drop tablespace temp1 including contents and datafiles cascade constraints;
7、查看臨時(shí)表空間的使用情況(GV_$TEMP_SPACE_HEADER視圖必須在sys用戶(hù)下才能查詢(xún))
GV_$TEMP_SPACE_HEADER視圖記錄了臨時(shí)表空間的使用大小與未使用的大小
dba_temp_files視圖的bytes字段記錄的是臨時(shí)表空間的總大小
SELECT temp_used.tablespace_name,
total - used as "Free",
total as "Total",
round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
FROM GV_$TEMP_SPACE_HEADER
GROUP BY tablespace_name) temp_used,
(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
FROM dba_temp_files
GROUP BY tablespace_name) temp_total
WHERE temp_used.tablespace_name = temp_total.tablespace_name
8、查找消耗資源比較的sql語(yǔ)句
Select se.username,
se.sid,
su.extents,
su.blocks * to_number(rtrim(p.value)) as Space,
tablespace,
segtype,
sql_text
from v$sort_usage su, v$parameter p, v$session se, v$sql s
where p.name = 'db_block_size'
and su.session_addr = se.saddr
and s.hash_value = su.sqlhash
and s.address = su.sqladdr
order by se.username, se.sid
9、查看當(dāng)前臨時(shí)表空間使用大小與正在占用臨時(shí)表空間的sql語(yǔ)句
select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
from v$sort_usage sort, v$session sess, v$sql sql
where sort.SESSION_ADDR = sess.SADDR
and sql.ADDRESS = sess.SQL_ADDRESS
order by blocks desc;
10、臨時(shí)表空間組介紹
1)創(chuàng)建臨時(shí)表空間組:
create temporary tablespace tempts1 tempfile '/home/oracle/temp1_02.dbf' size 2M tablespace group group1;
create temporary tablespace tempts2 tempfile '/home/oracle/temp2_02.dbf' size 2M tablespace group group2;
2)查詢(xún)臨時(shí)表空間組:dba_tablespace_groups視圖
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
GROUP1 TEMPTS1
GROUP2 TEMPTS2
3)將表空間從一個(gè)臨時(shí)表空間組移動(dòng)到另外一個(gè)臨時(shí)表空間組:
alter tablespace tempts1 tablespace group GROUP2 ;
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
GROUP2 TEMPTS1
GROUP2 TEMPTS2
4)把臨時(shí)表空間組指定給用戶(hù)
alter user scott temporary tablespace GROUP2;
5)在數(shù)據(jù)庫(kù)級(jí)設(shè)置臨時(shí)表空間
alter database <db_name> default temporary tablespace GROUP2;
6)刪除臨時(shí)表空間組 (刪除組成臨時(shí)表空間組的所有臨時(shí)表空間)
drop tablespace tempts1 including contents and datafiles;
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
GROUP2 TEMPTS2
drop tablespace tempts2 including contents and datafiles;
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
11、對(duì)臨時(shí)表空間進(jìn)行shrink(11g新增的功能)
--將temp表空間收縮為20M
alter tablespace temp shrink space keep 20M;
--自動(dòng)將表空間的臨時(shí)文件縮小到最小可能的大小
ALTER TABLESPACE temp SHRINK TEMPFILE ’/u02/oracle/data/lmtemp02.dbf’;
臨時(shí)表空間作用
Oracle臨時(shí)表空間主要用來(lái)做查詢(xún)和存放一些緩沖區(qū)數(shù)據(jù)。臨時(shí)表空間消耗的主要原因是需要對(duì)查詢(xún)的中間結(jié)果進(jìn)行排序。
重啟數(shù)據(jù)庫(kù)可以釋放臨時(shí)表空間,如果不能重啟實(shí)例,而一直保持問(wèn)題sql語(yǔ)句的執(zhí)行,temp表空間會(huì)一直增長(zhǎng)。直到耗盡硬盤(pán)空間。
網(wǎng)上有人猜測(cè)在磁盤(pán)空間的分配上,oracle使用的是貪心算法,如果上次磁盤(pán)空間消耗達(dá)到1GB,那么臨時(shí)表空間就是1GB。
也就是說(shuō)當(dāng)前臨時(shí)表空間文件的大小是歷史上使用臨時(shí)表空間最大的大小。
臨時(shí)表空間的主要作用:
索引create或rebuild;
Order by 或 group by;
Distinct 操作;
Union 或 intersect 或 minus;
Sort-merge joins;
analyze.
JQuery中的select事件是change事件,在js中使用的是onchange事件:
<script src="jquery.min.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">

$(document).ready(function()
{

$('#mySelect').change(function()
{
alert($(this).children('option:selected').val());
var p1=$(this).children('option:selected').val();//這就是selected的值
var p2=$('#param2').val();//獲取本頁(yè)面其他標(biāo)簽的值
window.location.href="xx.php?param1="+p1+"¶m2="+p2+"";//頁(yè)面跳轉(zhuǎn)并傳參
})
})
</script>

<select id="mySelect">
<option value="1">one</option>
<option value="2" selected="selected">two</option>
<option value="3">three</option>
</select>

又如:
$(document).ready
(
function()
{
$("#showLoadingDiv").click(function(){$("#dataLoad").show();}); //為指定按鈕添加數(shù)據(jù)加載動(dòng)態(tài)顯示:即將DIV顯示出來(lái)
$("#orderByFail").click(function(){$("#dataLoad").show();});
$("#orderByRate").click(function(){$("#dataLoad").show();});
$("#stats").change(function(){$("#dataLoad").show();}); //change
$("#indexPage").click(function(){$("#dataLoad").show();});
}
);
<select name="dictFilter.dictStatus" id="stats" onchange="javascript:location.href=this.value">
<option selected="selected" value="<%=basePath%>acauthinfo/authDefault.jsp?pageNum=1&StartTime=<%=pager.getStartTime()%>&field=<%=pager.getField()%>&sortOrder=<%=pager.getSortOrder()%>&EndTime=<%=pager.getEndTime()%>&pageSize=10" >每頁(yè)10行</option>
<option selected="selected" value="<%=basePath%>acauthinfo/authDefault.jsp?pageNum=1&StartTime=<%=pager.getStartTime()%>&field=<%=pager.getField()%>&sortOrder=<%=pager.getSortOrder()%>&EndTime=<%=pager.getEndTime()%>&pageSize=20">每頁(yè)20行</option>
<option selected="selected" value="<%=basePath%>acauthinfo/authDefault.jsp?pageNum=1&StartTime=<%=pager.getStartTime()%>&field=<%=pager.getField()%>&sortOrder=<%=pager.getSortOrder()%>&EndTime=<%=pager.getEndTime()%>&pageSize=30">每頁(yè)30行</option>
<option selected="selected" value="">---請(qǐng)選擇---</option>
</select>
1、<!--
通用提交按鈕-->
<input type="submit" value="提交">
2、<!--
自定義提交按鈕-->
<button type="Submit">提交</button>
3、<!--
圖像按鈕-->
<input type="image" src = "btn.png">
說(shuō)明:用戶(hù)提交按鈕或圖像按鈕時(shí),就會(huì)提交表單。使用<input>或<button>都可以定義提交按鈕,只要將其特性的值設(shè)置為“submit”即可,而圖像按鈕則是通過(guò)<input>的type特性值設(shè)置為”image”來(lái)定義的。因此,只要我們單擊一下代碼生成的按鈕,就可以提交表單。
4、
阻止表單提交
只要在表單中存在上面列出的任何一種按鈕,那么相應(yīng)表單控件擁有焦點(diǎn)的情況下,按回車(chē)鍵就可以提交表單。如果表單里沒(méi)有提交按鈕,按回車(chē)鍵不會(huì)提交表單。
以這種方式提交表單時(shí),瀏覽器會(huì)在將請(qǐng)求發(fā)送給服務(wù)器之前觸發(fā)submit事件。這樣,我們就有機(jī)會(huì)驗(yàn)證表單數(shù)據(jù),并據(jù)以決定是否允許表單提交。阻止這個(gè)事件的默認(rèn)行為就可以取消表單提交。例如,下面代碼會(huì)阻止表單提交:
var EventUtil = {
addHandler: function (element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
},
getEvent: function (event) {
return event ? event : window.event;
},
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
}
};
var form = document.getElementById("myForm");
EventUtil.addHandler(form, "submit", function () {
//取得事件對(duì)象
event = EventUtil.getEvent(event);
//阻止默認(rèn)事件
EventUtil.preventDefault(event);
});
調(diào)用preventDefault()方法阻止了表單提交。一般來(lái)說(shuō),在表單數(shù)據(jù)無(wú)效而不能發(fā)送給服務(wù)器時(shí),可以使用這一技術(shù)。
5、在JavaScript中,以編程方式調(diào)用submit()方法也可以提交表單。
這種方式無(wú)需表單包含提交按鈕,任何時(shí)候都可以正常提交表單。來(lái)看一個(gè)例子:
var form = document.getElementById("myForm");
//提交表單
form.submit();
在以調(diào)用submit()方法的形式提交表單時(shí),不會(huì)觸發(fā)submit事件,因此要記得在調(diào)用此方法之前先驗(yàn)證表單數(shù)字據(jù)。
提交表單時(shí)可能出現(xiàn)的最大問(wèn)題,就是重復(fù)提交表單。在第一次提交表單后,如果長(zhǎng)時(shí)間沒(méi)有反映,用戶(hù)可能會(huì)變得不耐煩。這時(shí)候,他們也許會(huì)反復(fù)單擊提交按鈕。結(jié)果往往很麻煩(因?yàn)榉?wù)器要處理重復(fù)請(qǐng)求),或者造成錯(cuò)誤(如果是下了訂單,那么可能會(huì)多定好幾份)。
解決這一問(wèn)題的辦法有兩個(gè):
在第一次提交表單后就禁用提交按鈕;
利用onsubmit事件處理程序取消后續(xù)的表單提交操作。