select max(substr(sys_connect_by_path(column_name, ','), 2))
from (select column_name, rownum rn
from user_tab_columns
where table_name = 'DEPT')
start with rn = 1
connect by rn = rownum;
select substr(max(sys_connect_by_path(attr_value, ',')), 2)
from (select attr_value, rownum rn
from attribute_value
where attr_id in
(select attr_id from attribute where attr_code = 'lan_id'))
start with rn = 1
connect by rn = rownum;
SQL> select substr(max(sys_connect_by_path(attr_value, ',')), 2)
2 from (select attr_value, rownum rn
3 from attribute_value
4 where attr_id in
5 (select attr_id from attribute where attr_code = 'lan_id'))
6 start with rn = 1
7 connect by rn = rownum;
SUBSTR(MAX(SYS_CONNECT_BY_PATH
--------------------------------------------------------------------------------
470,471,472,473,474,475,476,477,478,479,482,483
(1)把舊的“E:\oracle”改名為“E:\oracle_old”
(2)重裝oralce在“E:\oracle”目錄下.
(3)oradim -new -sid orcl
(4)把新的“E:\oracle”改名為“E:\oracle_new”
(5)把舊的“E:\oracle_old”改為“E:\oracle”
(6)sqlplus "/as sysdba"
startup
(7)用Net Configuration Assistant 重建一下監(jiān)聽.
(8)導入注冊表
[HKEY_LOCAL_MACHINESOFTWAREORACLE]
"ORACLE_SID"="oracle9i"
--下次正常啟動----
正常啟動.bat
net start OracleOraDb10g_home1TNSListener
net start OracleServiceORCL
sqlplus / as sysdba
startup
正常關閉.bat
net stop OracleServiceORCL
net stop OracleOraDb10g_home1TNSListener
re: 畫Web流程圖的一點心得 xzc 2011-05-31 12:10
re: rowid 刪除重復記錄!!! xzc 2011-05-31 10:05
--通過acc_nbr分組,取最新時間的記錄。
select count(*)
from infocs.subs a, infocs.prod b
where (a.acc_nbr, a.update_date) in (select acc_nbr, max(update_date) from infocs.subs group by acc_nbr)
and a.subs_id = b.prod_id
and b.prod_state = 'B';
re: 從ftp定時下載按日期生成的文件 xzc 2011-05-21 12:14
--ftp1.bat
ftp -i -s:"e:\ftp1.txt"
--ftp1.txt
open 127.0.0.1
username
password
bin
ls
get 文件接口說明.txt
bye
--sqlplus1.bat
sqlplus username/password@XE @e:\sqlplus1.txt
--sqlplus1.txt
set heading off feedback off pagesize 0 verify off echo off
select * from dual;
exit
re: Shell處理字符串常用方法 xzc 2011-05-05 18:37
#去掉字符串中空格
gvProvince=`echo ${gvProvince} | sed 's/ //g'`
re: rowid 刪除重復記錄!!! xzc 2011-04-25 15:33
剔除重復記錄
delete from oth_quality_check_result_list
where list_id not in (select min(a.list_id)
from oth_quality_check_result_list a
where a.task_id = @FWFNO@
and a.rule_id = @RULEID@
and a.lan_id = @LANID@
group by a.column_1)
re: Shell處理字符串常用方法 xzc 2011-04-22 15:57
for fname in /inffile/lan/jh_data_20110412.txt
do
badfname=`echo ${fname##*/}|cut -d "." -f1`.bad
echo ${badfname}
done
--結果為:
jh_data_20110412.bad
xzc 10:01:29
#查找/inffile目錄下大于100M的文件
find /inffile -size +200000 |xargs ls -l
取2023830到2023850行之間的記錄
sed -n '2023830,2023850p' jh_data_20110324.txt >xzc.txt
1. 如果你只想看文件的前5行,可以使用head命令,
如: head -5 /etc/passwd
2. 如果你想查看文件的后10行,可以使用tail命令,
如: tail -10 /etc/passwd
3. 你知道怎么查看文件中間一段嗎?你可以使用sed命令
如: sed -n '5,10p' /etc/passwd 這樣你就可以只查看文件的第5行到第10行。
我們經(jīng)常會遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通過“:”分隔各個字段的。可以通過cut命令來實現(xiàn)。例如,我們希望將系統(tǒng)賬號名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用來定義分隔符,默認為tab鍵,-f表示需要取得哪個字段。
當然也可以通過cut取得文件中每行中特定的幾個字符,例如:
cut -c3-5 /etc/passwd
就是輸出/etc/passwd文件中每行的第三到第五個字符。
-c 和 -f 參數(shù)可以跟以下子參數(shù):
N 第N個字符或字段
N- 從第一個字符或字段到文件結束
N-M 從第N個到第M個字符或字段
-M 從第一個到第N個字符或字段
#是否包含@INFILE@字符串的判斷
if echo "$ctl_file"|grep -q "@INFILE@"
then
#分隔符前字符串
echo "${ctl_file%%@INFILE@*}" >${table_name}.ctl
#文件名
echo "${infile}" >>${table_name}.ctl
#分隔符后字符串
echo "${ctl_file##*@INFILE@}" >>${table_name}.ctl
else
echo "${ctl_file}" >${table_name}.ctl
fi
re: shell字符串的截取 xzc 2011-03-04 15:12
#是否包含@INFILE@字符串的判斷
if echo "$ctl_file"|grep -q "@INFILE@"
then
#分隔符前字符串
echo "${ctl_file%%@INFILE@*}" >${table_name}.ctl
#文件名
echo "${infile}" >>${table_name}.ctl
#分隔符后字符串
echo "${ctl_file##*@INFILE@}" >>${table_name}.ctl
else
echo "${ctl_file}" >${table_name}.ctl
fi
select substr(substr('111,2222;33', INSTR('111,2222;33', ',') + 1), 1, (instr(substr('111,2222;33', INSTR('111,2222;33', ',') + 1), ';') - 1))
from dual;
re: Unix常用命令 xzc 2011-02-23 09:24
nmyz2#grep 047903520593 exp20110124.txt
047903520593 0479 0 ADSL 22000066 H00H
re: rowid 刪除重復記錄!!! xzc 2011-01-20 17:27
--從導入的網(wǎng)元中取最新的記錄[去除重復].sql
--方法1
select *
from infuser.inf_cc_ne a
where cc_ne_id = (select max(cc_ne_id) from infuser.inf_cc_ne b where b.serv_id = a.serv_id);
--方法2
select * from infuser.inf_cc_ne a where cc_ne_id in (select max(cc_ne_id) from infuser.inf_cc_ne b group by b.serv_id);
--方法3(不一定準)
select *
from infuser.inf_cc_ne a
where rowid = (select max(rowid) from infuser.inf_cc_ne b where b.serv_id = a.serv_id);
--方法4(不一定準,這個可能是效果最好的)
select * from infuser.inf_cc_ne a where rowid in (select max(rowid) from infuser.inf_cc_ne b group by b.serv_id);
從627330行開始查看文件
more +627330 jh_data_20110118.txt
nmyz2$[/oracle]sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 4 09:39:52 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> alter system checkpoint;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> SQL> SQL> startup;
ORACLE instance started.
Total System Global Area 1.9327E+10 bytes
Fixed Size 2103520 bytes
Variable Size 2298480416 bytes
Database Buffers 1.7012E+10 bytes
Redo Buffers 14671872 bytes
Database mounted.
Database opened.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
you have mail in /var/mail/oracle
nmyz2$[/oracle]
--在服務器上執(zhí)行
sqlplus "/as sysdba"
SQL>alter system checkpoint;
SQL>shutdown immediate
SQL>startup;
re: shell 去掉每行結尾空格 xzc 2010-12-28 11:56
sed -e 's/[ ]*$//g' crm_201012.bad >crm_201012.txt
補充點tkprof的使用方法
Tkprof工具可用來格式化sql trace產(chǎn)生的文件,讓你更容易看懂trace的內(nèi)容
用法:
tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ] ...
參數(shù)說明:
tracefile:你要分析的trace文件
outputfile:格式化后的文件
explain=user/password@connectstring
table=schema.tablename
注1:這兩個參數(shù)是一起使用的,通過連接數(shù)據(jù)庫對在trace文件中出現(xiàn)的每條sql語句查看執(zhí)行計劃,并將之輸出到outputfile中
注2:該table必須是數(shù)據(jù)庫中不存在的,如果存在會報錯
print=n:只列出最初N個sql執(zhí)行語句
insert=filename:會產(chǎn)生一個sql文件,運行此文件可將收集到的數(shù)據(jù)insert到數(shù)據(jù)庫表中
sys=no:過濾掉由sys執(zhí)行的語句
record=filename:可將非嵌套執(zhí)行的sql語句過濾到指定的文件中去
waits=yes|no:是否統(tǒng)計任何等待事件
aggregate=yes|no:是否將相同sql語句的執(zhí)行信息合計起來,默認為yes
sort= option:設置排序選項,選項如下:
prscnt:number of times parse was called
prscpu:cpu time parsing
prsela:elapsed time parsing
prsdsk:number of disk reads during parse
prsqry:number of buffers for consistent read during parse
prscu:number of buffers for current read during parse
prsmis:number of misses in library cache during parse
execnt:number of execute was called
execpu:cpu time spent executing
exeela:elapsed time executing
exedsk:number of disk reads during execute
exeqry:number of buffers for consistent read during execute
execu:number of buffers for current read during execute
exerow:number of rows processed during execute
exemis:number of library cache misses during execute
fchcnt:number of times fetch was called
fchcpu:cpu time spent fetching
fchela:elapsed time fetching
fchdsk:number of disk reads during fetch
fchqry:number of buffers for consistent read during fetch
fchcu:number of buffers for current read during fetch
fchrow:number of rows fetched
userid:userid of user that parsed the cursor
可根據(jù)自己的需要設置排序
舉例:
1.列出前2條sql語句的執(zhí)行情況:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt print=2
2.將數(shù)據(jù)保存到數(shù)據(jù)庫:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt insert=c:\insert.sql
執(zhí)行后會在c:\產(chǎn)生insert.sql文件,執(zhí)行該文件即可將數(shù)據(jù)保存到數(shù)據(jù)庫,以下為insert.sql部分內(nèi)容:
REM Edit and/or remove the following CREATE TABLE
REM statement as your needs dictate.
CREATE TABLE tkprof_table
(
date_of_insert DATE
,cursor_num NUMBER
,depth NUMBER
,user_id NUMBER
,parse_cnt NUMBER
,parse_cpu NUMBER
,parse_elap NUMBER
,parse_disk NUMBER
,parse_query NUMBER
,parse_current NUMBER
,parse_miss NUMBER
,exe_count NUMBER
,exe_cpu NUMBER
,exe_elap NUMBER
,exe_disk NUMBER
,exe_query NUMBER
,exe_current NUMBER
,exe_miss NUMBER
,exe_rows NUMBER
,fetch_count NUMBER
,fetch_cpu NUMBER
,fetch_elap NUMBER
,fetch_disk NUMBER
,fetch_query NUMBER
,fetch_current NUMBER
,fetch_rows NUMBER
,ticks NUMBER
,sql_statement LONG
);
INSERT INTO tkprof_table VALUES
(
SYSDATE, 1, 0, 61, 1, 0, 418, 0, 0, 0, 1
, 1, 15625, 1435, 0, 0, 0, 0, 0
, 4, 0, 4417, 0, 24, 0, 36, 13450151
, ’select * from tblinventoryhistory
‘);
3.提取sql執(zhí)行語句:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt record=sqlstr.sql
sqlstr.sql中的內(nèi)容:
alter session set sql_trace=true ;
alter session set events '10046 trace name context forever,level 12';
select * from tblinventoryhistory ;
select * from tblorder ;
select * from tblproduct ;
select * from tbluser ;
select * from tblroute ;
4.產(chǎn)生執(zhí)行計劃:
C:\>tkprof c:\oc_ora_2892.trc c:\ff.txt explain=ocuser/ocuser table=ocuser.test1
在產(chǎn)生的ff.txt文件中會體現(xiàn)其執(zhí)行計劃:
Rows Execution Plan
——- —————————————————
0 SELECT STATEMENT GOAL: CHOOSE
0 TABLE ACCESS (FULL) OF 'TBLROUTE'
如何讀懂tkprof
CALL :每次SQL語句的處理都分成以下三個部分
Parse:這步將SQL語句轉換成執(zhí)行計劃,包括檢查是否有正確的授權和所需要用到的表、列以及其他引用到的對象是否存在。
Execute:這步是真正的由Oracle來執(zhí)行語句。對于insert、update、delete操作,這步會修改數(shù)據(jù),對于select操作,這步就只是確定選擇的記錄。
Fetch:返回查詢語句中所獲得的記錄,這步只有select語句會被執(zhí)行。
COUNT:這個語句被parse、execute、fetch的次數(shù)。
CPU:這個語句對于所有的parse、execute、fetch所消耗的cpu的時間,以秒為單位。
ELAPSED:這個語句所有消耗在parse、execute、fetch的總的時間。
DISK:從磁盤上的數(shù)據(jù)文件中物理讀取的塊的數(shù)量。一般來說更想知道的是正在從緩存中讀取的數(shù)據(jù)而不是從磁盤上讀取的數(shù)據(jù)。
QUERY:在一致性讀模式下,所有parse、execute、fetch所獲得的buffer的數(shù)量。一致性模式的buffer是用于給一個長時間運行的事務提供一個一致性讀的快照,緩存實際上在頭部存儲了狀態(tài)。
CURRENT:在current模式下所獲得的buffer的數(shù)量。一般在current模式下執(zhí)行insert、update、delete操作都會獲取buffer。在current模式下如果在高速緩存區(qū)發(fā)現(xiàn)有新的緩存足夠給當前的事務使用,則這些buffer都會被讀入了緩存區(qū)中。
ROWS: 所有SQL語句返回的記錄數(shù)目,但是不包括子查詢中返回的記錄數(shù)目。對于select語句,返回記錄是在fetch這步,對于insert、update、delete操作,返回記錄則是在execute這步。
A、query+current/rows 平均每行所需的block數(shù),太大的話(超過20)SQL語句效率太低
B、Parse count/Execute count parse count應盡量接近1,如果太高的話,SQL會進行不必要的reparse
C、rows Fetch/Fetch Fetch Array的大小,太小的話就沒有充分利用批量Fetch的功能,增加了數(shù)據(jù)在客戶端和服務器之間的往返次數(shù)。
D、disk/query+current 磁盤IO所占邏輯IO的比例,太大的話有可能是db_buffer_size過小(也跟SQL的具體特性有關)
E、elapsed/cpu 太大表示執(zhí)行過程中花費了大量的時間等待某種資源
F、cpu Or elapsed 太大表示執(zhí)行時間過長,或消耗了了大量的CPU時間,應該考慮優(yōu)化
G、執(zhí)行計劃中的Rows 表示在該處理階段所訪問的行數(shù),要盡量減少
統(tǒng)計字符串中 E 出現(xiàn)的次數(shù):
SELECT LENGTHB(TRANSLATE('ABCDEFGEFGDBE','E'||'ABCDEFGEFGDBE','E')) FROM DUAL;
SELECT LENGTHB('ABCDEFGEFGDBE')-LENGTHB(REPLACE('ABCDEFGEFGDBE','E','')) FROM DUAL;
一、語法:
TRANSLATE(string,from_str,to_str)
二、目的
返回將(所有出現(xiàn)的)from_str中的每個字符替換為to_str中的相應字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一個超集。如果 from_str 比 to_str 長,那么在 from_str 中而不在 to_str 中的額外字符將從 string 中被刪除,因為它們沒有相應的替換字符。to_str 不能為空。Oracle 將空字符串解釋為 NULL,并且如果TRANSLATE 中的任何參數(shù)為NULL,那么結果也是 NULL。
三、允許使用的位置
過程性語句和SQL語句。
re: oracle壓縮表表空間 xzc 2010-08-06 16:12
--刪除分區(qū)
declare
-- 這里是本地變量
i integer;
lc_date varchar2(10);
cursor c_area_code is
select 'ALTER TABLE odsstat.WID_SETT_TICKET_DAY_' || region_id || ' DROP PARTITION P' || lc_date || ';' a1
from area_code
where region_id <= 2500;
begin
-- 這里是測試語句
for i in 1 .. 31 loop
lc_date := to_char(to_date('20100531', 'YYYYMMDD') + i, 'YYYYMMDD');
for c1 in c_area_code loop
dbms_output.put_line(c1.a1);
end loop;
end loop;
end;
--壓縮分區(qū)
declare
-- 這里是本地變量
i integer;
lc_date varchar2(10);
cursor c_area_code is
select 'ALTER TABLE odsstat.WID_SETT_TICKET_DAY_' || region_id || ' MOVE PARTITION P' || lc_date ||
' COMPRESS;' a1
from area_code
where region_id <= 2500;
begin
-- 這里是測試語句
for i in 1 .. 31 loop
lc_date := to_char(to_date('20100630', 'YYYYMMDD') + i, 'YYYYMMDD');
for c1 in c_area_code loop
dbms_output.put_line(c1.a1);
end loop;
end loop;
end;
--增加分區(qū)
declare
-- 這里是本地變量
i integer;
lc_date varchar2(10);
cursor c_area_code is
select 'ALTER TABLE odsstat.WID_SETT_TICKET_DAY_' || region_id || ' ADD PARTITION P' || lc_date || ' VALUES (' ||
lc_date || ') TABLESPACE SETTDATA_01 NOLOGGING;' a1
from area_code
where region_id <= 2500;
begin
-- 這里是測試語句
for i in 1 .. 31 loop
lc_date := to_char(to_date('20100831', 'YYYYMMDD') + i, 'YYYYMMDD');
for c1 in c_area_code loop
dbms_output.put_line(c1.a1);
end loop;
end loop;
end;
--臨時表空間會話分析
select b.tablespace 表空間,
round(b.blocks * 8 / 1024 / 1024, 2) || 'G' "占用臨時空間",
b.segtype 段使用類型, --HASH表示HASH關聯(lián) SORT表示排序 DATA表示數(shù)據(jù)
a.sid,
a.serial#,
a.username 用戶名稱,
a.logon_time 用戶登入時間,
a.last_call_et "持續(xù)時間(秒)",
a.machine 客戶端機器,
a.program 客戶端工具,
a.status 用戶會話狀態(tài),
c.sql_text 簡要SQL,
c.sql_fulltext 完整SQL
from v$session a, v$tempseg_usage b, v$sqlarea c
where a.saddr = b.session_addr
and c.address = a.sql_address
and c.hash_value = a.sql_hash_value
order by b.tablespace, b.blocks;
當你想知道是哪條sql在占用temp表空間的時候,你可以這樣:
SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text
FROM v$session a, v$tempseg_usage b, v$sqlarea c
WHERE a.saddr = b.session_addr
AND c.address= a.sql_address
AND c.hash_value = a.sql_hash_value
ORDER BY b.tablespace, b.blocks;
我們都知道,9iR2/10gR2里除了v$tempseg_usage外,還有v$sort_usage。單從結構上來看,v$tempseg_usage和v$sort_usage沒有任何區(qū)別,也就是說,上述sql其實是可以替換成:
SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text
FROM v$session a, v$sort_usage b, v$sqlarea c
WHERE a.saddr = b.session_addr
AND c.address= a.sql_address
AND c.hash_value = a.sql_hash_value
ORDER BY b.tablespace, b.blocks;
re: oracle壓縮表表空間 xzc 2010-07-19 21:05
壓縮數(shù)據(jù)以節(jié)省空間和提高速度(某位帥多友情奉獻的資料,好東東!)2007-03-30 15:55使用表壓縮來節(jié)省空間并提高查詢性能。
很多決策支持系統(tǒng)通常都涉及到存儲于幾個特大表中的大量數(shù)據(jù)。隨著這些系統(tǒng)的發(fā)展,對磁盤空間的需求也在快速增長。在當今的環(huán)境下,存儲著數(shù)百TB(太字節(jié))的數(shù)據(jù)倉庫已經(jīng)變得越來越普遍。
為了幫助處理磁盤容量問題,在Oracle9i第2版中引入了表壓縮特性,它可以極大地減少數(shù)據(jù)庫表所需要的磁盤空間數(shù)量,并在某些情況下提高查詢性能。
在本文中,我將向你說明表壓縮是如何工作的,以及在構建和管理數(shù)據(jù)庫時如何配置表空間。我還將基于一些示例測試結構討論一些性能問題,以幫助你了解使用表壓縮預計能獲得多大好處。
表壓縮是如何工作的
在Orcle9i第2版中,表壓縮特性通過刪除在數(shù)據(jù)庫表中發(fā)現(xiàn)的重復數(shù)據(jù)值來節(jié)省空間。壓縮是在數(shù)據(jù)庫的數(shù)據(jù)塊級別上進行的。當確定一個表要被壓縮后,數(shù)據(jù)庫便在每一個數(shù)據(jù)庫數(shù)據(jù)塊中保留空間,以便儲存在該數(shù)據(jù)塊中的多個位置上出現(xiàn)的數(shù)據(jù)的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的數(shù)據(jù)只存儲在該符號表中,而不是在數(shù)據(jù)庫行本身內(nèi)。當在一個數(shù)據(jù)庫行中出現(xiàn)被標識為要壓縮的數(shù)據(jù)時,該行在該符號表中存儲一個指向相關數(shù)據(jù)的指針,而不是數(shù)據(jù)本身。節(jié)約空間是通過刪除表中數(shù)據(jù)值的冗余拷貝而實現(xiàn)的。
對于用戶或應用程序開發(fā)人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發(fā)人員訪問表的方式都是相同的,所以當你決定壓縮一個表時,不需要修改SQL查詢。表壓縮的設置通常由數(shù)據(jù)庫管理人員或設計人員進行配置,幾乎不需要開發(fā)人員或用戶參與。
如何創(chuàng)建一個壓縮的表
要創(chuàng)建一個壓縮的表,可在CREATE TABLE語句中使用COMPRESS關鍵字。COMPRESS關鍵字指示Oracle數(shù)據(jù)庫盡可能以壓縮的格式存儲該表中的行。下面是CREATE TABLE COMPRESS語句的一個實例:
CREATE TABLE SALES_HISTORY_COMP (
PART_ID VARCHAR2(50) NOT NULL,
STORE_ID VARCHAR2(50) NOT NULL,
SALE_DATE DATE NOT NULL,
QUANTITY NUMBER(10,2) NOT NULL
)
COMPRESS
;
或者,你可以用ALTER TABLE語句來修改已有表的壓縮屬性,如下所示:
ALTER TABLE SALES_HISTORY_COMP COMPRESS;
為了確定是否已經(jīng)利用COMPRESS對一個表進行了定義,可查詢USER_TABLES數(shù)據(jù)字典視圖并查看COMPRESSION列,如下面的例子所示:
SELECT TABLE_NAME, COMPRESSION FROM USER_TABLES;
TABLE_NAME COMPRESSION
------------------ -----------
SALES_HISTORY DISABLED
SALES_HISTORY_COMP ENABLED
也可以在表空間級別上定義COMPRESS屬性,既可以在生成時利用CREATE TABLESPACE來定義,也可以稍后時間利用ALTER TABLESPACE來定義。與其他存儲參數(shù)類似,COMPRESS屬性也具有一些繼承特性。當在一個表空間中創(chuàng)建一個表時,它從該表空間繼承COMPRESS屬性。為了確定是否已經(jīng)利用COMPRESS對一個表空間進行了定義,可查詢USER_TABLESPACES數(shù)據(jù)字典視圖并查看DEF_TAB_COMPRESSION列,如下面的例子所示:
SELECT TABLESPACE_NAME,
DEF_TAB_COMPRESSION
FROM DBA_TABLESPACES;
TABLESPACE_NAME DEF_TAB_COMPRESSION
--------------- -------------------
DATA_TS_01 DISABLED
INDEX_TS_01 DISABLED
正如你所預計的那樣,你可以在一個表空間直接壓縮或解壓縮一個表,而不用考慮表空間級別上的COMPRESS屬性。
向一個壓縮的表中加載數(shù)據(jù)
請注意,當你像上面那樣指定COMPRESS時,你并沒在實際壓縮任何數(shù)據(jù)。上面的這些命令只是修改了一個數(shù)據(jù)字典的設置。只有你向一個表中加載或插入數(shù)據(jù)時才會實際壓縮數(shù)據(jù)。
而且,為了確保數(shù)據(jù)被實際壓縮,你需要利用一種正確的方法將數(shù)據(jù)加載或插入到表中。只有在利用以下4種方法之一批量加載或批量插入過程中才會進行數(shù)據(jù)壓縮:
直接路徑SQL*Loader
帶有APPEND提示的串行INSERT
并行INSERT
CREATE TABLE ... AS SELECT
如果在一個平面文件中有輸入數(shù)據(jù)是可用的,那么直接路徑SQL*Loader方法是將這些輸入數(shù)據(jù)加載至一個表格中最方便的手段。下面給出一個示例:
$sqlldr sanjay/sanjay@proddb control=sales_history.ctl direct=true
如果在一個登臺表中有輸入數(shù)據(jù),那么你可以使用帶有APPEND提示的串行INSERT方法或者并行INSERT方法。
作為一個例子,請看一個名為SALES_HISTORY的未壓縮登臺表中的可用輸入數(shù)據(jù)。用串行INSERT方法時,你可以使用以下的語句向已壓縮表中插入數(shù)據(jù):
INSERT /*+ APPEND */
INTO SALES_HISTORY_COMP
SELECT * FROM SALES_HISTORY;
或者,你也可以用并行INSERT方法將數(shù)據(jù)由一個登臺表轉移到一個已壓縮表中,如下所示:
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+PARALLEL(SALES_HISTORY_COMP,4)*/
INTO SALES_HISTORY_COMP
SELECT * FROM SALES_HISTORY;
請注意,在使用并行INSERT方法時,你需要首先利用ALTER SESSION ENABLE PARALLEL DML命令為會話期來啟動并行DML。
如果輸入數(shù)據(jù)位于一個平面文件中,那么你也可以使用一個外部表,然后將這些數(shù)據(jù)插入到一個壓縮表中,就像這些數(shù)據(jù)放在一個登臺表中可用一樣。(對外部表的討論超出了本文的范圍)。
你還可以使用CREATE TABLE ... AS SELECT語句一次生成一個壓縮表,并將數(shù)據(jù)插入至其中。 這里有一個例子:
CREATE TABLE SALES_HISTORY_COMP
COMPRESS
AS SELECT * FROM SALES_HISTORY;
如果你沒有使用正確的加載或INSERT方法,那么即使使用COMPRESS對表格進行了定義,該表中的數(shù)據(jù)也將仍然保持未壓縮狀態(tài)。 例如,如果你使用慣用路徑SQL*Loader或正則INSERT語句,那么數(shù)據(jù)仍然是未壓縮的。
什么時候使用表壓縮
Oracle數(shù)據(jù)庫選擇用來壓縮表數(shù)據(jù)或不壓縮表數(shù)據(jù)的方式已暗中牽涉到了最適合于表壓縮的應用程序。如上所述,一個表中已被使用COMPRESS定義的數(shù)據(jù),只有在使用直接路徑模式被加載或利用添加(append)或并行模式被插入時,才會得到壓縮。通過正則插入語句插入的數(shù)據(jù)將保持未壓縮狀態(tài)。
在在線事務處理(OLTP)系統(tǒng)中,通常是使用正則插入模式來插入數(shù)據(jù)的。因此,使用表壓縮通常不會使這些表格獲得太大的好處。 表壓縮對于那些只加載一次但多次讀取的只讀表格具有最佳效果。例如,數(shù)據(jù)倉庫應用程序中所用的表格特別適合于進行表壓縮。
此外,在一個已壓縮表中更新數(shù)據(jù)可能要求數(shù)據(jù)行為非壓縮的,這樣就達不到進行壓縮的目的。因此,那些需要經(jīng)常進行更新操作的表不適于進行表壓縮。
最后,讓我們來看一下行刪除對表壓縮應用的影響。當你刪除一個壓縮的表中的一行時,數(shù)據(jù)庫將釋放該行在數(shù)據(jù)庫數(shù)據(jù)塊中所占據(jù)的空間。 這一自由空間可以由未來插入的數(shù)據(jù)重新使用。但是,由于以慣用模式插入的行不能被壓縮,所以它不太可能適合放在一個被壓縮的行所釋放的空間。大量的相繼的DELETE與INSERT語句可能會導致磁盤碎片,且所浪費的空間甚至會多于使用壓縮所能節(jié)省的空間。
壓縮一個已有的未壓縮表
如果你有一個已有的未壓縮表,那么你可以利用ALTER... MOVE語句對其進行壓縮。例如,可以利用以下方法對一個名為SALES_HISTORY_TEMP的未壓縮表進行壓縮:
ALTER TABLE SALES_HISTORY_TEMP
MOVE COMPRESS;
你也可以將ALTER TABLE ...MOVE語句用于解壓縮一個表,如下例所示:
ALTER TABLE SALES_HISTORY_TEMP
MOVE NOCOMPRESS;
請注意,ALTER TABLE ...MOVE操作會獲得一個對該表操作的EXCLUSIVE鎖,它可以在該語句執(zhí)行過程中禁止對該表進行任何DML操作。你可以利用Oracle9i數(shù)據(jù)庫的在線表重定義特性來避免這一可能出現(xiàn)的問題。
壓縮一個物化視圖
你可以使用用于壓縮表的類似方式來壓縮物化視圖。下面的命令生成一個壓縮的物化視圖:
CREATE MATERIALIZED VIEW MV_SALES_COMP
COMPRESS
AS SELECT P.PART_NAME, H.STORE_ID, H.SALE_DATE, H.QUANTITY
FROM SALES_HISTORY H, PARTS P
WHERE P.PART_ID = H.PART_ID;
基于多個表的聯(lián)接生成的物化視圖通常很適于壓縮,因為它們通常擁有大量的重復數(shù)據(jù)項。你可以使用ALTER MATERIALIZED VIEW命令來改變一個物化視圖的壓縮屬性。下面的命令顯示了如何壓縮一個已有的未壓縮的物化視圖。
ALTER MATERIALIZED VIEW MV_SALES COMPRESS;
當你使用此命令時,請注意通常是在下一次刷新該物化視圖時才會進行實際的壓縮。
壓縮一個已分區(qū)的表
在對已分區(qū)的表應用壓縮時,可以有很多種選擇。你可以在表級別上應用壓縮,也可以在分區(qū)級別上應用壓縮。例如,代碼清單 1中的CREATE TABLE語句創(chuàng)建一個具有4個分區(qū)的表。 由于是在表級別指定了COMPRESS,所以對全部4個分區(qū)都進行壓縮。
由于可以在分區(qū)級別上指定壓縮屬性,所以你可以選擇壓縮某些分區(qū),而使另一些分區(qū)保持未壓縮狀態(tài)。代碼清單 2中的示例說明了如何在分區(qū)級別上指定壓縮屬性。
在代碼清單 2中,壓縮了兩個表分區(qū)(SALES_Q1_03和SALES_Q2_03) ,而另外兩個分區(qū)未被壓縮。要注意,在分區(qū)級別上指定的壓縮屬性會取代對該分區(qū)在表級別上特定的壓縮屬性。如果未為一個分區(qū)指定壓縮屬性,那么該分區(qū)將繼承在表級別上指定的壓縮屬性。在代碼清單 2中,由于未對分區(qū)SALES_Q3_03和SALES_Q4_03指定壓縮屬性,所以這兩個分區(qū)繼承表級別上指定的屬性值(在本例情況下為默認的NOCOMPRESS)。
在通過壓縮來使用已分區(qū)的表時,它可以提供一個獨特的好處。對表進行分區(qū)的一個非常有用的方法是將要對其進行DML操作(插入、更新與刪除)的數(shù)據(jù)放入與只讀文件分開的分區(qū)內(nèi)。例如,在代碼清單 2的表定義中,根據(jù)SALE_DATE對銷售數(shù)據(jù)進行了分區(qū),這樣可將每一季度的銷售歷史數(shù)據(jù)存儲在一個單獨的分區(qū)內(nèi)。在此示例中,2003年第1、2季度的銷售數(shù)據(jù)不能被修改,所以將它們置于壓縮分區(qū)SALES_Q1_03 和SALES_Q2_03中。對于第3、4季度的銷售數(shù)據(jù)仍可以進行修改,所以相應的分區(qū)SALES_Q3_03和SALES_Q4_03保持未壓縮狀態(tài)。
如果在2003年第3季度末,SALES_Q3_03分區(qū)中的數(shù)據(jù)變?yōu)橹蛔x的,那么你可以利用ALTER TABLE ...MOVE PARTITION命令對此分區(qū)進行壓縮,如下面的語句所示:
ALTER TABLE SALES_PART_COMP
MOVE PARTITION SALES_Q3_03 COMPRESS;
要找出一個表中的哪些分區(qū)被壓縮了,可以查詢數(shù)據(jù)字典視圖USER_TAB_PARTITIONS,如下例所示:
SELECT TABLE_NAME, PARTITION_NAME,
COMPRESSION
FROM USER_TAB_PARTITIONS;
TABLE_NAME PARTITION_NAME COMPRESSION
---------------------------- -----------
SALES_PART_COMP SALES_Q4_03 DISABLED
SALES_PART_COMP SALES_Q1_03 ENABLED
SALES_PART_COMP SALES_Q2_03 ENABLED
SALES_PART_COMP SALES_Q3_03 ENABLED
定量地評價壓縮帶來的好處
使用表壓縮的最主要原因是要節(jié)省存儲空間。壓縮形式的表所占用的空間通常小于其非壓縮形式所占用的空間。為了說明這一點,可考慮以下測試,其中有兩個表--一個是未壓縮的(SALES_HISTORY),一個是壓縮的(SALES_HISTORY_COMP)。這兩個表都是利用直接路徑SQL*Loader由一個包含有200萬行的單一平面文件加載的。在完成了對兩個表的數(shù)據(jù)加載后,壓縮的表所占用的空間差不多是未壓縮表的一半。代碼清單 3顯示了分析結果。
一個壓縮的表可以存儲在更少的數(shù)據(jù)塊中,從而節(jié)省了儲存空間,而使用更少的數(shù)據(jù)塊也意味著性能的提高。 在一個I/O受到一定限制的環(huán)境中對一個壓縮的表進行查詢通常可以更快速地完成,因為他們需要閱讀的數(shù)據(jù)庫數(shù)據(jù)塊要少得多。為了說明這一點,我對一個壓縮的表和一個未壓縮的表進行查詢,并執(zhí)行一個SQLTRACE/TKPROF分析。代碼清單 4顯示了該分析結果。
SQLTRACE/TKPROF報告表明:我對該壓縮表執(zhí)行的物理和邏輯I/O操作相對于對非壓縮表進行的相應查詢要少得多,因而執(zhí)行得也更快得多。
性能開銷
由于表壓縮是在批量加載時進行的,所以數(shù)據(jù)加載操作會因涉及附加的內(nèi)務操作而需要額外的處理工作。為了衡量壓縮對性能的影響,我進行了一個測試,在該測試中,我向兩個相同的表中(一個壓縮的表,另一個未壓縮的表)加載了(利用直接路徑SQL*Loader)100萬行數(shù)據(jù)。表 1顯示了由SQL*Loader日志文件中取出的結果,它們給出了向這兩個壓縮的與非壓縮的表中加載數(shù)據(jù)花費了多少時間。
表1:比較未壓縮的表與壓縮的表的加載時間
加載壓縮的表所需要的額外時間源自在數(shù)據(jù)加載過程中所執(zhí)行的壓縮操作。在實際情況下,實際時間差取決于表的設計與給定環(huán)境下的數(shù)據(jù)的布局。
結論
Oracle9i第2版中的表壓縮特性可以節(jié)省大量的磁盤空間,尤其是對于具有大型只讀表的數(shù)據(jù)庫來說更是如此。如果你能記住加載和插入需要,并能確定那些適于進行壓縮的表,那么你會發(fā)現(xiàn),表壓縮是節(jié)省磁盤空間的絕佳方式,在某些情況下還可以提高查詢性能。
ref: 壓縮已分區(qū)的表:
http://xsb.itpub.net/post/419/57064http://www.oracle.com/global/cn/oramag/oracle/04-mar/o24tech_data.html
http://www.stcore.com/html/2005/1130/104979.html
附:
1, 壓縮一個已存在的表空間:
alter tablespace users default compress;
僅對之后特殊方式插入的數(shù)據(jù)壓縮!
2, 壓縮已分區(qū)表
對已分區(qū)的表(甚至帶子分區(qū))進行壓縮,如果不能一步完成,那么:
分兩步半完成:
alter table test compress;
select 'alter table test move subpartition '|| subpartition_name||';' from user_tab_subpartitions where table_name like 'TEST';
除表可以壓縮外,分區(qū)表可以壓縮,索引可以壓縮,物化視圖也可以壓縮。語法類似。
注:除索引外,壓縮屬性可以繼承表空間的壓縮屬性。表空間改成壓縮的:
alter tablespace ts_test default compress;
以下5種情況可以發(fā)揮壓縮特性:
直接路徑SQL*Loader
帶有APPEND提示的串行INSERT
并行INSERT
CREATE TABLE ... AS SELECT
alter table move
壓縮可以大幅度減少空間占用(可壓縮60%以上),從而減少IO量,提高性能。
re: oracle日期處理完全版 xzc 2010-05-14 20:35
select to_char(cur_month, 'MM'), cur_month, last_day(cur_month)
from (select aa.begin_month, rownum, add_months(aa.begin_month, rownum - 1) cur_month
from (select to_date('2008' || '12', 'YYYYMM') begin_month, to_date('2009' || '02', 'YYYYMM') end_month
from dual) aa,
all_objects bb
where rownum <= months_between(aa.end_month, aa.begin_month) + 1)
re: oracle日期處理完全版 xzc 2010-05-13 21:10
題目: 輸入4個值[2008,12,2009,2], 要求一段SQL, 不另創(chuàng)新表, 得到如下結果:
12 2008-12-1 2008-12-31
01 2009-1-1 2009-1-31
02 2009-2-1 2009-2-28
條件: 起始年, 起始月, 截至年, 截至月
結果: 月份, 月的第一天, 月的最后一天
解答:
Sql代碼
select to_char(tt.d, 'mm'), tt.d, last_day(tt.d)
from (select ADD_MONTHS(zz.s, rownum - 1) d
from (select to_date('2008' || '12' || '01', 'yyyymmdd') s,
to_date('2009' || '02' || '01', 'yyyymmdd') e
from dual) zz,
(select * from user_objects)
where rownum <= MONTHS_BETWEEN(zz.e, zz.s) + 1) tt
select to_char(tt.d, 'mm'), tt.d, last_day(tt.d)
from (select ADD_MONTHS(zz.s, rownum - 1) d
from (select to_date('2008' || '12' || '01', 'yyyymmdd') s,
to_date('2009' || '02' || '01', 'yyyymmdd') e
from dual) zz,
(select * from user_objects)
where rownum <= MONTHS_BETWEEN(zz.e, zz.s) + 1) tt
分析: 這個題目比較難, 因為考察了很多的Oracle特有的函數(shù),表(視圖).
rownum 行號
ADD_MONTHS 日期函數(shù),給一個日期加一個月數(shù),得到這個月數(shù)后的日期
to_date 日期函數(shù), 將一個字符以一定格式轉成日期
to_char 字符函數(shù), 以一定格式得到字符
last_day 日期函數(shù), 得到某日所在月的最后一天
MONTHS_BETWEEN 日期函數(shù), 得到兩個日期間隔的月數(shù)
re: rowid 刪除重復記錄!!! xzc 2010-05-13 15:39
delete from rpt_index_inst_anly_group a
where index_inst_id <> (select min(index_inst_id)
from rpt_index_inst_anly_group b
where a.index_id = b.index_id
and a.data_date = b.data_date
and a.latn_id = b.latn_id
and a.business_id = b.business_id
and a.cust_group_id = b.cust_group_id
and a.data_date = 201001
and a.latn_id = 1100
and a.index_id in (SELECT a.index_id
FROM tsm_index_value a, tsm_report_index_map b
WHERE b.index_id = a.index_id
AND b.calc_mode = '0'
AND b.report_id = 9));
spool常用的設置
set colsep' '; //域輸出分隔符
set echo off; //顯示start啟動的腳本中的每個sql命令,缺省為on
set feedback off; //回顯本次sql命令處理的記錄條數(shù),缺省為on
set heading off; //輸出域標題,缺省為on
set pagesize 0; //輸出每頁行數(shù),缺省為24,為了避免分頁,可設定為0。
set termout off; //顯示腳本中的命令的執(zhí)行結果,缺省為on
set trimout on; //去除標準輸出每行的拖尾空格,缺省為off
set trimspool on; //去除重定向(spool)輸出每行的拖尾空格,缺省為off
sqlplus -s infsett/infsett@odsstat 1>&- <<EOF
set echo off
set pagesize 0
SET LINESIZE 2500
set trimspool on
set heading off
set feedback off
set termout off
spool /odsstatfs/groupfile/${file_name}
select 'START' from dual where rownum <= 1
union all
${table_sql}
union all
select 'C::|${file_name}|'||count(*) from (${table_sql});
spool off;
exit;
EOF
re: 高效率刪除文本文件的最后一行 xzc 2010-04-22 11:02
文件行數(shù)
cat DAPMmxdata004.20100421.201003.0001.771|wc -l
re: 高效率刪除文本文件的最后一行 xzc 2010-04-21 18:48
:|dd of=input.file seek=1 bs=$(($(stat -c%s input.file)-$(tail -1 input.file|wc -c)))
或者改為這樣更好理解:
dd if=/dev/null of=input.file seek=1 bs=$(($(find input.file -printf "%s")-$(tail -1 input.file|wc -c)))
也就是說:|的輸出是空字符串,而其作用正好與/dev/null相似。
re: shell:date 常用方式 xzc 2010-04-20 10:56
[root@108test ~]# date -d today +"%Y-%m-%d"
2008-05-07
[root@108test ~]# date -d today +"%Y_%-m_%-d"
2008_5_7
[root@108test ~]# date -d today +"%Y-%m-%d %T"
2008-05-07 14:55:19
[root@108test ~]# date -d today +"%Y-%m-%d %H:%M"
2008-05-07 14:55
[root@108test ~]# date -d today +"%Y-%m-%d %H:%M:%S"
2008-05-07 14:55:57
--刪除分區(qū)
ALTER TABLE WID_SETT_TICKET_DAY_1100 DROP PARTITION P20100401;
--增加分區(qū)
ALTER TABLE WID_SETT_TICKET_DAY_1100 ADD PARTITION P20100401 VALUES (20100401) TABLESPACE ODSDATA_04 NOLOGGING;
--查找分區(qū)
select *
from USER_TAB_PARTITIONS
where table_name = 'WID_SETT_TICKET_DAY_1100'
and partition_name = 'P20100401';
FUNCTION func_cre_load_partition(v_table_name varchar2,
v_acct_month varchar2,
v_partitionName varchar2,
v_lan_id number) RETURN NUMBER IS
/***************************************************************
函數(shù)名:(func_cre_partition)
功能描述:建立分區(qū)策略
輸入?yún)?shù)說明:v_table_name 需要建分區(qū)的表名
v_acct_month 建分區(qū)的月份
v_partitionName 分區(qū)名稱
v_lan_id 建分區(qū)的本地網(wǎng)
返回參數(shù)說明: 1 成功 -1 失敗
創(chuàng)建人員:lizhenpeng
創(chuàng)建日期:2009-4-14
***************************************************************/
exists_flag int;
v_sql varchar2(2000);
i_status int := 0;
V_LOGID NUMBER(12);
v_err VARCHAR2(500);
begin
--判斷分區(qū)是否存在
select count(*)
into exists_flag
from USER_TAB_PARTITIONS
where table_name = UPPER(v_table_name)
and partition_name = UPPER(v_partitionName || '_' || v_acct_month || '_' ||
to_char(v_lan_id));
--不存在創(chuàng)建對應分區(qū)
if exists_flag = 0 then
loop
v_sql := 'LOCK TABLE OTH_PARTITION_CTL IN EXCLUSIVE MODE';
execute immediate v_sql;
--判斷是否鎖定 0未開始 2 進行 1 完成
begin
select status
into i_status
from oth_partition_ctl
where fwf_no = v_acct_month
and table_name = UPPER(v_table_name);
exception
when others then
insert into oth_partition_ctl
values
(v_acct_month, UPPER(v_table_name), 2);
commit;
i_status := 0;
end;
commit;
--創(chuàng)建分區(qū)考慮是否重復創(chuàng)建邏輯
if i_status = 0 then
update oth_partition_ctl
set status = 2
where fwf_no = v_acct_month
and table_name = UPPER(v_table_name);
commit;
for v1 in (select standard_code
from oth_code_relation
where system_id = 2
and code_type = 'LAN_ID'
and standard_code like '7%'
ORDER BY STANDARD_CODE) loop
v_sql := 'alter table ' || v_table_name || ' add PARTITION ' ||
v_partitionName || '_' || v_acct_month || '_' ||
v1.standard_code || ' values less than (' ||
v_acct_month || ',' ||
to_char(to_number(v1.standard_code) + 1) ||
') NOLOGGING';
execute immediate v_sql;
end loop;
--修改完成標志
update oth_partition_ctl
set status = 1
where fwf_no = v_acct_month
and table_name = UPPER(v_table_name);
commit;
elsif (i_status = 2) then
--別的進程正在建立分區(qū),等待完成
dbms_lock.sleep(30);
elsif (i_status = 1) then
--已經(jīng)等待別的進程分區(qū)創(chuàng)建完成
goto lab_exit;
end if;
end loop;
<<lab_exit>>
null;
--存在TRUNCATE對應分區(qū)
elsif (exists_flag > 0) then
dbms_lock.sleep(to_number(v_lan_id) - 700);
v_sql := 'alter table ' || v_table_name || ' truncate PARTITION ' ||
v_partitionName || '_' || v_acct_month || '_' ||
to_char(v_lan_id);
execute immediate v_sql;
end if;
return 1;
exception
when others then
update oth_partition_ctl
set status = 0
where fwf_no = v_acct_month
and table_name = UPPER(v_table_name);
commit;
v_err := substr(sqlerrm, 1, 254);
select seq_job_id.nextval into V_LOGID from dual;
INSERT INTO oth_fat_detail_log
(LOG_ID,
LAN_CODE,
ACCT_MONTH,
PROC_NAME,
ERR_CODE,
ERR_NAME,
ERR_MSG,
start_time)
VALUES
(V_LOGID,
v_lan_id,
v_acct_month,
V_TABLE_NAME,
v_partitionName || '_' || v_acct_month || '_' || v_lan_id,
v_partitionName || '_' || v_acct_month || '_' || v_lan_id,
v_err,
sysdate);
return - 1;
end func_cre_load_partition;
#!/bin/bash
#
Foo=("a" "b" "c" "d" "e")
for name in ${Foo[@]}
do
echo $name
done
for (( i = 0 ; i < ${#Foo[@]} ; i++ ))
do
echo ${Foo[$i]}
done
re: sqlldr詳解 xzc 2010-03-24 21:06
sqlldr userid=tbas/xx@jyfx control=/datafile/ControlFiles/Interface/Sett_ticket/fangchenggang/201003/Ext_201003_0770_sett_ticket.ctl data=/setfile2/NewSettleFiles/fangchenggang/201003/2210.032302.4962.2010032300.0.021240.01.17 log=/datafile/ControlFiles/Log/Extr_201003_0770_77000000001_sett_ticket.log bad=/datafile/ControlFiles/Log/Extr_201003_0770_77000000001_sett_ticket.bad readsize=6553600 bindsize=6553600 rows=5000 errors=10 silent=header,feedback parallel=true
re: sqlldr詳解 xzc 2010-03-24 21:05
LOAD DATA
APPEND
INTO TABLE FCG_SETT_TICKET
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(DATE_NO CONSTANT 20100323 ,
MONTH_ID CONSTANT 3,
DAY_ID CONSTANT 23,
SETT_FILE_ID CONSTANT 77000000002,
MONTH_NO CONSTANT 201003,
BATCH_CODE FILLER,
DEAL_DATE FILLER,
FILE_ID FILLER,
OFFSET FILLER,
PRODUCT_ID FILLER,
BILL_TYPE FILLER,
SOURCE_ID FILLER,
CALLING_ORG_CODE FILLER,
CALLING_ACC_NBR ,
CALLING_PARTNER_CODE ,
CALLING_LOCAL_CODE ,
CALLING_ATTACH_PROV FILLER,
CALLING_TOLL_TYPE FILLER,
CALLING_BRAND_CODE FILLER,
CALLING_AREA_CODE ,
CALLED_ORG_CODE FILLER,
CALLED_ACC_NBR ,
CALLED_PARTNER_CODE ,
CALLED_LOCAL_CODE ,
CALLED_ATTACH_PROV FILLER,
CALLED_TOLL_TYPE FILLER,
CALLED_BRAND_CODE FILLER,
CALLED_AREA_CODE ,
TRANSFER_ORG_CODE FILLER,
TRANSFER_CODE FILLER,
TRANSFER_ATTACH_TSP FILLER,
TRANSFER_AREA_CODE FILLER,
TRANSFER_BRAND_CODE FILLER,
ORG_BILLING_NUMBER FILLER,
BILLING_NUMBER FILLER,
BILLING_AREA_CODE FILLER,
BILLING_PROV_CODE FILLER,
TRUNK_IN_CODE FILLER,
TRUNK_IN_TSP FILLER,
TRUNK_IN__AREA_CODE FILLER,
TRUNK_IN_BRAND FILLER,
TRUNK_IN_TYPE FILLER,
TRUNK_IN_REGION_CODE FILLER,
TRUNK_OUT_CODE FILLER,
TRUNK_OUT_TSP FILLER,
TRUNK_OUT_AREA_CODE FILLER,
TRUNK_OUT_BRAND FILLER,
TRUNK_OUT_TYPE FILLER,
TRUNK_OUT_REGION_CODE FILLER,
START_TIME ,
END_TIME ,
DURATION ,
CHARGE_DURATION ,
SETT_DURATION ,
FEE FILLER,
SETT_CHARGE ,
LOCAL_DISCOUNT_FEE FILLER,
TOLL_DISCOUNT_FEE FILLER,
SETT_CALLS ,
SETT_ACCT_ITEM_CODE ,
AREA_CODE FILLER,
REGION_CODE FILLER,
REGION_FLAG FILLER,
DIRECTION_ID ,
FEE_OUT_SETT_SIDE FILLER,
FEE_IN_SETT_SIDE FILLER,
CON_NBR_CODE ,
EXPIRE_FLAG FILLER,
CALL_TYPE FILLER,
CYCLE_MONTH FILLER,
aaaDAY_ID FILLER,
ERROR_CODE FILLER,
EXTEND1 FILLER,
EXTEND2 FILLER,
EXTEND3 FILLER,
EXTEND4 FILLER,
EXTEND5 FILLER,
EXTEND6 FILLER,
EXTEND7 FILLER,
EXTEND8 FILLER,
EXTEND9 FILLER,
EXTEND10 FILLER,
CALLING_AREA_CODE_MAP FILLER,
CALLED_AREA_CODE_MAP FILLER,
TRANSFER_AREA_CODE_MAP FILLER,
BILLING_AREA_CODE_MAP FILLER,
F_ACCESS_TYPE FILLER,
F_YEAR_ID FILLER,
F_MONTH_ID FILLER,
F_DAY_ID FILLER,
F_HOUR_ID FILLER,
CALL_DEST_CODE ,
F_DIRECTION_ID FILLER,
F_FORMAT_CALLER_TSP FILLER,
F_FORMAT_CALLED_TSP FILLER,
F_TRANS_NET_WORK FILLER,
F_TOLL_NET_BUSI_TYPE FILLER,
CALLING_NETWORK_TYPE_CODE ,
CALLED_NETWORK_TYPE_CODE ,
F_CALLER_TOLL_TYPE FILLER,
F_CALLED_TOLL_TYPE FILLER,
F_CALLED_BUSI_TYPE FILLER,
F_SWITCH_ID FILLER,
IS_DISCOUNT FILLER )
#!/bin/bash
. /odsstatfs/.profile
cd /odsstatfs/scripts/group/
curday=`date +'%Y%m%d'`
#echo 文件名:${1}
cat > MID_IC_CARD_TICKET_DAY.ctl << EOF
LOAD DATA
INFILE '/odsstatfs/cardfile/Card_Ticket_${1}.txt'
truncate
INTO TABLE MID_IC_CARD_TICKET_DAY
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS(
DATE_NO integer external,
AREA_ID integer external,
CARD_ID char,
CALLING_NBR char,
CALLED_NBR char,
CALL_TIME char,
DURATION integer external,
AMOUNT integer external,
CALL_ID integer external
)
EOF
## 導入數(shù)據(jù)
sqlldr odsstat/xxx@odsstat control=MID_IC_CARD_TICKET_DAY.ctl direct=y errors=10
#刪除控制文件
#cd /odsstatfs/groupfs/
#rm MID_IC_CARD_TICKET_DAY.ctl
#IC卡接口表數(shù)據(jù)導入完成
sqlplus odsstat/xxx@odsstat <<EOF
DELETE FROM ods_data_msg WHERE ACCT_MONTH=to_char(sysdate,'YYYYMMDD') and upper(TABLE_CODE)='MID_IC_CARD_TICKET_DAY';
insert into ods_data_msg (ACCT_MONTH, SYSTEM_ID, TABLE_CODE, TASK_NAME, STATE_DATE, MSG_FLAG, COMMENTS)
values (to_char(sysdate,'YYYYMMDD'), 1, 'MID_IC_CARD_TICKET_DAY', 'IC卡接口表數(shù)據(jù)導入完成', sysdate, 'T', 'IC卡接口表數(shù)據(jù)導入完成');
exit
EOF
echo 數(shù)據(jù)加載完成
re: rowid 刪除重復記錄!!! xzc 2010-03-06 12:50
select *
from rpt_index_inst_mon a
where rowid = (select max(rowid)
from rpt_index_inst_mon b
where a.index_id = b.index_id
and a.acct_month = b.acct_month
and a.latn_id = b.latn_id
and a.business_id = b.business_id
and a.dimm1 = b.dimm1
and a.dimm2 = b.dimm2
and a.dimm3 = b.dimm3
and a.dimm4 = b.dimm4
and a.dimm5 = b.dimm5
and a.index_value = b.index_value)
and a.index_id in
(select index_id
from rpt_index_inst_mon
where acct_month = 201002
--and latn_id = 1200
and index_id in (select index_id from TSM_CALC_GROUP_INDEX_MAP where calc_group_id in (1300, 1301, 1302))
group by index_id, acct_month, latn_id, business_id, dimm1, dimm2, dimm3, dimm4, dimm5, index_value
having count(*) > 1)
and a.acct_month = 201002
--and a.latn_id = 1200
re: rowid 刪除重復記錄!!! xzc 2010-03-06 12:49
delete rpt_index_inst_anly_reports a
where rowid <> (select max(rowid)
from rpt_index_inst_anly_reports b
where a.data_date = b.data_date
and a.report_id = b.report_id
and a.index_id = b.index_id
and a.latn_id = b.latn_id
and a.rowno = b.rowno
and a.colno = b.colno
and a.data_date = 200903
and a.report_id = 9
and a.latn_id = 1202);
re: rowid 刪除重復記錄!!! xzc 2010-03-06 12:49
select *
from rpt_index_inst_mon
where (index_id, acct_month, latn_id, business_id, dimm1, dimm2, dimm3, dimm4, dimm5, index_value) in
(select index_id, acct_month, latn_id, business_id, dimm1, dimm2, dimm3, dimm4, dimm5, index_value
from rpt_index_inst_mon
where acct_month = 201002
--and latn_id = 1200
and index_id in (select index_id from TSM_CALC_GROUP_INDEX_MAP where calc_group_id in (1300, 1301, 1302))
group by index_id, acct_month, latn_id, business_id, dimm1, dimm2, dimm3, dimm4, dimm5, index_value
having count(*) > 1)
and rowid not in
(select min(rowid)
from rpt_index_inst_mon
where acct_month = 201002
--and latn_id = 1200
and index_id in (select index_id from TSM_CALC_GROUP_INDEX_MAP where calc_group_id in (1300, 1301, 1302))
group by index_id, acct_month, latn_id, business_id, dimm1, dimm2, dimm3, dimm4, dimm5, index_value
having count(*) > 1);
re: rowid 刪除重復記錄!!! xzc 2010-03-06 12:49
select *
from rpt_index_inst_mon a
where rowid not in
(select min(rowid)
from rpt_index_inst_mon
where acct_month = 201002
and latn_id = 1200
and index_id in (select index_id from TSM_CALC_GROUP_INDEX_MAP where calc_group_id in (1300, 1301, 1302))
group by index_id, acct_month, latn_id, business_id, dimm1, dimm2, dimm3, dimm4, dimm5, index_value)
and a.acct_month = 201002
and a.latn_id = 1200
and a.index_id in (select index_id from TSM_CALC_GROUP_INDEX_MAP where calc_group_id in (1300, 1301, 1302))
Start with...Connect By子句遞歸查詢一般用于一個表維護樹形結構的應用。
創(chuàng)建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入測試數(shù)據(jù):
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
從Root往樹末梢遞歸
select * from TBL_TEST
start with id=1
connect by prior id = pid
從末梢往樹ROOT遞歸
select * from TBL_TEST
start with id=5
connect by prior pid = id
=====
對于oracle進行簡單樹查詢(遞歸查詢)
DEPTID PAREDEPTID NAME
NUMBER NUMBER CHAR (40 Byte)
部門id 父部門id(所屬部門id) 部門名稱
通過子節(jié)點向根節(jié)點追朔.
Sql代碼
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
Sql代碼
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
通過根節(jié)點遍歷子節(jié)點.
Sql代碼
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
Sql代碼
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
可通過level 關鍵字查詢所在層次.
Sql代碼
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
Sql代碼
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
再次復習一下:start with ...connect by 的用法, start with 后面所跟的就是就是遞歸的種子。
遞歸的種子也就是遞歸開始的地方 connect by 后面的"prior" 如果缺省:則只能查詢到符合條件的起始行,并不進行遞歸查詢;
connect by prior 后面所放的字段是有關系的,它指明了查詢的方向。
練習: 通過子節(jié)點獲得頂節(jié)點
Sql代碼
select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid
====這種方法只是當表里就有一顆樹,多棵樹怎么辦?
聲明:JavaEye文章版權屬于作者,受法律保護。沒有作者書面許可不得轉載。
re: java命令詳解 xzc 2009-12-04 17:25
眾所周知,java的JVM有一套自己的垃圾回收機制。因此在許多情況下并不需要java程序開發(fā)人員操太多的心。然而也許也因為這樣,往往會造成java程序員的過分依賴而致使開發(fā)出來的程序得不到很好的優(yōu)化,或者說性能尚能提高。
問題的關鍵在于,不論JVM的垃圾回收機制做得多好,計算機的硬件資源是有限的。內(nèi)存更是一項緊張資源。因此雖然JVM為我們完成了大部分的垃圾回收。但適當?shù)刈⒁饩幋a過程中的內(nèi)存管理還是很必要的。這樣能讓JVM回收得更順利更高效。最大限度地提高程序的效率。
mark-1:避免在循環(huán)體內(nèi)創(chuàng)建對象。
……
Object obj = null;//方式一
for(int i =0; i 91k(1984k),0.0027537 secs]
……
可以看到總共有1984kb的內(nèi)存被回收,耗時0.0027537秒。
JVM內(nèi)存相關的參數(shù)
-XX:NewSize(Set the Newgeneralnation heap size)
-XX:MaxNewSize(Set the Maximum Newgeneralnation heap size)
-XX:SurvivorRatio(Set New heap size ratios)
-Xms(Set minimum heap size)
-Xmx(Set maximum heap size)
-Xnoclassgc(取消垃圾回收)
-Xss(設置棧內(nèi)存的大小)
例:java -XX:NewSize = 128m -XX:MaxNewSize = 128m - XX:SurvivorRatio = 8 -Xms 512m -Xmx 512m MyApplication
mark-8:不同編譯方法的類大小
(1)默認編譯方式:javac K.java
長度=代碼+源文件信息+代碼行序號表
(2)調(diào)試編譯方式:javac -g K.java
長度=代碼+源文件信息+代碼行序號表+本地變量表
(3)代碼編譯方式:javax -g:none K.java
長度=代碼
mark-9:經(jīng)驗之談
1.盡早釋放無用對象的引用(XX = null; )
2.盡量少使用finalize函數(shù)。
3.注意集合數(shù)據(jù)類型,如數(shù)組,樹,圖,鏈表等數(shù)據(jù)結構,這些數(shù)據(jù)結構對GC來說回收更復雜。
4.避免在類的默認構造器中創(chuàng)建大量的,初始化大量的對象。
5.避免強制系統(tǒng)做垃圾內(nèi)存回收。
6.避免顯式申請數(shù)組空間,不得不顯式申請時,盡量準確估計其合理值。