随笔-314  评论-209  文章-0  trackbacks-0

我的评论

共3页: 上一页 1 2 3 下一页 
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 重建一下监听.
(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





--通过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';
--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'`
剔除重复记录
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行。
我们经常会遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通过“:”分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
  cut -d: -f 1 /etc/passwd > /tmp/users
  -d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段。
  当然也可以通过cut取得文件中每行中特定的几个字符,例如:
  cut -c3-5 /etc/passwd
  就是输出/etc/passwd文件中每行的第三到第五个字符。
  -c 和 -f 参数可以跟以下子参数:
  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
--从导入的网元中取最新的记录[去除重复].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]
--在服务器上执行
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
re: ORACLE SQL_TRACE的使用 xzc 2010-11-13 14:32  
补充点tkprof的使用方法

Tkprof工具可用来格式化sql trace产生的文件,让你更容易看懂trace的内容


用法:

tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ] ...


参数说明:

tracefile:你要分析的trace文件
outputfile:格式化后的文件
explain=user/password@connectstring
table=schema.tablename
注1:这两个参数是一起使用的,通过连接数据库对在trace文件中出现的每条sql语句查看执行计划,并将之输出到outputfile中
注2:该table必须是数据库中不存在的,如果存在会报错
print=n:只列出最初N个sql执行语句
insert=filename:会产生一个sql文件,运行此文件可将收集到的数据insert到数据库表中
sys=no:过滤掉由sys执行的语句
record=filename:可将非嵌套执行的sql语句过滤到指定的文件中去
waits=yes|no:是否统计任何等待事件
aggregate=yes|no:是否将相同sql语句的执行信息合计起来,默认为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
可根据自己的需要设置排序


举例:

1.列出前2条sql语句的执行情况:

C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt print=2

2.将数据保存到数据库:

C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt insert=c:\insert.sql

执行后会在c:\产生insert.sql文件,执行该文件即可将数据保存到数据库,以下为insert.sql部分内容:

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执行语句:

C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt record=sqlstr.sql

sqlstr.sql中的内容:

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.产生执行计划:

C:\>tkprof c:\oc_ora_2892.trc c:\ff.txt explain=ocuser/ocuser table=ocuser.test1

在产生的ff.txt文件中会体现其执行计划:

Rows Execution Plan
——- —————————————————
0 SELECT STATEMENT GOAL: CHOOSE
0 TABLE ACCESS (FULL) OF 'TBLROUTE'
re: ORACLE SQL_TRACE的使用 xzc 2010-11-13 14:31  
如何读懂tkprof


CALL :每次SQL语句的处理都分成以下三个部分
Parse:这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。
Execute:这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。
Fetch:返回查询语句中所获得的记录,这步只有select语句会被执行。
COUNT:这个语句被parse、execute、fetch的次数。
CPU:这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED:这个语句所有消耗在parse、execute、fetch的总的时间。
DISK:从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY:在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。
CURRENT:在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取buffer。在current模式下如果在高速缓存区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。
ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,对于insert、update、delete操作,返回记录则是在execute这步。

A、query+current/rows 平均每行所需的block数,太大的话(超过20)SQL语句效率太低
B、Parse count/Execute count parse count应尽量接近1,如果太高的话,SQL会进行不必要的reparse
C、rows Fetch/Fetch Fetch Array的大小,太小的话就没有充分利用批量Fetch的功能,增加了数据在客户端和服务器之间的往返次数。
D、disk/query+current 磁盘IO所占逻辑IO的比例,太大的话有可能是db_buffer_size过小(也跟SQL的具体特性有关)
E、elapsed/cpu 太大表示执行过程中花费了大量的时间等待某种资源
F、cpu Or elapsed 太大表示执行时间过长,或消耗了了大量的CPU时间,应该考虑优化
G、执行计划中的Rows 表示在该处理阶段所访问的行数,要尽量减少
re: Oracle SQL 内置函数大全 xzc 2010-08-12 10:44  
统计字符串中 E 出现的次数:

SELECT LENGTHB(TRANSLATE('ABCDEFGEFGDBE','E'||'ABCDEFGEFGDBE','E')) FROM DUAL;
SELECT LENGTHB('ABCDEFGEFGDBE')-LENGTHB(REPLACE('ABCDEFGEFGDBE','E','')) FROM DUAL;


一、语法:
TRANSLATE(string,from_str,to_str)
二、目的
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。to_str 不能为空。Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。

