• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tbwshc

            tbw

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

            為了檢驗我開發的Oracle數據庫在線備份系統,我根據“Oracle數據庫在線備份系統”產生的備份文件來重建和恢復Oracle數據庫。為了讓大家共享其方法和tb步驟(也適合于用其它方式對Oracle做的熱備份進行重建數據庫)現整理如下。

            一、系統環境

            本次測試所使用的系統環境如下:

            1. 硬件環境

            服務器:Dell PowerEdge 1300 (CPUP 550MHz 內存:128MB 硬盤:36GB)

            2. 軟件環境

            操作系統:UnixWare 7.1

            數據庫: Oracle 8.1.6 for Unix 企業版,SIDora816

            Oracle安裝路徑:/home/oracle

            備份文件:所有數據庫文件、控制文件、初始化文件、數據庫備份以來的所有歸檔日志文件。

            二、恢復步驟

            下面根據從用戶處帶回來的備份數據,在一臺新的服務器重建Oracle數據庫。其詳細步驟如下:

            1. 創建數據庫恢復使用的環境

            在新的Dell服務器上,安裝與原來的數據庫服務器相同的操作系統UnixWare 7.1;然后安裝與原數據庫相同版本的Oracle 8.1.6 for Unix 企業版。

            2. 刪除新服務器上的Oracle實例

            啟動新數據庫服務器上的Oracle,在sqlplus中,查找到數據庫文件的路徑,并保存在當前路徑下的文件file_name.txt中:

            $ sqlplus system/manager

            SQL> spool file_name.txt

            SQL> select file_name from sys.dba_data_files;

            SQL> spool end

            SQL>exit

            關閉新服務器的Oracle,然后根據文件file_name.txt中的路徑,刪除新裝的Oracle實例的所有數據庫文件。

            從本步開始所有操作都是用Oracle用戶登錄操作系統(Unix)后進行。文中所有的黑色粗體5號字符(標題除外)的語句可以直接執行,黑色傾斜粗體5號字符的語句需要修改后執行。

            3. 恢復數據庫文件

            把備份的所有數據庫文件用Ftp上傳新的數據庫服務器中的相同路徑下。如果原來的路徑已不存在,可以拷貝到其他路徑下,恢復時詳細處理方法見步驟7<2>

            4. 恢復初始化參數文件

            把備份的initSID.ora文件用Ftbp上傳到新數據庫服務器中Oracle實例的initSID.ora文件位置,覆蓋之。其位置一般在$ORACLE_HOME/dbs目錄下。

            5. 恢復控制文件

            把備份的ControlFile.bak文件用Ftp上傳到新數據庫服務器中Oracle實例的各個鏡像路徑下,并按初始化參數文件initSID.ora中的該項的位置和名稱命名。

            control_files = ("/home/oracle/app/oracle/oradata/ora816/control01.ctl", "/home/oracle/app/oracle/oradata/ora816/control02.ctl","/home/oracle/app/oracle/oradata/ora816/control03.ctl")

            其路徑如有變動,在初始化參數文件initSID.ora中修改如上內容的路徑和名稱,使其實際路徑與該參數的路徑一致。

            6. 恢復歸檔日志文件

            把數據庫備份后的歸檔日志用Ftp上傳到新數據庫服務器的相同路徑下。路徑如有變動可以根據初始化參數文件initSID.ora中如下位置進行修改,使其實際路徑與該參數的路徑一致。

            log_archive_dest_1 = "location=/home/oracle/app/oracle/admin/ora816/arch"

            7. 恢復數據庫

            經過以上6個步驟,把所有的備份文件已經上傳到了新數據庫服務器中。下面開始根據這些文件恢復并啟動數據庫,先在操作系統的提示符下做如下操作:

            $svrmgrl

            SVRMGR>connect internal

            SVRMGR>startup mount

            <1> 創建口令文件

            如果原來的數據庫配置了口令文件,并且在mount數據庫時報如下錯誤:

            ORA-01990: error opening password file '/home/oracle/app/oracle/product/8.1.6/dbs/orapw'

            可以到/home/oracle/app/oracle/product/8.1.6/dbs/路徑下,用以下命令創建口令文件:

            orapwd

            其用法如下:

            Usage: orapwd file=<fname> password=<password> entries=<users>

            where

            file - name of password file (mand),(口令文件的命名方式為:orapwSID

            password - password for SYS and INTERNAL (mand),

            entries - maximum number of distinct DBA and OPERs (opt),

            There are no spaces around the equal-to (=) character.

            例如: orapwd file=orapwora816 password=manager

            然后重新執行如下語句mount數據庫:

            SVRMGR>startup mount

            <2> 修改數據庫文件的路徑

            如果在上述的步驟3中修改了恢復的數據庫文件的路徑,可以用如下語句對數據庫文件重新命名

            alter database rename file 'old_file' to 'new_file';

            如把原來路徑/home/oracle/app/oracle/oradata/ora816下的文件system01.dbf改到了/u21/oracle/app/oracle/oradata/ora816下:

            SVRMGR>alter database rename file

            '/home/oracle/app/oracle/oradata/ora816/system01.dbf'

            to '/u21/oracle/app/oracle/oradata/ora816/system01.dbf';

            按照上面的方法把所有修改路徑的數據庫文件重新命名。

            <3> 根據控制文件和歸檔日志文件恢復數據庫

            下面開始用控制文件和歸檔日志文件恢復數據庫:

            SVRMGR>recover database using backup controlfile until cancel;

            出現如下提示:

            ORA-00279: change 50971 generated at 08/23/2002 09:21:27 needed for thread 1

            ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc

            ORA-00280: change 50971 for thread 1 is in sequence #399

            Specify log: {<RET>=suggested | filename | AUTO | CANCEL}輸入:

            auto

            如果有如下提示,則表示成功。

            ORA-00279: change 51007 generated at 08/23/2002 11:23:13 needed for thread 1

            ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc

            ORA-00280: change 51007 for thread 1 is in sequence #400

            ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc' noy

            Log applied.

            意外處理:如果其它提示可能是需要的日志文件不存在,檢查ORA-00289中該文件是否存在。

            直到出現如下提示:

            ORA-00279: change 51011 generated at 08/23/2002 11:23:45 needed for thread 1

            ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_401.arc

            ORA-00280: change 51011 for thread 1 is in sequence #401

            ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc' noy

            ORA-00308: cannot open archived log '/home/oracle/app/oracle/admin/ora8/arch

            /arch_1_401.arc'

            ORA-27037: unable to obtain file status

            Intel SVR4 UNIX Error: 2: No such file or directory

            Additional information: 3

            <4> 重置日志

            SVRMGR>alter database open resetlogs;

            意外處理:如果提示創建日志的路徑不存在,按提示路徑創建目錄。然后再重置日志。

            <5> 重啟數據庫,完成恢復

            SVRMGR>shutdown immediate

            SVRMGR>startup

            ORACLE instance started.

            Total System Global Area 123437040 bytes

            Fixed Size 69616 bytes

            Variable Size 106418176 bytes

            Database Buffers 16777216 bytes

            Redo Buffers 172032 bytes

            Database mounted.

            Database opened.

            數據庫正常打開,數據庫重建恢復成功。

            posted @ 2012-07-07 13:21 tbwshc 閱讀(907) | 評論 (0)編輯 收藏

            六、子查詢的用法

            子查詢是一個 SELECT 查詢,它嵌套在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中。

            任何允許使用表達式的地方都可以使用子查詢,子查詢可以使我們的編程靈活多樣,可以用來實現一些特殊的功能。但是在性能上,

            往往一個不合適的子查詢用法會形成一個性能瓶頸。如果子查詢的條件中使用了其外層的表的字段,這種子查詢就叫作相關子查詢。

            相關子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 關于相關子查詢,應該注意:

            (1)

            A、NOT IN、NOT EXISTS的相關子查詢可以改用LEFT JOIN代替寫法。

            比如: SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS') 可以改寫成: SELECT A.PUB_NAME FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL

            (2)

            1. SELECT TITLE FROM TITLES  
            2. WHERE NOT EXISTS  
            3. (SELECT TITLE_ID FROM SALES  
            4. WHERE TITLE_ID = TITLES.TITLE_ID) 

            可以改寫成:

            1. SELECT TITLE  
            2. FROM TITLES LEFT JOIN SALES  
            3. ON SALES.TITLE_ID = TITLES.TITLE_ID  
            4. WHERE SALES.TITLE_ID IS NULL 

            B、 如果保證子查詢沒有重復 ,IN、EXISTS的相關子查詢可以用INNER JOIN 代替。比如:

            1. SELECT PUB_NAME  
            2. FROM PUBLISHERS  
            3. WHERE PUB_ID IN 
            4. (SELECT PUB_ID  
            5. FROM TITLES  
            6. WHERE TYPE = 'BUSINESS'

            可以改寫成:

            1. SELECT A.PUB_NAME --SELECT DISTINCT A.PUB_NAME  
            2. FROM PUBLISHERS A INNER JOIN TITLES B  
            3. ON B.TYPE = 'BUSINESS' AND 
            4. A.PUB_ID=B. PUB_ID 

            (3)

            C、 IN的相關子查詢用EXISTS代替,比如

            1. SELECT PUB_NAME FROM PUBLISHERS  
            2. WHERE PUB_ID IN 
            3. (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS'

            可以用下面語句代替:

            1. SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS  
            2. (SELECT 1 FROM TITLES WHERE TYPE = 'BUSINESS' AND 
            3. PUB_ID= PUBLISHERS.PUB_ID) 

            D、不要用COUNT(*)的子查詢判斷是否存在記錄,最好用LEFT JOIN或者EXISTS,比如有人寫這樣的語句:

            1. SELECT JOB_DESC FROM JOBS  
            2. WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0 

            應該改成:

            1. SELECT JOBS.JOB_DESC FROM JOBS LEFT JOIN EMPLOYEE  
            2. ON EMPLOYEE.JOB_ID=JOBS.JOB_ID  
            3. WHERE EMPLOYEE.EMP_ID IS NULL 
            4. SELECT JOB_DESC FROM JOBS  
            5. WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)<>0 

            應該改成:

            1. SELECT JOB_DESC FROM JOBS  
            2. WHERE EXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID) 


            七:盡量使用索引

            建立索引后,并不是每個查詢都會使用索引,在使用索引的情況下,索引的使用效率也會有很大的差別。只要我們在查詢語句中沒有強制指定索引,

            索引的選擇和使用方法是SQLSERVER的優化器自動作的選擇,而它選擇的根據是查詢語句的條件以及相關表的統計信息,這就要求我們在寫SQL

            語句的時候盡量使得優化器可以使用索引。為了使得優化器能高效使用索引,寫語句的時候應該注意:

            A、不要對索引字段進行運算,而要想辦法做變換,比如

            SELECT ID FROM T WHERE NUM/2=100

            應改為:

            SELECT ID FROM T WHERE NUM=100*2

            -------------------------------------------------------

            SELECT ID FROM T WHERE NUM/2=NUM1

            如果NUM有索引應改為:

            SELECT ID FROM T WHERE NUM=NUM1*2

            如果NUM1有索引則不應該改。

            --------------------------------------------------------------------

            發現過這樣的語句:

            SELECT 年,月,金額 FROM 結余表 WHERE 100*年+月=2010*100+10

            應該改為:

            SELECT 年,月,金額 FROM 結余表 WHERE 年=2010 AND月=10

            B、 不要對索引字段進行格式轉換

            日期字段的例子:

            WHERE CONVERT(VARCHAR(10), 日期字段,120)='2010-07-15'

            應該改為

            WHERE日期字段〉='2010-07-15' AND 日期字段<'2010-07-16'

            ISNULL轉換的例子:

            WHERE ISNULL(字段,'')<>''應改為:WHERE字段<>''

            WHERE ISNULL(字段,'')=''不應修改

            WHERE ISNULL(字段,'F') ='T'應改為: WHERE字段='T'

            WHERE ISNULL(字段,'F')<>'T'不應修改

            C、 不要對索引字段使用函數

            WHERE LEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC'

            應改為: WHERE NAME LIKE 'ABC%'

            日期查詢的例子:

            WHERE DATEDIFF(DAY, 日期,'2010-06-30')=0

            應改為:WHERE 日期>='2010-06-30' AND 日期 <'2010-07-01'

            WHERE DATEDIFF(DAY, 日期,'2010-06-30')>0

            應改為:WHERE 日期 <'2010-06-30'

            WHERE DATEDIFF(DAY, 日期,'2010-06-30')>=0

            應改為:WHERE 日期 <'2010-07-01'

            WHERE DATEDIFF(DAY, 日期,'2010-06-30')<0

            應改為:WHERE 日期>='2010-07-01'

            WHERE DATEDIFF(DAY, 日期,'2010-06-30')<=0

            應改為:WHERE 日期>='2010-06-30'

            D、不要對索引字段進行多字段連接

            比如:

            WHERE FAME+ '. '+LNAME='HAIWEI.YANG'

            應改為:

            WHERE FNAME='HAIWEI' AND LNAME='YANG'

            八:多表連接的連接條件對索引的選擇有著重要的意義,所以我們在寫連接條件條件的時候需要特別注意。

            A、多表連接的時候,連接條件必須寫全,寧可重復,不要缺漏。

            B、連接條件盡量使用聚集索引

            C、注意ON、WHERE和HAVING部分條件的區別

            ON是最先執行, WHERE次之,HAVING最后,因為ON是先把不符合條件的記錄過濾后才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,WHERE也應該比 HAVING快點的,因為它過濾數據后才進行SUM,在兩個表聯接時才用ON的,所以在一個表的時候,就剩下WHERE跟HAVING比較了

            1考慮聯接優先順序:

            2INNER JOIN

            3LEFT JOIN (注:RIGHT JOIN 用 LEFT JOIN 替代)

            4CROSS JOIN

            其它注意和了解的地方有:

            A、在IN后面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最后面,減少判斷的次數

            B、注意UNION和UNION ALL的區別。--允許重復數據用UNION ALL好

            C、注意使用DISTINCT,在沒有必要時不要用

            D、TRUNCATE TABLE 與 DELETE 區別

            E、減少訪問數據庫的次數

            還有就是我們寫存儲過程,如果比較長的話,最后用標記符標開,因為這樣可讀性很好,即使語句寫的不怎么樣但是語句工整,C# 有region

            sql我比較喜歡用的就是

            1. --startof 查詢在職人數  
            2.           sql語句  
            3. --end of 

            正式機器上我們一般不能隨便調試程序,但是很多時候程序在我們本機上沒問題,但是進正式系統就有問題,但是我們又不能隨便在正式機器上操作,那么怎么辦呢?我們可以用回滾來調試我們的存儲過程或者是sql語句,從而排錯。

            1. BEGIN TRAN  
            2.    UPDATE a SET 字段='' 
            3. ROLLBACK 

            作業存儲過程我一般會加上下面這段,這樣檢查錯誤可以放在存儲過程,如果執行錯誤回滾操作,但是如果程序里面已經有了事務回滾,那么存儲過程就不要寫事務了,這樣會導致事務回滾嵌套降低執行效率,但是我們很多時候可以把檢查放在存儲過程里,這樣有利于我們解讀這個存儲過程,和排錯。

            1. BEGIN TRANSACTION 
            2. --事務回滾開始  
            3. --檢查報錯  
            4. IF ( @@ERROR > 0 )  
            5.         BEGIN 
            6.         --回滾操作  
            7.                 ROLLBACK TRANSACTION 
            8.                 RAISERROR('刪除工作報告錯誤', 16, 3)  
            9.                 RETURN 
            10.         END 
            11. --結束事務  
            12. COMMIT TRANSACTION 

            好久沒有寫博文了,工作項目一個接一個,再加上公司人員流動,新人很多事情接不下來,加班成了家常便飯,倉促寫下這些希望對大家有幫助,不對的也歡迎指點,交流互相提高。

            有錯誤的地方歡迎大家拍磚,希望交流和共享。

             

            posted @ 2012-07-01 12:17 tbwshc 閱讀(993) | 評論 (0)編輯 收藏

            三、只返回需要的數據

            返回數據到客戶端至少需要數據庫提取數據、網絡傳輸數據、客戶端接收數據以及客戶端處理數據等環節,如果返回不需要的數據,就會增加服務器、網絡和客戶端的無效勞動,其害處是顯而易見的,避免這類事件需要注意:

            A、橫向來看,

            (1)不要寫SELECT *的語句,而是選擇你需要的字段。

            (2)當在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤。

            1. 如有表table1(ID,col1)和table2 (ID,col2)  
            2. Select A.ID, A.col1, B.col2  
            3. -- Select A.ID, col1, col2 –不要這么寫,不利于將來程序擴展  
            4. from table1 A inner join table2 B on A.ID=B.ID Where … 

            B、縱向來看,

            (1)合理寫WHERE子句,不要寫沒有WHERE的SQL語句。

            (2) SELECT TOP N * --沒有WHERE條件的用此替代


            四 :盡量少做重復的工作

            A、控制同一語句的多次執行,特別是一些基礎數據的多次執行是很多程序員很少注意的。

            B、減少多次的數據轉換,也許需要數據轉換是設計的問題,但是減少次數是程序員可以做到的。

            C、杜絕不必要的子查詢和連接表,子查詢在執行計劃一般解釋成外連接,多余的連接表帶來額外的開銷。

            D、合并對同一表同一條件的多次UPDATE,比如

            1. UPDATE EMPLOYEE SET FNAME='HAIWER' 
            2. WHERE EMP_ID=' VPA30890F' UPDATE EMPLOYEE SET LNAME='YANG' 
            3. WHERE EMP_ID=' VPA30890F' 

            這兩個語句應該合并成以下一個語句

            UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG' WHERE EMP_ID=' VPA30890F'

            E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,雖然功能相同,但是性能差別是很大的。

             

            五、注意臨時表和表變量的用法

            在復雜系統中,臨時表和表變量很難避免,關于臨時表和表變量的用法,需要注意:

            A、如果語句很復雜,連接太多,可以考慮用臨時表和表變量分步完成。

            B、如果需要多次用到一個大表的同一部分數據,考慮用臨時表和表變量暫存這部分數據。

            C、如果需要綜合多個表的數據,形成一個結果,可以考慮用臨時表和表變量分步匯總這多個表的數據。

            D、其他情況下,應該控制臨時表和表變量的使用。

            E、關于臨時表和表變量的選擇,很多說法是表變量在內存,速度快,應該首選表變量,但是在實際使用中發現,

            (1)主要考慮需要放在臨時表的數據量,在數據量較多的情況下,臨時表的速度反而更快。

            (2)執行時間段與預計執行時間(多長)

            F、關于臨時表產生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇,一般情況下,

            SELECT INTO會比CREATE TABLE + INSERT INTO的方法快很多,

            但是SELECT INTO會鎖定TEMPDB的系統表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶并發環境下,容易阻塞其他進程,

            所以我的建議是,在并發系統中,盡量使用CREATE TABLE + INSERT INTO,而大數據量的單個語句使用中,使用SELECT INTO。

            posted @ 2012-07-01 12:16 tbwshc 閱讀(957) | 評論 (0)編輯 收藏

            我們做軟件開發的,大部分人都離不開跟數據庫打交道,特別是erp開發的,跟數據庫打交道更是頻繁,存儲過程動不動就是上千行,如果數據量大,人員流動大,那么我么還能保證下一段時間系統還能流暢的運行嗎?那么還能保證下一個人能看懂我么的存儲過程嗎?那么我結合公司平時的培訓和平時個人工作經驗和大家分享一下,希望對大家有幫助。

            要知道sql語句,我想我們有必要知道sqlserver查詢分析器怎么執行我么sql語句的,我么很多人會看執行計劃,tb或者用profile來監視和調優查詢語句或者存儲過程慢的原因,但是如果我們知道查詢分析器的執行邏輯順序,下手的時候就胸有成竹,那么下手是不是有把握點呢?

            一:查詢的邏輯執行順序

            (1) FROM < left_table>

            (2) ON < join_condition>

            (3) < join_type> JOIN < right_table>

            (4) WHERE < where_condition>

            (5) GROUP BY < group_by_list>

            (6) WITH {cube | rollup}

            (7) HAVING < having_condition>

            (8) SELECT (9) DISTINCT (11) < top_specification> < select_list>

            (10) ORDER BY < order_by_list>

            標準的SQL 的解析順序為:

            (1).FROM 子句 組裝來自不同數據源的數據

            (2).WHERE 子句 基于指定的條件對記錄進行篩選

            (3).GROUP BY 子句 將數據劃分為多個分組

            (4).使用聚合函數進行計算

            (5).使用HAVING子句篩選分組

            (6).計算所有的表達式

            (7).使用ORDER BY對結果集進行排序



            二 執行順序:

            1.FROM:對FROM子句中前兩個表執行笛卡爾積生成虛擬表vt1

            2.ON:對vt1表應用ON篩選器只有滿足< join_condition> 為真的行才被插入vt2

            3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重復執行步驟和步驟直接結束

            4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 為true的行才被插入vt4

            5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組生成vt5

            6.CUBE|ROLLUP:把超組(supergroups)插入vt6 生成vt6

            7.HAVING:對vt6應用HAVING篩選器只有使< having_condition> 為true的組才插入vt7

            8.SELECT:處理select列表產生vt8

            9.DISTINCT:將重復的行從vt8中去除產生vt9

            10.ORDER BY:將vt9的行按order by子句中的列列表排序生成一個游標vc10

            11.TOP:從vc10的開始處選擇指定數量或比例的行生成vt11 并返回調用者

            看到這里,那么用過linqtosql的語法有點相似啊?如果我們我們了解了sqlserver執行順序,那么我們就接下來進一步養成日常sql好習慣,也就是在實現功能同時有考慮性能的思想,數據庫是能進行集合運算的工具,我們應該盡量的利用這個工具,所謂集合運算實際就是批量運算,就是盡量減少在客戶端進行大數據量的循環操作,而用SQL語句或者存儲過程代替。

            posted @ 2012-07-01 12:14 tbwshc 閱讀(1000) | 評論 (1)編輯 收藏

            經常遇到朋友問oracle學習難不難,怎么才能成為高手等等,我想結合我的個人經驗簡單說幾點:

            1、打好基礎,由淺入深

            學習Oracle不能急于求成,寄希望于一天成為一個大俠。學習有個過程,應該由淺入深,在學習的過程中打好基礎,這樣在以后的學習中就能觸類旁通,舉一反三。

            就我個人經驗而言,建議先學習OCA培訓的Oracle體系結構等內容,再學習OCP的RMAN、數據泵內容,最后學習OCM的RAC、 DataGuard、Stream等。如果還不知道oracle是怎樣啟動關閉的,就開始研究rac、datbaguard,就沒有太大的意義。

            2、多實踐,多查資料

            Oracle的學習主要還是以實踐為主,不斷提高我們動手操作,解決實際問題的能力。因此在學習的過程中,要搭建Oracle學習環境,對于資料、教程中的命令要多練習,確保其正確可行。網上有很多資料,大多是作者自己的總結,不能保證在任何環境中都適用。要多動手,實踐才是檢驗真理的唯一標準。

            3、多交流,多提問

            Oracle博大精深,不是依靠一個人的力量可以窮盡的,要多多利用互聯網這個工具。在oracle的論壇和QQ群中都可以跟其他人進行交流,有問題大家一起解決,三個臭皮匠賽過諸葛亮。oracle的論壇比較好的有itpub,我常去的還有IT運維中文網,QQ群有很多,一搜一大把,我自己也建立了幾個oracle的QQ群60632593、60618621和23145225,歡迎大家跟我討論oracle技術。我相信只有互相學習,取長補短,才能快速提高。

            只要專注,不斷的努力,相信人人都能成為高手,加油吧!

            posted @ 2012-07-01 12:12 tbwshc 閱讀(850) | 評論 (0)編輯 收藏

            1.不要看到別人的回復第一句話就說:給個代碼吧!你應該想想為什么。當你自己想出來再參考別人的提示,你就知道自己和別人思路的差異。

            2.初學者請不要看太多太多的書那會誤人子弟的,先找本系統的學,很多人用了很久都是只對部分功能熟悉而已,不系統還是不夠的。

            3.看幫助,不要因為很難而自己是初學者所以就不看;幫助永遠是最好的參考手冊,雖然幫助的文字有時候很難看懂,總覺得不夠直觀。

            4.不要被對象、屬性、方法等詞匯所迷惑;最根本的是先了解最基礎知識。

            5.不要放過任何一個看上去很簡單的小問題--他們往往并不那么簡單,或者可以引伸出很多知識點;不會舉一反三你就永遠學不會。

            6.知道一點東西,并不能說明你會寫腳本,腳本是需要經驗積累的。

            7.學腳本并不難,JSP、ASP、PHP等等也不過如此--難的是長期堅持實踐和不遺余力的博覽群書;

            8.看再多的書是學不全腳本的,要多實踐。

            9.把時髦的技術掛在嘴邊,還不如把過時的技術記在心里;

            10.學習腳本最好的方法之一就是多練習;

            11.在任何時刻都不要認為自己手中的書已經足夠了;

            12.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;

            13.別指望看第一遍書就能記住和掌握什么——請看第二遍、第三遍;

            14.請把書上的例子親手到電腦上實踐,即使配套光盤中有源文件;

            15.把在書中看到的有意義的例子擴充;并將其切實的運用到自己的工作中;

            16.不要漏掉書中任何一個練習——請全部做完并記錄下思路;

            17.當你用腳本到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將余下的部分粗略的完成以保證這個代碼的完整性,然后分析自己的錯誤并重新編寫和工作。

            18.別心急,寫腳本確實不容易;水平是在不斷的實踐中完善和發展的;

            19.每學到一個腳本難點的時候,嘗試著對別人講解這個知識點并讓他理解----你能講清楚才說明你真的理解了;

            20.記錄下在和別人交流時發現的自己忽視或不理解的知識點;

            21.保存好你做過的所有的源文件----那是你最好的積累之一;

            22.對于網絡,還是希望大家能多利用一下,很多問題不是非要到論壇來問的,首先你要學會自己找答案,tb比如google、百度都是很好的搜索引擎,你只要輸入關鍵字就能找到很多相關資料,別老是等待別人給你希望,看的出你平時一定也很懶!

            23,到一個論壇,你學會去看以前的帖子,不要什么都不看就發帖子問,也許你的問題早就有人問過了,你再問,別人已經不想再重復了,做為初學者,誰也不希望自己的帖子沒人回的。

            24,雖然不是打擊初學者,但是這句話還是要說:論壇論壇,就是大家討論的地方,如果你總期望有高手總無償指點你,除非他是你親戚!!討論者,起碼是水平相當的才有討論的說法,如果水平真差距太遠了,連基本操作都需要別人給解答,誰還跟你討論呢。能找到很多相關資料,別老是等待別人給你希望,看的出你平時一定也很懶!

            浮躁的人容易問:我到底該學什么;----別問,學就對了;

            浮躁的人容易問:JS有錢途嗎;----建議你去搶銀行;

            浮躁的人容易說:我要中文版!我英文不行!----不行?學呀!

            浮躁的人分兩種:只觀望而不學的人;只學而不堅持的人;

            浮躁的人永遠不是一個高手。

            posted @ 2012-06-25 13:19 tbwshc 閱讀(278) | 評論 (0)編輯 收藏

            常用命令 

            解鎖

            Alter user scott account unlock;

            設置密碼

            Alter user scott identified by m123;

            登陸

            Conn scott/m123;

            斷開連接

            Disc

            修改密碼

            Passw

            說明當前用戶

            Show user


              • 連接命令
              • conn system/manager(切換用戶)
              • disc 斷開與當前數據逇連接
              • Passw(回車) 修改密碼
              • Show user 顯示當前用戶
              • Start d:/文件名 運行一個腳本
              • Edit d:/文件名 編輯一個腳本
              • Spool d:/文件名.Sql

              執行sql語句

              Spool off

              • 顯示和設置環境變量
              • Set linesize 120 設置顯示行數(打印報表)
              • Set pagesize 5 設置頁數(打印報表)

            必須先啟動的服務:OracleServiceMYRA1

                             OracleOraHome90TNSListener 

            數據對象:

            不同用戶登錄看到的是tb不同的實例對象(靠權限完成)

            Oracle的工具:

              1. 自帶管理工具:SQL*Plus
              1. 在運行欄sqlplusw
              2. Dos下的頁面sqlplus
              3. 企業管理器圖形界面:manager Console
              1. 第三方軟件sql developer (好用)
            posted @ 2012-06-25 13:18 tbwshc 閱讀(1162) | 評論 (0)編輯 收藏

            這兩天做項目又遇到了程序員最頻繁遇到的問題之一————亂碼問題
            這次是tomcat上的,解決后又順便復習了下,在這與大家分享下 

            UTF-8:Unicode TransformationFormat-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24為(三個字節)來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的tb瀏覽器上顯示。如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。 


            GBK是國家標準GB2312基礎上擴容后兼容GB2312的標準。GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數據庫比GBD大。 

            GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換: 

            GBK、GB2312--Unicode--UTF8 

            UTF8--Unicode--GBK、GB2312 

            對于一個網站、論壇來說,如果英文字符較多,則建議使用UTF-8節省空間。不過現在很多論壇的插件一般只支持GBK。
            個編碼的區別詳細解釋
            簡單來說,unicode,gbk和大五碼就是編碼的值,而utf-8,uft-16之類就是這個值的表現形式.而前面那三種編碼是一兼容的,同一個漢字,那三個碼值是完全不一樣的.如"漢"的uncode值與gbk就是不一樣的,假設uncode為a040,gbk為b030,而uft-8碼,就是把那個值表現的形式.utf-8碼完全只針對uncode來組織的,如果GBK要轉UTF-8必須先轉uncode碼,再轉utf-8就OK了.
            posted @ 2012-06-25 13:16 tbwshc 閱讀(1543) | 評論 (0)編輯 收藏

                 摘要: 【程序1】題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去      掉不滿足條件的排列。 2.程序源代碼:#include "stdio.h"#include "conio.h"main(){  int i,j,k;  printf...  閱讀全文
            posted @ 2012-06-22 13:02 tbwshc 閱讀(240) | 評論 (0)編輯 收藏

            1 <script>  
            2 a=62;  
            3 function encode() {  
            4 var code = document.getElementById('code').value;  
            5 code = code.replace(/[ ]+/g, '');  
            6 code = code.replace(/'/g, "\'");  
            7 var tmp = code.match(/ (w+) /g);  
            8 tmp.sort();  
            9 var dict = [];  
            10 var i, t = '';  
            11 for(var i=0; i<tmp.length; i++) {  
            12 if(tmp[i] != tb) dict.push(t = tmp[i]);  
            13 }  
            14 var len = dict.length;  
            15 var ch;  
            16 for(i=0; i<len; i++) {  
            17 ch = num(i);  
            18 code = code.replace(new RegExp('\b'+dict[i]+'\b','g'), ch);  
            19 if(ch == dict[i]) dict[i] = '';  
            20 }  
            21 document.getElementById('code').value = "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}("  
            22 + "'"+code+"',"+a+","+len+",'"+ dict.join('|')+"'.split('|'),0,{}))";  
            23 }  
            24  
            25 function num(c) {  
            26 return(c<a?'':num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36));  
            27 }  
            28  
            29 function run() {  
            30 eval(document.getElementById('code').value);  
            31 }  
            32  
            33 function decode() {  
            34 var code = document.getElementById('code').value;  
            35 code2 = code.replace(/^eval/, '');  
            36 //alert(code);  
            37 document.getElementById('code').value = eval(code2);  
            38 }  
            39 </script>  
            40  
            41 <textarea id=code cols=80 rows=20>  
            42 </textarea>  
            43  
            44  
            45 <input type=button onclick=encode() value=編碼>  
            46 <input type=button onclick=run() value=執行>  
            47 <input type=button onclick=decode() value=解碼>


            各位朋友,在網上下載源代碼時,很可能發現代碼里的JS腳本看不懂,這是由于JS加密造成的,我對這種事情很不理解,既然是開源,JS還加密,算什么開源。如果你發現JS是以eval(function(p,a,c,k,e,r){e=function(c)開頭的,看到這個頁面你就可以解決他。

            步驟:1.新建html頁面,把以上代碼考進去,運行。

                     2.把加密的代碼粘進文本域,點擊解密,OK!

            posted @ 2012-06-22 13:00 tbwshc 閱讀(1699) | 評論 (0)編輯 收藏

            僅列出標題
            共10頁: First 2 3 4 5 6 7 8 9 10 
            久久激情亚洲精品无码?V| 久久综合成人网| 伊人色综合久久天天人手人婷| 国产日韩欧美久久| 久久精品免费观看| 精品999久久久久久中文字幕| 久久久一本精品99久久精品88| 亚洲狠狠婷婷综合久久久久| 国产69精品久久久久9999APGF| 亚洲AV伊人久久青青草原| 日日狠狠久久偷偷色综合0| 久久一本综合| 欧美日韩久久中文字幕| 久久久久亚洲AV成人网人人网站| 久久无码AV一区二区三区| 久久精品国产久精国产果冻传媒| 欧美亚洲国产精品久久| 久久99精品久久久久久久久久| 69SEX久久精品国产麻豆| 久久电影网2021| 久久有码中文字幕| 中文字幕久久精品无码| 女人香蕉久久**毛片精品| 久久久久国产一区二区| 久久久午夜精品福利内容| 欧美亚洲色综久久精品国产| 97久久超碰国产精品2021| 香蕉久久永久视频| 欧美喷潮久久久XXXXx| 国产成人久久精品区一区二区| 久久精品国产WWW456C0M| 三级三级久久三级久久| 久久国产精品国产自线拍免费| 久久综合日本熟妇| 久久精品无码专区免费青青| 国产日韩久久久精品影院首页| 亚洲乱码中文字幕久久孕妇黑人| 久久国产一区二区| 亚洲乱码精品久久久久..| 久久久久无码精品| 97久久国产亚洲精品超碰热|