<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 重建一下監(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





    --通過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行。
    我們經(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
    --從導入的網(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
    re: ORACLE SQL_TRACE的使用 xzc 2010-11-13 14:32  
    補充點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'
    re: ORACLE SQL_TRACE的使用 xzc 2010-11-13 14:31  
    如何讀懂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ù)
    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
    文件行數(shù)
    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

    --刪除分區(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';
    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
    /***************************************************************
    函數(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 )
    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


    ## 導入數(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ù)加載完成
    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子句遞歸查詢一般用于一個表維護樹形結構的應用。
    創(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ù)組空間,不得不顯式申請時,盡量準確估計其合理值。

    共3頁: 上一頁 1 2 3 下一頁 
    主站蜘蛛池模板: 18禁黄网站禁片免费观看不卡| 国产精品久久永久免费| 中文字幕永久免费| 久久精品一本到99热免费| 日本免费电影一区| 日韩亚洲人成在线综合日本| 亚洲人xxx日本人18| 美女视频免费看一区二区| 国产午夜无码精品免费看动漫| 最近最好的中文字幕2019免费| 亚洲熟妇无码八AV在线播放 | 国产精品亚洲不卡一区二区三区| 久久亚洲AV无码精品色午夜麻豆 | 亚洲香蕉免费有线视频| 91亚洲性爱在线视频| 一级毛片大全免费播放下载| 亚欧免费视频一区二区三区| 亚洲精品亚洲人成在线观看| 色屁屁www影院免费观看视频 | 国产成人精品日本亚洲专区 | 两个人看的www免费| 免费va人成视频网站全| 亚洲婷婷天堂在线综合| 99在线观看免费视频| 国产亚洲精品久久久久秋霞| 偷自拍亚洲视频在线观看99| 好大好硬好爽免费视频| 亚洲一区二区三区高清视频| 99精品视频在线观看免费播放| 亚洲一级黄色大片| 免费人成视频在线观看视频 | 国产免费一级高清淫曰本片| 亚洲AV之男人的天堂| 亚洲夂夂婷婷色拍WW47| 国内精自视频品线六区免费 | 国产日韩AV免费无码一区二区 | 永久黄网站色视频免费| 亚洲中文字幕无码久久| 亚洲人成网站色在线入口| 羞羞漫画小舞被黄漫免费| 亚洲AV综合色区无码一区|