三、允许使用的位置
过程性语句和SQL语句。
re: oracle压缩表表空间 xzc 2010-08-06 16:12  
--删除分区
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;
--压缩分区
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;
--增加分区
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关联 SORT表示排序 DATA表示数据
a.sid,
a.serial#,
a.username 用户名称,
a.logon_time 用户登入时间,
a.last_call_et "持续时间(秒)",
a.machine 客户端机器,
a.program 客户端工具,
a.status 用户会话状态,
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没有任何区别,也就是说,上述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  
压缩数据以节省空间和提高速度(某位帅多友情奉献的资料,好东东!)2007-03-30 15:55使用表压缩来节省空间并提高查询性能。

  很多决策支持系统通常都涉及到存储于几个特大表中的大量数据。随着这些系统的发展,对磁盘空间的需求也在快速增长。在当今的环境下,存储着数百TB(太字节)的数据仓库已经变得越来越普遍。
  
  为了帮助处理磁盘容量问题,在Oracle9i第2版中引入了表压缩特性,它可以极大地减少数据库表所需要的磁盘空间数量,并在某些情况下提高查询性能。
  
  在本文中,我将向你说明表压缩是如何工作的,以及在构建和管理数据库时如何配置表空间。我还将基于一些示例测试结构讨论一些性能问题,以帮助你了解使用表压缩预计能获得多大好处。
  
  表压缩是如何工作的
  
  在Orcle9i第2版中,表压缩特性通过删除在数据库表中发现的重复数据值来节省空间。压缩是在数据库的数据块级别上进行的。当确定一个表要被压缩后,数据库便在每一个数据库数据块中保留空间,以便储存在该数据块中的多个位置上出现的数据的单一拷贝。这一被保留的空间被称作符号表(symbol table)。被标识为要进行压缩的数据只存储在该符号表中,而不是在数据库行本身内。当在一个数据库行中出现被标识为要压缩的数据时,该行在该符号表中存储一个指向相关数据的指针,而不是数据本身。节约空间是通过删除表中数据值的冗余拷贝而实现的。
  
  对于用户或应用程序开发人员来说,表压缩的效果是透明的。无论表是否被压缩,开发人员访问表的方式都是相同的,所以当你决定压缩一个表时,不需要修改SQL查询。表压缩的设置通常由数据库管理人员或设计人员进行配置,几乎不需要开发人员或用户参与。
  
  如何创建一个压缩的表
  
  要创建一个压缩的表,可在CREATE TABLE语句中使用COMPRESS关键字。COMPRESS关键字指示Oracle数据库尽可能以压缩的格式存储该表中的行。下面是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;
  
  为了确定是否已经利用COMPRESS对一个表进行了定义,可查询USER_TABLES数据字典视图并查看COMPRESSION列,如下面的例子所示:
  
  SELECT TABLE_NAME, COMPRESSION FROM USER_TABLES;
  
  TABLE_NAME      COMPRESSION
  ------------------  -----------
  SALES_HISTORY    DISABLED
  
  SALES_HISTORY_COMP  ENABLED
  
  也可以在表空间级别上定义COMPRESS属性,既可以在生成时利用CREATE TABLESPACE来定义,也可以稍后时间利用ALTER TABLESPACE来定义。与其他存储参数类似,COMPRESS属性也具有一些继承特性。当在一个表空间中创建一个表时,它从该表空间继承COMPRESS属性。为了确定是否已经利用COMPRESS对一个表空间进行了定义,可查询USER_TABLESPACES数据字典视图并查看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属性。
  
  向一个压缩的表中加载数据
  
  请注意,当你像上面那样指定COMPRESS时,你并没在实际压缩任何数据。上面的这些命令只是修改了一个数据字典的设置。只有你向一个表中加载或插入数据时才会实际压缩数据。
  
  而且,为了确保数据被实际压缩,你需要利用一种正确的方法将数据加载或插入到表中。只有在利用以下4种方法之一批量加载或批量插入过程中才会进行数据压缩:
  
  直接路径SQL*Loader
  带有APPEND提示的串行INSERT
  并行INSERT
  CREATE TABLE ... AS SELECT
  
  如果在一个平面文件中有输入数据是可用的,那么直接路径SQL*Loader方法是将这些输入数据加载至一个表格中最方便的手段。下面给出一个示例:
  
  $sqlldr sanjay/sanjay@proddb control=sales_history.ctl direct=true
  
  如果在一个登台表中有输入数据,那么你可以使用带有APPEND提示的串行INSERT方法或者并行INSERT方法。
  
  作为一个例子,请看一个名为SALES_HISTORY的未压缩登台表中的可用输入数据。用串行INSERT方法时,你可以使用以下的语句向已压缩表中插入数据:
  
  INSERT /*+ APPEND */
  
  INTO SALES_HISTORY_COMP
  SELECT * FROM SALES_HISTORY;
  
  或者,你也可以用并行INSERT方法将数据由一个登台表转移到一个已压缩表中,如下所示:
  
  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。
  
  如果输入数据位于一个平面文件中,那么你也可以使用一个外部表,然后将这些数据插入到一个压缩表中,就像这些数据放在一个登台表中可用一样。(对外部表的讨论超出了本文的范围)。
  
  你还可以使用CREATE TABLE ... AS SELECT语句一次生成一个压缩表,并将数据插入至其中。 这里有一个例子:
  
  CREATE TABLE SALES_HISTORY_COMP
  COMPRESS
  AS SELECT * FROM SALES_HISTORY;
  
  如果你没有使用正确的加载或INSERT方法,那么即使使用COMPRESS对表格进行了定义,该表中的数据也将仍然保持未压缩状态。 例如,如果你使用惯用路径SQL*Loader或正则INSERT语句,那么数据仍然是未压缩的。
  
  什么时候使用表压缩
  
  Oracle数据库选择用来压缩表数据或不压缩表数据的方式已暗中牵涉到了最适合于表压缩的应用程序。如上所述,一个表中已被使用COMPRESS定义的数据,只有在使用直接路径模式被加载或利用添加(append)或并行模式被插入时,才会得到压缩。通过正则插入语句插入的数据将保持未压缩状态。
  
  在在线事务处理(OLTP)系统中,通常是使用正则插入模式来插入数据的。因此,使用表压缩通常不会使这些表格获得太大的好处。 表压缩对于那些只加载一次但多次读取的只读表格具有最佳效果。例如,数据仓库应用程序中所用的表格特别适合于进行表压缩。
  
  此外,在一个已压缩表中更新数据可能要求数据行为非压缩的,这样就达不到进行压缩的目的。因此,那些需要经常进行更新操作的表不适于进行表压缩。
  
  最后,让我们来看一下行删除对表压缩应用的影响。当你删除一个压缩的表中的一行时,数据库将释放该行在数据库数据块中所占据的空间。 这一自由空间可以由未来插入的数据重新使用。但是,由于以惯用模式插入的行不能被压缩,所以它不太可能适合放在一个被压缩的行所释放的空间。大量的相继的DELETE与INSERT语句可能会导致磁盘碎片,且所浪费的空间甚至会多于使用压缩所能节省的空间。
  
  压缩一个已有的未压缩表
  
  如果你有一个已有的未压缩表,那么你可以利用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锁,它可以在该语句执行过程中禁止对该表进行任何DML操作。你可以利用Oracle9i数据库的在线表重定义特性来避免这一可能出现的问题。
  
  压缩一个物化视图
  
  你可以使用用于压缩表的类似方式来压缩物化视图。下面的命令生成一个压缩的物化视图:
  
  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;
  
  基于多个表的联接生成的物化视图通常很适于压缩,因为它们通常拥有大量的重复数据项。你可以使用ALTER MATERIALIZED VIEW命令来改变一个物化视图的压缩属性。下面的命令显示了如何压缩一个已有的未压缩的物化视图。
  
  ALTER MATERIALIZED VIEW MV_SALES COMPRESS;
  
  当你使用此命令时,请注意通常是在下一次刷新该物化视图时才会进行实际的压缩。
  
  压缩一个已分区的表
  
  在对已分区的表应用压缩时,可以有很多种选择。你可以在表级别上应用压缩,也可以在分区级别上应用压缩。例如,代码清单 1中的CREATE TABLE语句创建一个具有4个分区的表。 由于是在表级别指定了COMPRESS,所以对全部4个分区都进行压缩。
  
  由于可以在分区级别上指定压缩属性,所以你可以选择压缩某些分区,而使另一些分区保持未压缩状态。代码清单 2中的示例说明了如何在分区级别上指定压缩属性。
  
  在代码清单 2中,压缩了两个表分区(SALES_Q1_03和SALES_Q2_03) ,而另外两个分区未被压缩。要注意,在分区级别上指定的压缩属性会取代对该分区在表级别上特定的压缩属性。如果未为一个分区指定压缩属性,那么该分区将继承在表级别上指定的压缩属性。在代码清单 2中,由于未对分区SALES_Q3_03和SALES_Q4_03指定压缩属性,所以这两个分区继承表级别上指定的属性值(在本例情况下为默认的NOCOMPRESS)。
  
  在通过压缩来使用已分区的表时,它可以提供一个独特的好处。对表进行分区的一个非常有用的方法是将要对其进行DML操作(插入、更新与删除)的数据放入与只读文件分开的分区内。例如,在代码清单 2的表定义中,根据SALE_DATE对销售数据进行了分区,这样可将每一季度的销售历史数据存储在一个单独的分区内。在此示例中,2003年第1、2季度的销售数据不能被修改,所以将它们置于压缩分区SALES_Q1_03 和SALES_Q2_03中。对于第3、4季度的销售数据仍可以进行修改,所以相应的分区SALES_Q3_03和SALES_Q4_03保持未压缩状态。
  
  如果在2003年第3季度末,SALES_Q3_03分区中的数据变为只读的,那么你可以利用ALTER TABLE ...MOVE PARTITION命令对此分区进行压缩,如下面的语句所示:
  
  ALTER TABLE SALES_PART_COMP
  MOVE PARTITION SALES_Q3_03 COMPRESS;
  
  要找出一个表中的哪些分区被压缩了,可以查询数据字典视图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
  
  定量地评价压缩带来的好处
  
  使用表压缩的最主要原因是要节省存储空间。压缩形式的表所占用的空间通常小于其非压缩形式所占用的空间。为了说明这一点,可考虑以下测试,其中有两个表--一个是未压缩的(SALES_HISTORY),一个是压缩的(SALES_HISTORY_COMP)。这两个表都是利用直接路径SQL*Loader由一个包含有200万行的单一平面文件加载的。在完成了对两个表的数据加载后,压缩的表所占用的空间差不多是未压缩表的一半。代码清单 3显示了分析结果。
  
  一个压缩的表可以存储在更少的数据块中,从而节省了储存空间,而使用更少的数据块也意味着性能的提高。 在一个I/O受到一定限制的环境中对一个压缩的表进行查询通常可以更快速地完成,因为他们需要阅读的数据库数据块要少得多。为了说明这一点,我对一个压缩的表和一个未压缩的表进行查询,并执行一个SQLTRACE/TKPROF分析。代码清单 4显示了该分析结果。
  
  SQLTRACE/TKPROF报告表明:我对该压缩表执行的物理和逻辑I/O操作相对于对非压缩表进行的相应查询要少得多,因而执行得也更快得多。
  
  性能开销
  
  由于表压缩是在批量加载时进行的,所以数据加载操作会因涉及附加的内务操作而需要额外的处理工作。为了衡量压缩对性能的影响,我进行了一个测试,在该测试中,我向两个相同的表中(一个压缩的表,另一个未压缩的表)加载了(利用直接路径SQL*Loader)100万行数据。表 1显示了由SQL*Loader日志文件中取出的结果,它们给出了向这两个压缩的与非压缩的表中加载数据花费了多少时间。
   
  表1:比较未压缩的表与压缩的表的加载时间
  
  加载压缩的表所需要的额外时间源自在数据加载过程中所执行的压缩操作。在实际情况下,实际时间差取决于表的设计与给定环境下的数据的布局。
  
  结论
  
  Oracle9i第2版中的表压缩特性可以节省大量的磁盘空间,尤其是对于具有大型只读表的数据库来说更是如此。如果你能记住加载和插入需要,并能确定那些适于进行压缩的表,那么你会发现,表压缩是节省磁盘空间的绝佳方式,在某些情况下还可以提高查询性能。

