• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

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

            一、系統(tǒng)環(huán)境

            本次測試所使用的系統(tǒng)環(huán)境如下:

            1. 硬件環(huán)境

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

            2. 軟件環(huán)境

            操作系統(tǒng):UnixWare 7.1

            數(shù)據(jù)庫: Oracle 8.1.6 for Unix 企業(yè)版,SIDora816

            Oracle安裝路徑:/home/oracle

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

            二、恢復步驟

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

            1. 創(chuàng)建數(shù)據(jù)庫恢復使用的環(huán)境

            在新的Dell服務器上,安裝與原來的數(shù)據(jù)庫服務器相同的操作系統(tǒng)UnixWare 7.1;然后安裝與原數(shù)據(jù)庫相同版本的Oracle 8.1.6 for Unix 企業(yè)版。

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

            啟動新數(shù)據(jù)庫服務器上的Oracle,在sqlplus中,查找到數(shù)據(jù)庫文件的路徑,并保存在當前路徑下的文件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,然后根據(jù)文件file_name.txt中的路徑,刪除新裝的Oracle實例的所有數(shù)據(jù)庫文件。

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

            3. 恢復數(shù)據(jù)庫文件

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

            4. 恢復初始化參數(shù)文件

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

            5. 恢復控制文件

            把備份的ControlFile.bak文件用Ftp上傳到新數(shù)據(jù)庫服務器中Oracle實例的各個鏡像路徑下,并按初始化參數(shù)文件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")

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

            6. 恢復歸檔日志文件

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

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

            7. 恢復數(shù)據(jù)庫

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

            $svrmgrl

            SVRMGR>connect internal

            SVRMGR>startup mount

            <1> 創(chuàng)建口令文件

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

            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/路徑下,用以下命令創(chuàng)建口令文件:

            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

            然后重新執(zhí)行如下語句mount數(shù)據(jù)庫:

            SVRMGR>startup mount。

            <2> 修改數(shù)據(jù)庫文件的路徑

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

            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';

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

            <3> 根據(jù)控制文件和歸檔日志文件恢復數(shù)據(jù)庫

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

            SVRMGR>recover database using backup controlfile until cancel;

            出現(xiàn)如下提示:

            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中該文件是否存在。

            直到出現(xiàn)如下提示:

            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;

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

            <5> 重啟數(shù)據(jù)庫,完成恢復

            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.

            數(shù)據(jù)庫正常打開,數(shù)據(jù)庫重建恢復成功。

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

            六、子查詢的用法

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

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

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

            相關子查詢可以用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的優(yōu)化器自動作的選擇,而它選擇的根據(jù)是查詢語句的條件以及相關表的統(tǒng)計信息,這就要求我們在寫SQL

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

            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有索引則不應該改。

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

            發(fā)現(xiàn)過這樣的語句:

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

            應該改為:

            SELECT 年,月,金額 FROM 結(jié)余表 WHERE 年=2010 AND月=10

            B、 不要對索引字段進行格式轉(zhuǎn)換

            日期字段的例子:

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

            應該改為

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

            ISNULL轉(zhuǎn)換的例子:

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

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

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

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

            C、 不要對索引字段使用函數(shù)

            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部分條件的區(qū)別

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

            1考慮聯(lián)接優(yōu)先順序:

            2INNER JOIN

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

            4CROSS JOIN

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

            A、在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)

            B、注意UNION和UNION ALL的區(qū)別。--允許重復數(shù)據(jù)用UNION ALL好

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

            D、TRUNCATE TABLE 與 DELETE 區(qū)別

            E、減少訪問數(shù)據(jù)庫的次數(shù)

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

            sql我比較喜歡用的就是

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

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

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

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

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

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

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

             

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

            三、只返回需要的數(shù)據(jù)

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

            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、控制同一語句的多次執(zhí)行,特別是一些基礎數(shù)據(jù)的多次執(zhí)行是很多程序員很少注意的。

            B、減少多次的數(shù)據(jù)轉(zhuǎn)換,也許需要數(shù)據(jù)轉(zhuǎn)換是設計的問題,但是減少次數(shù)是程序員可以做到的。

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

            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操作的形式,雖然功能相同,但是性能差別是很大的。

             

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

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

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

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

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

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

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

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

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

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

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

            但是SELECT INTO會鎖定TEMPDB的系統(tǒng)表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶并發(fā)環(huán)境下,容易阻塞其他進程,

            所以我的建議是,在并發(fā)系統(tǒng)中,盡量使用CREATE TABLE + INSERT INTO,而大數(shù)據(jù)量的單個語句使用中,使用SELECT INTO。

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

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

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

            一:查詢的邏輯執(zhí)行順序

            (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 子句 組裝來自不同數(shù)據(jù)源的數(shù)據(jù)

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

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

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

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

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

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



            二 執(zhí)行順序:

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

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

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

            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列表產(chǎn)生vt8

            9.DISTINCT:將重復的行從vt8中去除產(chǎn)生vt9

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

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

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

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

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

            1、打好基礎,由淺入深

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

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

            2、多實踐,多查資料

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

            3、多交流,多提問

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            20.記錄下在和別人交流時發(fā)現(xiàn)的自己忽視或不理解的知識點;

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

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

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

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

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

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

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

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

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

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

            常用命令 

            解鎖

            Alter user scott account unlock;

            設置密碼

            Alter user scott identified by m123;

            登陸

            Conn scott/m123;

            斷開連接

            Disc

            修改密碼

            Passw

            說明當前用戶

            Show user


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

              執(zhí)行sql語句

              Spool off;

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

            必須先啟動的服務:OracleServiceMYRA1

                             OracleOraHome90TNSListener 

            數(shù)據(jù)對象:

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

            Oracle的工具:

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

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

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


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

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

            GBK、GB2312--Unicode--UTF8 

            UTF8--Unicode--GBK、GB2312 

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

                 摘要: 【程序1】題目:有1、2、3、4個數(shù)字,能組成多少個互不相同且無重復數(shù)字的三位數(shù)?都是多少?1.程序分析:可填在百位、十位、個位的數(shù)字都是1、2、3、4。組成所有的排列后再去      掉不滿足條件的排列。 2.程序源代碼:#include "stdio.h"#include "conio.h"main(){  int i,j,k;  printf...  閱讀全文
            posted @ 2012-06-22 13:02 tbwshc 閱讀(246) | 評論 (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=執(zhí)行>  
            47 <input type=button onclick=decode() value=解碼>


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

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

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

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

            僅列出標題
            共10頁: First 2 3 4 5 6 7 8 9 10 
            久久久一本精品99久久精品88| 国产精品无码久久久久久| 伊人久久大香线蕉av不变影院| 久久精品aⅴ无码中文字字幕重口| 久久久久四虎国产精品| 中文成人无码精品久久久不卡| 久久精品无码一区二区无码| 精品国产乱码久久久久久浪潮| 久久综合亚洲鲁鲁五月天| 久久精品国产影库免费看| 国产69精品久久久久APP下载| 狠狠色婷婷综合天天久久丁香| 亚洲AV伊人久久青青草原| 97精品国产91久久久久久| 亚洲七七久久精品中文国产| 狠狠色丁香婷综合久久| 老男人久久青草av高清| 国产精品久久久天天影视香蕉| 天天躁日日躁狠狠久久| 亚洲国产成人精品91久久久| 99精品国产在热久久无毒不卡| 久久这里有精品| 国内精品伊人久久久久网站| 国产精品一区二区久久不卡| 久久久无码精品亚洲日韩京东传媒| 国产综合精品久久亚洲| 国内精品伊人久久久久av一坑| 免费无码国产欧美久久18| 91久久精品国产91性色也| 久久久久亚洲AV无码永不| 精品国产日韩久久亚洲| 久久久久亚洲精品中文字幕| 久久青草国产精品一区| 老色鬼久久亚洲AV综合| 久久婷婷人人澡人人爽人人爱 | 欧美综合天天夜夜久久| 欧美亚洲色综久久精品国产| 思思久久好好热精品国产| 久久97久久97精品免视看秋霞| AV色综合久久天堂AV色综合在| 亚洲色婷婷综合久久|