隨筆-314  評(píng)論-209  文章-0  trackbacks-0

          我的評(píng)論

          共3頁(yè): 上一頁(yè) 1 2 3 下一頁(yè) 
          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)聽(tīng).
          (8)導(dǎo)入注冊(cè)表
          [HKEY_LOCAL_MACHINESOFTWAREORACLE]
          "ORACLE_SID"="oracle9i"

          --下次正常啟動(dòng)----
          正常啟動(dòng).bat
          net start OracleOraDb10g_home1TNSListener
          net start OracleServiceORCL
          sqlplus / as sysdba
          startup

          正常關(guān)閉.bat
          net stop OracleServiceORCL
          net stop OracleOraDb10g_home1TNSListener





          --通過(guò)acc_nbr分組,取最新時(shí)間的記錄。
          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 文件接口說(shuō)明.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'`
          剔除重復(fù)記錄
          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
          --結(jié)果為:
          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)常會(huì)遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通過(guò)“:”分隔各個(gè)字段的。可以通過(guò)cut命令來(lái)實(shí)現(xiàn)。例如,我們希望將系統(tǒng)賬號(hào)名保存到特定的文件,就可以:
            cut -d: -f 1 /etc/passwd > /tmp/users
            -d用來(lái)定義分隔符,默認(rèn)為tab鍵,-f表示需要取得哪個(gè)字段。
            當(dāng)然也可以通過(guò)cut取得文件中每行中特定的幾個(gè)字符,例如:
            cut -c3-5 /etc/passwd
            就是輸出/etc/passwd文件中每行的第三到第五個(gè)字符。
            -c 和 -f 參數(shù)可以跟以下子參數(shù):
            N 第N個(gè)字符或字段
            N- 從第一個(gè)字符或字段到文件結(jié)束
            N-M 從第N個(gè)到第M個(gè)字符或字段
            -M 從第一個(gè)到第N個(gè)字符或字段
          #是否包含@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
          --從導(dǎo)入的網(wǎng)元中取最新的記錄[去除重復(fù)].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(不一定準(zhǔn))
          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(不一定準(zhǔn),這個(gè)可能是效果最好的)
          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行開(kāi)始查看文件
          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]
          --在服務(wù)器上執(zhí)行
          sqlplus "/as sysdba"
          SQL>alter system checkpoint;
          SQL>shutdown immediate
          SQL>startup;
          sed -e 's/[ ]*$//g' crm_201012.bad >crm_201012.txt
          re: ORACLE SQL_TRACE的使用 xzc 2010-11-13 14:32  
          補(bǔ)充點(diǎn)tkprof的使用方法

          Tkprof工具可用來(lái)格式化sql trace產(chǎn)生的文件,讓你更容易看懂trace的內(nèi)容


          用法:

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


          參數(shù)說(shuō)明:

          tracefile:你要分析的trace文件
          outputfile:格式化后的文件
          explain=user/password@connectstring
          table=schema.tablename
          注1:這兩個(gè)參數(shù)是一起使用的,通過(guò)連接數(shù)據(jù)庫(kù)對(duì)在trace文件中出現(xiàn)的每條sql語(yǔ)句查看執(zhí)行計(jì)劃,并將之輸出到outputfile中
          注2:該table必須是數(shù)據(jù)庫(kù)中不存在的,如果存在會(huì)報(bào)錯(cuò)
          print=n:只列出最初N個(gè)sql執(zhí)行語(yǔ)句
          insert=filename:會(huì)產(chǎn)生一個(gè)sql文件,運(yùn)行此文件可將收集到的數(shù)據(jù)insert到數(shù)據(jù)庫(kù)表中
          sys=no:過(guò)濾掉由sys執(zhí)行的語(yǔ)句
          record=filename:可將非嵌套執(zhí)行的sql語(yǔ)句過(guò)濾到指定的文件中去
          waits=yes|no:是否統(tǒng)計(jì)任何等待事件
          aggregate=yes|no:是否將相同sql語(yǔ)句的執(zhí)行信息合計(jì)起來(lái),默認(rèn)為yes
          sort= option:設(shè)置排序選項(xiàng),選項(xiàng)如下:
          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ù)自己的需要設(shè)置排序


          舉例:

          1.列出前2條sql語(yǔ)句的執(zhí)行情況:

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

          2.將數(shù)據(jù)保存到數(shù)據(jù)庫(kù):

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

          執(zhí)行后會(huì)在c:\產(chǎn)生insert.sql文件,執(zhí)行該文件即可將數(shù)據(jù)保存到數(shù)據(jù)庫(kù),以下為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í)行語(yǔ)句:

          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í)行計(jì)劃:

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

          在產(chǎn)生的ff.txt文件中會(huì)體現(xiàn)其執(zhí)行計(jì)劃:

          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語(yǔ)句的處理都分成以下三個(gè)部分
          Parse:這步將SQL語(yǔ)句轉(zhuǎn)換成執(zhí)行計(jì)劃,包括檢查是否有正確的授權(quán)和所需要用到的表、列以及其他引用到的對(duì)象是否存在。
          Execute:這步是真正的由Oracle來(lái)執(zhí)行語(yǔ)句。對(duì)于insert、update、delete操作,這步會(huì)修改數(shù)據(jù),對(duì)于select操作,這步就只是確定選擇的記錄。
          Fetch:返回查詢(xún)語(yǔ)句中所獲得的記錄,這步只有select語(yǔ)句會(huì)被執(zhí)行。
          COUNT:這個(gè)語(yǔ)句被parse、execute、fetch的次數(shù)。
          CPU:這個(gè)語(yǔ)句對(duì)于所有的parse、execute、fetch所消耗的cpu的時(shí)間,以秒為單位。
          ELAPSED:這個(gè)語(yǔ)句所有消耗在parse、execute、fetch的總的時(shí)間。
          DISK:從磁盤(pán)上的數(shù)據(jù)文件中物理讀取的塊的數(shù)量。一般來(lái)說(shuō)更想知道的是正在從緩存中讀取的數(shù)據(jù)而不是從磁盤(pán)上讀取的數(shù)據(jù)。
          QUERY:在一致性讀模式下,所有parse、execute、fetch所獲得的buffer的數(shù)量。一致性模式的buffer是用于給一個(gè)長(zhǎng)時(shí)間運(yùn)行的事務(wù)提供一個(gè)一致性讀的快照,緩存實(shí)際上在頭部存儲(chǔ)了狀態(tài)。
          CURRENT:在current模式下所獲得的buffer的數(shù)量。一般在current模式下執(zhí)行insert、update、delete操作都會(huì)獲取buffer。在current模式下如果在高速緩存區(qū)發(fā)現(xiàn)有新的緩存足夠給當(dāng)前的事務(wù)使用,則這些buffer都會(huì)被讀入了緩存區(qū)中。
          ROWS: 所有SQL語(yǔ)句返回的記錄數(shù)目,但是不包括子查詢(xún)中返回的記錄數(shù)目。對(duì)于select語(yǔ)句,返回記錄是在fetch這步,對(duì)于insert、update、delete操作,返回記錄則是在execute這步。

          A、query+current/rows 平均每行所需的block數(shù),太大的話(huà)(超過(guò)20)SQL語(yǔ)句效率太低
          B、Parse count/Execute count parse count應(yīng)盡量接近1,如果太高的話(huà),SQL會(huì)進(jìn)行不必要的reparse
          C、rows Fetch/Fetch Fetch Array的大小,太小的話(huà)就沒(méi)有充分利用批量Fetch的功能,增加了數(shù)據(jù)在客戶(hù)端和服務(wù)器之間的往返次數(shù)。
          D、disk/query+current 磁盤(pán)IO所占邏輯IO的比例,太大的話(huà)有可能是db_buffer_size過(guò)小(也跟SQL的具體特性有關(guān))
          E、elapsed/cpu 太大表示執(zhí)行過(guò)程中花費(fèi)了大量的時(shí)間等待某種資源
          F、cpu Or elapsed 太大表示執(zhí)行時(shí)間過(guò)長(zhǎng),或消耗了了大量的CPU時(shí)間,應(yīng)該考慮優(yōu)化
          G、執(zhí)行計(jì)劃中的Rows 表示在該處理階段所訪(fǎng)問(wèn)的行數(shù),要盡量減少
          統(tǒng)計(jì)字符串中 E 出現(xiàn)的次數(shù):

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


          一、語(yǔ)法:
          TRANSLATE(string,from_str,to_str)
          二、目的
          返回將(所有出現(xiàn)的)from_str中的每個(gè)字符替換為to_str中的相應(yīng)字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一個(gè)超集。如果 from_str 比 to_str 長(zhǎng),那么在 from_str 中而不在 to_str 中的額外字符將從 string 中被刪除,因?yàn)樗鼈儧](méi)有相應(yīng)的替換字符。to_str 不能為空。Oracle 將空字符串解釋為 NULL,并且如果TRANSLATE 中的任何參數(shù)為NULL,那么結(jié)果也是 NULL。

          三、允許使用的位置
          過(guò)程性語(yǔ)句和SQL語(yǔ)句。
          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
          -- 這里是測(cè)試語(yǔ)句
          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
          -- 這里是測(cè)試語(yǔ)句
          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
          -- 這里是測(cè)試語(yǔ)句
          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;
          --臨時(shí)表空間會(huì)話(huà)分析
          select b.tablespace 表空間,
          round(b.blocks * 8 / 1024 / 1024, 2) || 'G' "占用臨時(shí)空間",
          b.segtype 段使用類(lèi)型, --HASH表示HASH關(guān)聯(lián) SORT表示排序 DATA表示數(shù)據(jù)
          a.sid,
          a.serial#,
          a.username 用戶(hù)名稱(chēng),
          a.logon_time 用戶(hù)登入時(shí)間,
          a.last_call_et "持續(xù)時(shí)間(秒)",
          a.machine 客戶(hù)端機(jī)器,
          a.program 客戶(hù)端工具,
          a.status 用戶(hù)會(huì)話(huà)狀態(tài),
          c.sql_text 簡(jiǎn)要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;
          當(dāng)你想知道是哪條sql在占用temp表空間的時(shí)候,你可以這樣:

          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。單從結(jié)構(gòu)上來(lái)看,v$tempseg_usage和v$sort_usage沒(méi)有任何區(qū)別,也就是說(shuō),上述sql其實(shí)是可以替換成:

          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é)省空間和提高速度(某位帥多友情奉獻(xiàn)的資料,好東東!)2007-03-30 15:55使用表壓縮來(lái)節(jié)省空間并提高查詢(xún)性能。

            很多決策支持系統(tǒng)通常都涉及到存儲(chǔ)于幾個(gè)特大表中的大量數(shù)據(jù)。隨著這些系統(tǒng)的發(fā)展,對(duì)磁盤(pán)空間的需求也在快速增長(zhǎng)。在當(dāng)今的環(huán)境下,存儲(chǔ)著數(shù)百TB(太字節(jié))的數(shù)據(jù)倉(cāng)庫(kù)已經(jīng)變得越來(lái)越普遍。
            
            為了幫助處理磁盤(pán)容量問(wèn)題,在Oracle9i第2版中引入了表壓縮特性,它可以極大地減少數(shù)據(jù)庫(kù)表所需要的磁盤(pán)空間數(shù)量,并在某些情況下提高查詢(xún)性能。
            
            在本文中,我將向你說(shuō)明表壓縮是如何工作的,以及在構(gòu)建和管理數(shù)據(jù)庫(kù)時(shí)如何配置表空間。我還將基于一些示例測(cè)試結(jié)構(gòu)討論一些性能問(wèn)題,以幫助你了解使用表壓縮預(yù)計(jì)能獲得多大好處。
            
            表壓縮是如何工作的
            
            在Orcle9i第2版中,表壓縮特性通過(guò)刪除在數(shù)據(jù)庫(kù)表中發(fā)現(xiàn)的重復(fù)數(shù)據(jù)值來(lái)節(jié)省空間。壓縮是在數(shù)據(jù)庫(kù)的數(shù)據(jù)塊級(jí)別上進(jìn)行的。當(dāng)確定一個(gè)表要被壓縮后,數(shù)據(jù)庫(kù)便在每一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)塊中保留空間,以便儲(chǔ)存在該數(shù)據(jù)塊中的多個(gè)位置上出現(xiàn)的數(shù)據(jù)的單一拷貝。這一被保留的空間被稱(chēng)作符號(hào)表(symbol table)。被標(biāo)識(shí)為要進(jìn)行壓縮的數(shù)據(jù)只存儲(chǔ)在該符號(hào)表中,而不是在數(shù)據(jù)庫(kù)行本身內(nèi)。當(dāng)在一個(gè)數(shù)據(jù)庫(kù)行中出現(xiàn)被標(biāo)識(shí)為要壓縮的數(shù)據(jù)時(shí),該行在該符號(hào)表中存儲(chǔ)一個(gè)指向相關(guān)數(shù)據(jù)的指針,而不是數(shù)據(jù)本身。節(jié)約空間是通過(guò)刪除表中數(shù)據(jù)值的冗余拷貝而實(shí)現(xiàn)的。
            
            對(duì)于用戶(hù)或應(yīng)用程序開(kāi)發(fā)人員來(lái)說(shuō),表壓縮的效果是透明的。無(wú)論表是否被壓縮,開(kāi)發(fā)人員訪(fǎng)問(wèn)表的方式都是相同的,所以當(dāng)你決定壓縮一個(gè)表時(shí),不需要修改SQL查詢(xún)。表壓縮的設(shè)置通常由數(shù)據(jù)庫(kù)管理人員或設(shè)計(jì)人員進(jìn)行配置,幾乎不需要開(kāi)發(fā)人員或用戶(hù)參與。
            
            如何創(chuàng)建一個(gè)壓縮的表
            
            要?jiǎng)?chuàng)建一個(gè)壓縮的表,可在CREATE TABLE語(yǔ)句中使用COMPRESS關(guān)鍵字。COMPRESS關(guān)鍵字指示Oracle數(shù)據(jù)庫(kù)盡可能以壓縮的格式存儲(chǔ)該表中的行。下面是CREATE TABLE COMPRESS語(yǔ)句的一個(gè)實(shí)例:
            
            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語(yǔ)句來(lái)修改已有表的壓縮屬性,如下所示:
            
            ALTER TABLE SALES_HISTORY_COMP COMPRESS;
            
            為了確定是否已經(jīng)利用COMPRESS對(duì)一個(gè)表進(jìn)行了定義,可查詢(xún)USER_TABLES數(shù)據(jù)字典視圖并查看COMPRESSION列,如下面的例子所示:
            
            SELECT TABLE_NAME, COMPRESSION FROM USER_TABLES;
            
            TABLE_NAME      COMPRESSION
            ------------------  -----------
            SALES_HISTORY    DISABLED
            
            SALES_HISTORY_COMP  ENABLED
            
            也可以在表空間級(jí)別上定義COMPRESS屬性,既可以在生成時(shí)利用CREATE TABLESPACE來(lái)定義,也可以稍后時(shí)間利用ALTER TABLESPACE來(lái)定義。與其他存儲(chǔ)參數(shù)類(lèi)似,COMPRESS屬性也具有一些繼承特性。當(dāng)在一個(gè)表空間中創(chuàng)建一個(gè)表時(shí),它從該表空間繼承COMPRESS屬性。為了確定是否已經(jīng)利用COMPRESS對(duì)一個(gè)表空間進(jìn)行了定義,可查詢(xún)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
            
            正如你所預(yù)計(jì)的那樣,你可以在一個(gè)表空間直接壓縮或解壓縮一個(gè)表,而不用考慮表空間級(jí)別上的COMPRESS屬性。
            
            向一個(gè)壓縮的表中加載數(shù)據(jù)
            
            請(qǐng)注意,當(dāng)你像上面那樣指定COMPRESS時(shí),你并沒(méi)在實(shí)際壓縮任何數(shù)據(jù)。上面的這些命令只是修改了一個(gè)數(shù)據(jù)字典的設(shè)置。只有你向一個(gè)表中加載或插入數(shù)據(jù)時(shí)才會(huì)實(shí)際壓縮數(shù)據(jù)。
            
            而且,為了確保數(shù)據(jù)被實(shí)際壓縮,你需要利用一種正確的方法將數(shù)據(jù)加載或插入到表中。只有在利用以下4種方法之一批量加載或批量插入過(guò)程中才會(huì)進(jìn)行數(shù)據(jù)壓縮:
            
            直接路徑SQL*Loader
            帶有APPEND提示的串行INSERT
            并行INSERT
            CREATE TABLE ... AS SELECT
            
            如果在一個(gè)平面文件中有輸入數(shù)據(jù)是可用的,那么直接路徑SQL*Loader方法是將這些輸入數(shù)據(jù)加載至一個(gè)表格中最方便的手段。下面給出一個(gè)示例:
            
            $sqlldr sanjay/sanjay@proddb control=sales_history.ctl direct=true
            
            如果在一個(gè)登臺(tái)表中有輸入數(shù)據(jù),那么你可以使用帶有APPEND提示的串行INSERT方法或者并行INSERT方法。
            
            作為一個(gè)例子,請(qǐng)看一個(gè)名為SALES_HISTORY的未壓縮登臺(tái)表中的可用輸入數(shù)據(jù)。用串行INSERT方法時(shí),你可以使用以下的語(yǔ)句向已壓縮表中插入數(shù)據(jù):
            
            INSERT /*+ APPEND */
            
            INTO SALES_HISTORY_COMP
            SELECT * FROM SALES_HISTORY;
            
            或者,你也可以用并行INSERT方法將數(shù)據(jù)由一個(gè)登臺(tái)表轉(zhuǎn)移到一個(gè)已壓縮表中,如下所示:
            
            ALTER SESSION ENABLE PARALLEL DML;
            
            INSERT /*+PARALLEL(SALES_HISTORY_COMP,4)*/
            INTO SALES_HISTORY_COMP
            SELECT * FROM SALES_HISTORY;
            
            請(qǐng)注意,在使用并行INSERT方法時(shí),你需要首先利用ALTER SESSION ENABLE PARALLEL DML命令為會(huì)話(huà)期來(lái)啟動(dòng)并行DML。
            
            如果輸入數(shù)據(jù)位于一個(gè)平面文件中,那么你也可以使用一個(gè)外部表,然后將這些數(shù)據(jù)插入到一個(gè)壓縮表中,就像這些數(shù)據(jù)放在一個(gè)登臺(tái)表中可用一樣。(對(duì)外部表的討論超出了本文的范圍)。
            
            你還可以使用CREATE TABLE ... AS SELECT語(yǔ)句一次生成一個(gè)壓縮表,并將數(shù)據(jù)插入至其中。 這里有一個(gè)例子:
            
            CREATE TABLE SALES_HISTORY_COMP
            COMPRESS
            AS SELECT * FROM SALES_HISTORY;
            
            如果你沒(méi)有使用正確的加載或INSERT方法,那么即使使用COMPRESS對(duì)表格進(jìn)行了定義,該表中的數(shù)據(jù)也將仍然保持未壓縮狀態(tài)。 例如,如果你使用慣用路徑SQL*Loader或正則INSERT語(yǔ)句,那么數(shù)據(jù)仍然是未壓縮的。
            
            什么時(shí)候使用表壓縮
            
            Oracle數(shù)據(jù)庫(kù)選擇用來(lái)壓縮表數(shù)據(jù)或不壓縮表數(shù)據(jù)的方式已暗中牽涉到了最適合于表壓縮的應(yīng)用程序。如上所述,一個(gè)表中已被使用COMPRESS定義的數(shù)據(jù),只有在使用直接路徑模式被加載或利用添加(append)或并行模式被插入時(shí),才會(huì)得到壓縮。通過(guò)正則插入語(yǔ)句插入的數(shù)據(jù)將保持未壓縮狀態(tài)。
            
            在在線(xiàn)事務(wù)處理(OLTP)系統(tǒng)中,通常是使用正則插入模式來(lái)插入數(shù)據(jù)的。因此,使用表壓縮通常不會(huì)使這些表格獲得太大的好處。 表壓縮對(duì)于那些只加載一次但多次讀取的只讀表格具有最佳效果。例如,數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序中所用的表格特別適合于進(jìn)行表壓縮。
            
            此外,在一個(gè)已壓縮表中更新數(shù)據(jù)可能要求數(shù)據(jù)行為非壓縮的,這樣就達(dá)不到進(jìn)行壓縮的目的。因此,那些需要經(jīng)常進(jìn)行更新操作的表不適于進(jìn)行表壓縮。
            
            最后,讓我們來(lái)看一下行刪除對(duì)表壓縮應(yīng)用的影響。當(dāng)你刪除一個(gè)壓縮的表中的一行時(shí),數(shù)據(jù)庫(kù)將釋放該行在數(shù)據(jù)庫(kù)數(shù)據(jù)塊中所占據(jù)的空間。 這一自由空間可以由未來(lái)插入的數(shù)據(jù)重新使用。但是,由于以慣用模式插入的行不能被壓縮,所以它不太可能適合放在一個(gè)被壓縮的行所釋放的空間。大量的相繼的DELETE與INSERT語(yǔ)句可能會(huì)導(dǎo)致磁盤(pán)碎片,且所浪費(fèi)的空間甚至?xí)嘤谑褂脡嚎s所能節(jié)省的空間。
            
            壓縮一個(gè)已有的未壓縮表
            
            如果你有一個(gè)已有的未壓縮表,那么你可以利用ALTER... MOVE語(yǔ)句對(duì)其進(jìn)行壓縮。例如,可以利用以下方法對(duì)一個(gè)名為SALES_HISTORY_TEMP的未壓縮表進(jìn)行壓縮:
            
            ALTER TABLE SALES_HISTORY_TEMP
            MOVE COMPRESS;
            
            你也可以將ALTER TABLE ...MOVE語(yǔ)句用于解壓縮一個(gè)表,如下例所示:
            
            ALTER TABLE SALES_HISTORY_TEMP
            MOVE NOCOMPRESS;
            
            請(qǐng)注意,ALTER TABLE ...MOVE操作會(huì)獲得一個(gè)對(duì)該表操作的EXCLUSIVE鎖,它可以在該語(yǔ)句執(zhí)行過(guò)程中禁止對(duì)該表進(jìn)行任何DML操作。你可以利用Oracle9i數(shù)據(jù)庫(kù)的在線(xiàn)表重定義特性來(lái)避免這一可能出現(xiàn)的問(wèn)題。
            
            壓縮一個(gè)物化視圖
            
            你可以使用用于壓縮表的類(lèi)似方式來(lái)壓縮物化視圖。下面的命令生成一個(gè)壓縮的物化視圖:
            
            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;
            
            基于多個(gè)表的聯(lián)接生成的物化視圖通常很適于壓縮,因?yàn)樗鼈兺ǔ碛写罅康闹貜?fù)數(shù)據(jù)項(xiàng)。你可以使用ALTER MATERIALIZED VIEW命令來(lái)改變一個(gè)物化視圖的壓縮屬性。下面的命令顯示了如何壓縮一個(gè)已有的未壓縮的物化視圖。
            
            ALTER MATERIALIZED VIEW MV_SALES COMPRESS;
            
            當(dāng)你使用此命令時(shí),請(qǐng)注意通常是在下一次刷新該物化視圖時(shí)才會(huì)進(jìn)行實(shí)際的壓縮。
            
            壓縮一個(gè)已分區(qū)的表
            
            在對(duì)已分區(qū)的表應(yīng)用壓縮時(shí),可以有很多種選擇。你可以在表級(jí)別上應(yīng)用壓縮,也可以在分區(qū)級(jí)別上應(yīng)用壓縮。例如,代碼清單 1中的CREATE TABLE語(yǔ)句創(chuàng)建一個(gè)具有4個(gè)分區(qū)的表。 由于是在表級(jí)別指定了COMPRESS,所以對(duì)全部4個(gè)分區(qū)都進(jìn)行壓縮。
            
            由于可以在分區(qū)級(jí)別上指定壓縮屬性,所以你可以選擇壓縮某些分區(qū),而使另一些分區(qū)保持未壓縮狀態(tài)。代碼清單 2中的示例說(shuō)明了如何在分區(qū)級(jí)別上指定壓縮屬性。
            
            在代碼清單 2中,壓縮了兩個(gè)表分區(qū)(SALES_Q1_03和SALES_Q2_03) ,而另外兩個(gè)分區(qū)未被壓縮。要注意,在分區(qū)級(jí)別上指定的壓縮屬性會(huì)取代對(duì)該分區(qū)在表級(jí)別上特定的壓縮屬性。如果未為一個(gè)分區(qū)指定壓縮屬性,那么該分區(qū)將繼承在表級(jí)別上指定的壓縮屬性。在代碼清單 2中,由于未對(duì)分區(qū)SALES_Q3_03和SALES_Q4_03指定壓縮屬性,所以這兩個(gè)分區(qū)繼承表級(jí)別上指定的屬性值(在本例情況下為默認(rèn)的NOCOMPRESS)。
            
            在通過(guò)壓縮來(lái)使用已分區(qū)的表時(shí),它可以提供一個(gè)獨(dú)特的好處。對(duì)表進(jìn)行分區(qū)的一個(gè)非常有用的方法是將要對(duì)其進(jìn)行DML操作(插入、更新與刪除)的數(shù)據(jù)放入與只讀文件分開(kāi)的分區(qū)內(nèi)。例如,在代碼清單 2的表定義中,根據(jù)SALE_DATE對(duì)銷(xiāo)售數(shù)據(jù)進(jìn)行了分區(qū),這樣可將每一季度的銷(xiāo)售歷史數(shù)據(jù)存儲(chǔ)在一個(gè)單獨(dú)的分區(qū)內(nèi)。在此示例中,2003年第1、2季度的銷(xiāo)售數(shù)據(jù)不能被修改,所以將它們置于壓縮分區(qū)SALES_Q1_03 和SALES_Q2_03中。對(duì)于第3、4季度的銷(xiāo)售數(shù)據(jù)仍可以進(jìn)行修改,所以相應(yīng)的分區(qū)SALES_Q3_03和SALES_Q4_03保持未壓縮狀態(tài)。
            
            如果在2003年第3季度末,SALES_Q3_03分區(qū)中的數(shù)據(jù)變?yōu)橹蛔x的,那么你可以利用ALTER TABLE ...MOVE PARTITION命令對(duì)此分區(qū)進(jìn)行壓縮,如下面的語(yǔ)句所示:
            
            ALTER TABLE SALES_PART_COMP
            MOVE PARTITION SALES_Q3_03 COMPRESS;
            
            要找出一個(gè)表中的哪些分區(qū)被壓縮了,可以查詢(xún)數(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
            
            定量地評(píng)價(jià)壓縮帶來(lái)的好處
            
            使用表壓縮的最主要原因是要節(jié)省存儲(chǔ)空間。壓縮形式的表所占用的空間通常小于其非壓縮形式所占用的空間。為了說(shuō)明這一點(diǎn),可考慮以下測(cè)試,其中有兩個(gè)表--一個(gè)是未壓縮的(SALES_HISTORY),一個(gè)是壓縮的(SALES_HISTORY_COMP)。這兩個(gè)表都是利用直接路徑SQL*Loader由一個(gè)包含有200萬(wàn)行的單一平面文件加載的。在完成了對(duì)兩個(gè)表的數(shù)據(jù)加載后,壓縮的表所占用的空間差不多是未壓縮表的一半。代碼清單 3顯示了分析結(jié)果。
            
            一個(gè)壓縮的表可以存儲(chǔ)在更少的數(shù)據(jù)塊中,從而節(jié)省了儲(chǔ)存空間,而使用更少的數(shù)據(jù)塊也意味著性能的提高。 在一個(gè)I/O受到一定限制的環(huán)境中對(duì)一個(gè)壓縮的表進(jìn)行查詢(xún)通常可以更快速地完成,因?yàn)樗麄冃枰喿x的數(shù)據(jù)庫(kù)數(shù)據(jù)塊要少得多。為了說(shuō)明這一點(diǎn),我對(duì)一個(gè)壓縮的表和一個(gè)未壓縮的表進(jìn)行查詢(xún),并執(zhí)行一個(gè)SQLTRACE/TKPROF分析。代碼清單 4顯示了該分析結(jié)果。
            
            SQLTRACE/TKPROF報(bào)告表明:我對(duì)該壓縮表執(zhí)行的物理和邏輯I/O操作相對(duì)于對(duì)非壓縮表進(jìn)行的相應(yīng)查詢(xún)要少得多,因而執(zhí)行得也更快得多。
            
            性能開(kāi)銷(xiāo)
            
            由于表壓縮是在批量加載時(shí)進(jìn)行的,所以數(shù)據(jù)加載操作會(huì)因涉及附加的內(nèi)務(wù)操作而需要額外的處理工作。為了衡量壓縮對(duì)性能的影響,我進(jìn)行了一個(gè)測(cè)試,在該測(cè)試中,我向兩個(gè)相同的表中(一個(gè)壓縮的表,另一個(gè)未壓縮的表)加載了(利用直接路徑SQL*Loader)100萬(wàn)行數(shù)據(jù)。表 1顯示了由SQL*Loader日志文件中取出的結(jié)果,它們給出了向這兩個(gè)壓縮的與非壓縮的表中加載數(shù)據(jù)花費(fèi)了多少時(shí)間。
             
            表1:比較未壓縮的表與壓縮的表的加載時(shí)間
            
            加載壓縮的表所需要的額外時(shí)間源自在數(shù)據(jù)加載過(guò)程中所執(zhí)行的壓縮操作。在實(shí)際情況下,實(shí)際時(shí)間差取決于表的設(shè)計(jì)與給定環(huán)境下的數(shù)據(jù)的布局。
            
            結(jié)論
            
            Oracle9i第2版中的表壓縮特性可以節(jié)省大量的磁盤(pán)空間,尤其是對(duì)于具有大型只讀表的數(shù)據(jù)庫(kù)來(lái)說(shuō)更是如此。如果你能記住加載和插入需要,并能確定那些適于進(jìn)行壓縮的表,那么你會(huì)發(fā)現(xiàn),表壓縮是節(jié)省磁盤(pán)空間的絕佳方式,在某些情況下還可以提高查詢(xún)性能。

          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, 壓縮一個(gè)已存在的表空間:
          alter tablespace users default compress;
          僅對(duì)之后特殊方式插入的數(shù)據(jù)壓縮!

          2, 壓縮已分區(qū)表
          對(duì)已分區(qū)的表(甚至帶子分區(qū))進(jìn)行壓縮,如果不能一步完成,那么:
          分兩步半完成:

          alter table test compress;

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

          除表可以壓縮外,分區(qū)表可以壓縮,索引可以壓縮,物化視圖也可以壓縮。語(yǔ)法類(lèi)似。
          注:除索引外,壓縮屬性可以繼承表空間的壓縮屬性。表空間改成壓縮的:
          alter tablespace ts_test default compress;

          以下5種情況可以發(fā)揮壓縮特性:
            直接路徑SQL*Loader
            帶有APPEND提示的串行INSERT
            并行INSERT
            CREATE TABLE ... AS SELECT
            alter table move

          壓縮可以大幅度減少空間占用(可壓縮60%以上),從而減少I(mǎi)O量,提高性能。

          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個(gè)值[2008,12,2009,2], 要求一段SQL, 不另創(chuàng)新表, 得到如下結(jié)果:

          12 2008-12-1 2008-12-31
          01 2009-1-1 2009-1-31
          02 2009-2-1 2009-2-28

          條件: 起始年, 起始月, 截至年, 截至月
          結(jié)果: 月份, 月的第一天, 月的最后一天
          解答:
          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
          分析: 這個(gè)題目比較難, 因?yàn)榭疾炝撕芏嗟腛racle特有的函數(shù),表(視圖).

          rownum 行號(hào)
          ADD_MONTHS 日期函數(shù),給一個(gè)日期加一個(gè)月數(shù),得到這個(gè)月數(shù)后的日期
          to_date 日期函數(shù), 將一個(gè)字符以一定格式轉(zhuǎn)成日期
          to_char 字符函數(shù), 以一定格式得到字符
          last_day 日期函數(shù), 得到某日所在月的最后一天
          MONTHS_BETWEEN 日期函數(shù), 得到兩個(gè)日期間隔的月數(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常用的設(shè)置
          set colsep' ';    //域輸出分隔符
          set echo off;    //顯示start啟動(dòng)的腳本中的每個(gè)sql命令,缺省為on
          set feedback off;  //回顯本次sql命令處理的記錄條數(shù),缺省為on
          set heading off;   //輸出域標(biāo)題,缺省為on
          set pagesize 0;   //輸出每頁(yè)行數(shù),缺省為24,為了避免分頁(yè),可設(shè)定為0。
          set termout off;   //顯示腳本中的命令的執(zhí)行結(jié)果,缺省為on
          set trimout on;   //去除標(biāo)準(zhǔn)輸出每行的拖尾空格,缺省為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)))
          也就是說(shuō):|的輸出是空字符串,而其作用正好與/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ù)說(shuō)明:v_table_name 需要建分區(qū)的表名
          v_acct_month 建分區(qū)的月份
          v_partitionName 分區(qū)名稱(chēng)
          v_lan_id 建分區(qū)的本地網(wǎng)
          返回參數(shù)說(shuō)明: 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)建對(duì)應(yīng)分區(qū)
          if exists_flag = 0 then
          loop
          v_sql := 'LOCK TABLE OTH_PARTITION_CTL IN EXCLUSIVE MODE';
          execute immediate v_sql;
          --判斷是否鎖定 0未開(kāi)始 2 進(jìn)行 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ū)考慮是否重復(fù)創(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;
          --修改完成標(biāo)志
          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
          --別的進(jìn)程正在建立分區(qū),等待完成
          dbms_lock.sleep(30);
          elsif (i_status = 1) then
          --已經(jīng)等待別的進(jìn)程分區(qū)創(chuàng)建完成
          goto lab_exit;
          end if;
          end loop;
          <<lab_exit>>
          null;
          --存在TRUNCATE對(duì)應(yīng)分區(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


          ## 導(dǎo)入數(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ù)導(dǎo)入完成
          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ù)導(dǎo)入完成', sysdate, 'T', 'IC卡接口表數(shù)據(jù)導(dǎo)入完成');
          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子句遞歸查詢(xún)一般用于一個(gè)表維護(hù)樹(shù)形結(jié)構(gòu)的應(yīng)用。
          創(chuàng)建示例表:
          CREATE TABLE TBL_TEST
          (
          ID NUMBER,
          NAME VARCHAR2(100 BYTE),
          PID NUMBER DEFAULT 0
          );

          插入測(cè)試數(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往樹(shù)末梢遞歸
          select * from TBL_TEST
          start with id=1
          connect by prior id = pid

          從末梢往樹(shù)ROOT遞歸
          select * from TBL_TEST
          start with id=5
          connect by prior pid = id
          =====
          對(duì)于oracle進(jìn)行簡(jiǎn)單樹(shù)查詢(xún)(遞歸查詢(xún))

          DEPTID PAREDEPTID NAME
          NUMBER NUMBER CHAR (40 Byte)
          部門(mén)id 父部門(mén)id(所屬部門(mén)id) 部門(mén)名稱(chēng)


          通過(guò)子節(jié)點(diǎn)向根節(jié)點(diǎn)追朔.

          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

          通過(guò)根節(jié)點(diǎn)遍歷子節(jié)點(diǎn).

          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

          可通過(guò)level 關(guān)鍵字查詢(xún)所在層次.

          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

          再次復(fù)習(xí)一下:start with ...connect by 的用法, start with 后面所跟的就是就是遞歸的種子。

          遞歸的種子也就是遞歸開(kāi)始的地方 connect by 后面的"prior" 如果缺省:則只能查詢(xún)到符合條件的起始行,并不進(jìn)行遞歸查詢(xún);

          connect by prior 后面所放的字段是有關(guān)系的,它指明了查詢(xún)的方向。

          練習(xí): 通過(guò)子節(jié)點(diǎn)獲得頂節(jié)點(diǎn)

          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

          ====這種方法只是當(dāng)表里就有一顆樹(shù),多棵樹(shù)怎么辦?


          聲明:JavaEye文章版權(quán)屬于作者,受法律保護(hù)。沒(méi)有作者書(shū)面許可不得轉(zhuǎn)載。
          re: java命令詳解 xzc 2009-12-04 17:25  
          眾所周知,java的JVM有一套自己的垃圾回收機(jī)制。因此在許多情況下并不需要java程序開(kāi)發(fā)人員操太多的心。然而也許也因?yàn)檫@樣,往往會(huì)造成java程序員的過(guò)分依賴(lài)而致使開(kāi)發(fā)出來(lái)的程序得不到很好的優(yōu)化,或者說(shuō)性能尚能提高。
          問(wèn)題的關(guān)鍵在于,不論JVM的垃圾回收機(jī)制做得多好,計(jì)算機(jī)的硬件資源是有限的。內(nèi)存更是一項(xiàng)緊張資源。因此雖然JVM為我們完成了大部分的垃圾回收。但適當(dāng)?shù)刈⒁饩幋a過(guò)程中的內(nèi)存管理還是很必要的。這樣能讓JVM回收得更順利更高效。最大限度地提高程序的效率。

          mark-1:避免在循環(huán)體內(nèi)創(chuàng)建對(duì)象。

          ……

          Object obj = null;//方式一

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

          ……

          可以看到總共有1984kb的內(nèi)存被回收,耗時(shí)0.0027537秒。

          JVM內(nèi)存相關(guān)的參數(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(設(shè)置棧內(nèi)存的大小)

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

          mark-8:不同編譯方法的類(lèi)大小

          (1)默認(rèn)編譯方式:javac K.java

          長(zhǎng)度=代碼+源文件信息+代碼行序號(hào)表

          (2)調(diào)試編譯方式:javac -g K.java

          長(zhǎng)度=代碼+源文件信息+代碼行序號(hào)表+本地變量表

          (3)代碼編譯方式:javax -g:none K.java

          長(zhǎng)度=代碼

          mark-9:經(jīng)驗(yàn)之談

          1.盡早釋放無(wú)用對(duì)象的引用(XX = null; )

          2.盡量少使用finalize函數(shù)。

          3.注意集合數(shù)據(jù)類(lèi)型,如數(shù)組,樹(shù),圖,鏈表等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)對(duì)GC來(lái)說(shuō)回收更復(fù)雜。

          4.避免在類(lèi)的默認(rèn)構(gòu)造器中創(chuàng)建大量的,初始化大量的對(duì)象。

          5.避免強(qiáng)制系統(tǒng)做垃圾內(nèi)存回收。

          6.避免顯式申請(qǐng)數(shù)組空間,不得不顯式申請(qǐng)時(shí),盡量準(zhǔn)確估計(jì)其合理值。

          共3頁(yè): 上一頁(yè) 1 2 3 下一頁(yè) 
          主站蜘蛛池模板: 日喀则市| 湘阴县| 临汾市| 同德县| 迁西县| 吴旗县| 枝江市| 龙陵县| 汶上县| 陇南市| 威海市| 宁南县| 西丰县| 利川市| 县级市| 革吉县| 通渭县| 彰化县| 温宿县| 玛沁县| 榕江县| 花垣县| 西平县| 溧阳市| 长葛市| 锡林浩特市| 涪陵区| 文登市| 卢湾区| 司法| 沐川县| 泰来县| 岳普湖县| 新田县| 锡林郭勒盟| 芒康县| 承德市| 五华县| 迭部县| 石楼县| 嘉兴市|