ref: 压缩已分区的表: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;
仅对之后特殊方式插入的数据压缩!

2, 压缩已分区表
对已分区的表(甚至带子分区)进行压缩,如果不能一步完成,那么:
分两步半完成:

alter table test compress;

select 'alter table test move subpartition '|| subpartition_name||';' from user_tab_subpartitions where table_name like 'TEST';

除表可以压缩外,分区表可以压缩,索引可以压缩,物化视图也可以压缩。语法类似。
注:除索引外,压缩属性可以继承表空间的压缩属性。表空间改成压缩的:
alter tablespace ts_test default compress;

以下5种情况可以发挥压缩特性:
  直接路径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, 不另创新表, 得到如下结果:

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特有的函数,表(视图).

rownum 行号
ADD_MONTHS 日期函数,给一个日期加一个月数,得到这个月数后的日期
to_date 日期函数, 将一个字符以一定格式转成日期
to_char 字符函数, 以一定格式得到字符
last_day 日期函数, 得到某日所在月的最后一天
MONTHS_BETWEEN 日期函数, 得到两个日期间隔的月数
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命令处理的记录条数,缺省为on
set heading off;   //输出域标题,缺省为on
set pagesize 0;   //输出每页行数,缺省为24,为了避免分页,可设定为0。
set termout off;   //显示脚本中的命令的执行结果,缺省为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
文件行数
cat DAPMmxdata004.20100421.201003.0001.771|wc -l
:|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

--删除分区
ALTER TABLE WID_SETT_TICKET_DAY_1100 DROP PARTITION P20100401;
--增加分区
ALTER TABLE WID_SETT_TICKET_DAY_1100 ADD PARTITION P20100401 VALUES (20100401) TABLESPACE ODSDATA_04 NOLOGGING;
--查找分区
select *
from USER_TAB_PARTITIONS
where table_name = 'WID_SETT_TICKET_DAY_1100'
and partition_name = 'P20100401';
re: oracle table-lock的5种模式 xzc 2010-04-02 16:05  
FUNCTION func_cre_load_partition(v_table_name varchar2,
v_acct_month varchar2,
v_partitionName varchar2,
v_lan_id number) RETURN NUMBER IS
/***************************************************************
函数名:(func_cre_partition)
功能描述:建立分区策略
输入参数说明:v_table_name 需要建分区的表名
v_acct_month 建分区的月份
v_partitionName 分区名称
v_lan_id 建分区的本地网
返回参数说明: 1 成功 -1 失败
创建人员:lizhenpeng
创建日期:2009-4-14
***************************************************************/
exists_flag int;
v_sql varchar2(2000);
i_status int := 0;
V_LOGID NUMBER(12);
v_err VARCHAR2(500);
begin
--判断分区是否存在
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));
--不存在创建对应分区
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;
--创建分区考虑是否重复创建逻辑
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
--别的进程正在建立分区,等待完成
dbms_lock.sleep(30);
elsif (i_status = 1) then
--已经等待别的进程分区创建完成
goto lab_exit;
end if;
end loop;
<<lab_exit>>
null;
--存在TRUNCATE对应分区
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 )
re: oracle sql loader全攻略 xzc 2010-03-24 16:22  
#!/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


## 导入数据
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卡接口表数据导入完成
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卡接口表数据导入完成', sysdate, 'T', 'IC卡接口表数据导入完成');
exit
EOF
echo 数据加载完成
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
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);
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);
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子句递归查询一般用于一个表维护树形结构的应用。
创建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);

插入测试数据:
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) 部门名称


通过子节点向根节点追朔.

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

通过根节点遍历子节点.

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 后面所放的字段是有关系的,它指明了查询的方向。

练习: 通过子节点获得顶节点

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程序开发人员操太多的心。然而也许也因为这样,往往会造成java程序员的过分依赖而致使开发出来的程序得不到很好的优化,或者说性能尚能提高。
问题的关键在于,不论JVM的垃圾回收机制做得多好,计算机的硬件资源是有限的。内存更是一项紧张资源。因此虽然JVM为我们完成了大部分的垃圾回收。但适当地注意编码过程中的内存管理还是很必要的。这样能让JVM回收得更顺利更高效。最大限度地提高程序的效率。

mark-1:避免在循环体内创建对象。

……

Object obj = null;//方式一

for(int i =0; i 91k(1984k),0.0027537 secs]

……

可以看到总共有1984kb的内存被回收,耗时0.0027537秒。

JVM内存相关的参数

-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(设置栈内存的大小)

例:java -XX:NewSize = 128m -XX:MaxNewSize = 128m - XX:SurvivorRatio = 8 -Xms 512m -Xmx 512m MyApplication

mark-8:不同编译方法的类大小

(1)默认编译方式:javac K.java

长度=代码+源文件信息+代码行序号表

(2)调试编译方式:javac -g K.java

长度=代码+源文件信息+代码行序号表+本地变量表

(3)代码编译方式:javax -g:none K.java

长度=代码

mark-9:经验之谈

1.尽早释放无用对象的引用(XX = null; )

2.尽量少使用finalize函数。

3.注意集合数据类型,如数组,树,图,链表等数据结构,这些数据结构对GC来说回收更复杂。

4.避免在类的默认构造器中创建大量的,初始化大量的对象。

5.避免强制系统做垃圾内存回收。

6.避免显式申请数组空间,不得不显式申请时,尽量准确估计其合理值。

共3页: 上一页 1 2 3 下一页