• <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使用相關觸發器來實現自增ID,在userinfo表中id所需要的實現自增效果的實際操作步驟如下,如果你對其實際的操作步驟感興趣的話,以下的文章就可以更深的一部增加你在tb其方面的興趣。

            1.創建序列

            代碼

             

            1. -- Create sequence  
            2. create sequence seq_userinfo  
            3. minvalue 1  
            4. start with 1  
            5. increment by 1;  
            6.  

             

            2.創建觸發器

            代碼

             

            1. create or replace trigger tigger_userinfo  
            2. before insert on userinfo  
            3. for each row  
            4. declare  
            5. begin  
            6. select SEQ_userinfo.nextval into:New.id from dual;  
            7. end tigger_userinfo;   
            posted @ 2012-07-15 17:15 tbwshc 閱讀(748) | 評論 (0)編輯 收藏

            以下的文章抓喲是對Oracle SQL執行緩慢的原因的分析,如果Oracle數據庫中的某張表的相關數據已是2億多時,同時此表也創建了相關的4個獨立的相關索引。由于業務方面的需要,每天需分兩次向此表中插入300萬條記錄。

            由于數據量大,每次插入耗時3個小時以上,嚴重影響效率。

            因此,修改了系統的算法,將此表中只存儲當天新增記錄。將此表tbruncate后,第二天執行對此表的update操作時,非常耗時。表中有2億多條數據的時候,此Oracle sql語句耗時59秒;表中有300萬條數據的時候,此Oracle sql語句耗時幾個小時。

            咨詢DBA后,得出結論,需重建索引。重建后,6秒完成此操作。但第三天問題依然出現。DBA正在查找原因。難道每次truncate表,都需要重建索引?

            對于這個問題,DBA也沒有給出合理的解釋,推測主要原因是Oracle復雜的查詢優化算法。

            最終,DBA給出的解決方案:


            truncate table ....  drop index.....  insert data .....  create index ...  analyze table table_name compute statistics; 
            重新生成統計數據

            調整后,整個操作耗時非常少。

            以上的相關內容就是對Oracle SQL執行緩慢的分析的介紹,望你能有所收獲。

             

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

            1、抽象類里面可以有非抽象方法,但接口里只能有抽象方法,聲明方法的存在而不去實現它的類被叫做抽像類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽像類,并讓它指向具體子類的一個實例。不能有抽像構造函數或抽像靜態方法。Abstract 類的子類為它們父類中的所有抽像方法提供實現,否則它們也是抽像類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。

            2、接口(interface)是抽像類的變體。在接口中,所有方法都是抽像的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽像的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對像上調用接口的方法。由于有抽像類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof運算符可以用來決定某對象的類是否實現了接口。

            對比:
            一個類可以有多個接口 只能有繼承一個父類。
            抽象類可以有構造方法,接口中不能有構造方法。
            抽象類中可以有普通成員變量,接口中沒有普通成員變量。
            接口里邊全部方法都必須是abstract的 抽象類的可以有實現了的方法。
            抽象類中的抽象方法的訪問類型可以是public,protected   但接口中的抽象方法只能是public類型的,tb并且默認即為public abstract類型。
            抽象類中可以包含靜態方法,接口中不能包含靜態方法。
            抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
            posted @ 2012-07-12 13:18 tbwshc 閱讀(1689) | 評論 (0)編輯 收藏

             

             在Java Web編程中,不得不了解一些基礎技術(概念),如:Internetwww、瀏覽器、TCP/IP協議、Web服務器等。在此,我只涉及以下幾處tb

            1、TCP/IP協議

                    協議,在計算機網絡中的計算機需要相互通信、傳輸數據,所遵循的統一的溝通規則。有人也曾形象的把協議稱之為“世界語”,是一種公認交流的規則而已。

            通常TCP/IP協議不是靠單指一個協議,而是由相關的許多協議組成的協議族,即通常稱之為“TCP/IP協議族(協議棧)”。正是有了這一系列的協議,具體規定了internet上計算機之間如何進行數據通信,其最核心的協議就是IP協議和TCP協議.IP(Internet Protocol),規定了internet數據傳輸的基本單元和格式的協議。而TCP協議提供了可靠的數據傳輸服務的規則。

                   TCP/IP的四層結構:

             

            2、常用的Web服務器

                    1>Apache

                         是使用廣泛的Web服務器,支持很多的操作系統,并且是開放源代碼的Web服務器,支持通過API擴展其功能。可以通過官方網站http://www.apache.org獲得更多信息。

                     2>IIS

                          是微軟推出的基于window平臺的web服務器,不支持Javaservlet技術,只支持自己的ASPASP.NET技術。

                     3 >Tomcat

                          既可以獨立運行,又可以作為Apache服務器的插件,與Apache服務器共同工作。Tomcat在作為Apache插件的情況下,TomcatApache提供對ServlerJSP等動態內容運行的支持,Apache提供對訪問靜態資源的支持。

                         在開發Java Web應用的階段,我們可以把Tomcat作為對立的Web服務器來使用,而在產品上線的階段再使用其他的應用服務器或者是安裝了Tomcat插件的Apache服務器。

            3、Web動態編程

                   Web運行環境經歷了靜態WEB和動態WEB兩個時期,靜態WEB與動態WEB最本質的區別極速hi在于資源(數據庫)的訪問上。通常靜態WEB頁面就是單純的使用了HTML語音編寫,缺乏交互性,然而動態WEB技術出現,使得用戶的交互性更加體現出來,如搜索引擎,不同用戶針對同一頁面將會回饋得到不同的內容。

                    動態WEB的常見實現手段有:

                        1> CGI(Common Gateway Intterface) 公共網關接口

                        2> PHP(Pypertext Preprocessor) 超文本預處理

                        3> ASP(Active Server Pages) 動態服務頁

                        4>ASP.NET

                        5> JSP(Java Server Pages,Java服務頁)/Servlet(服務器端小程序)

            posted @ 2012-07-12 13:16 tbwshc 閱讀(918) | 評論 (1)編輯 收藏

              第一次去面試的時候人家人如何在SSH框架下,如何進行Hibernate的優化,當時自己只是看到這些根本就沒有系統的總結這些東西,今天終于找到一個時間來解決一下自己面試的這個問題了。

            Hibernate自述

                       我天生效率比較低,在普遍情況下,需要將執行轉換為SQL語句的Hibernate低于直接JDBC存取。但是在經過tb比較好的性能優化之后,我的性能還是讓人相當滿意的,特別是應用二級緩存之后,甚至可以獲得比較不使用緩存的JDBC更好的性能。

            優化總結

                       要想優化Hibernate,我們必須知道應該從什么地方進行優化,從什么地方入手。Hibernate的優化方向:數據庫設計、HQL優化、緩存、主配置、延遲加載、方法選用、集合選用、事物控制、批量操作

             

            具體分析

            第一點:數據庫設計

                   前邊博客介紹過 數據庫設計,今天我們還從這開始,表的設計就是建樓的基礎,如何讓基礎簡潔而結實這是最重要的。

            優化策略:

            1.   建索引

            2.   減少表之間的關聯

            3.   簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量數據

            4.   適當的冗余數據,不過分最求高范式

            第二點:HQL優化


                                                        (HQL知識圖)

                 假如想好好了解一下的建議看一下這篇博客HQL詳細使用,我個人認為寫的還可以,知識總結的很細致。

            總結:

            1.   實體查詢:可以使用sql語句查詢

            2.   實體的更新和刪除:hibernate3中直接提供更加靈活更加效率的解決方法

            3.   屬性查詢:動態構造實例對象,對結果集進行封裝

            4.   分組與排序:

            A.   Order by子句

            B.   Group by子句與統計查詢

            C.   優化統計查詢:內連接,外連接

            5.   參數綁定:和jdbc一樣,對hibernate的參數綁定提供了豐富的支持。

            第三點:緩存

            運行機制:

            介于應用程序和物理數據源之間,其作用是為了降低應用程序對物理數據源訪問的頻數,從而提高運行性能。

            緩存被廣泛應用的用于優化數據庫。當一些數據被從數據庫中讀取出來的時候,我們可以把它們放到緩存里。這樣我們可以再次使用的時候直接從緩存中取出來,這樣我們的效率就提高了很多。

            控制范圍:

            一級緩存是session對象的生命周期通常對應的一個數據庫事務或者一個應用事務,它是事務范圍內的緩存

            二級緩存是一個可插拔的緩存插件,它是由SessionFactory負責管理。由于SessionFactory對象的生命周期和應用程序的整個過程對應,所以二級緩存是進城范圍或者集群范圍內的緩存。用于初始化很少更改的數據、不重要的數據,不會并發訪問的數據。

             

            Hibernate緩存的一些問題和建議:hibernate的緩存

            第四點:捉取策略

            1.  捉取優化:Hibernate在關聯關系之間進行導航,充分利用Hibernate提供的技術

            2.  如何捉取

            立即捉取:當捉取宿主對象時,同時捉取其相關對象和關聯集以及屬性

            延遲加載:當捉宿主對象時,并不捉取其關聯對象,而是當對其對象進行調用時才加載。

            3.  捉取粒度:設置捉取個數

            第五點:批量數據處理(修改和刪除)

            在Hibernate2中,如果需要對任何數據進行修改和刪除操作都需要先執行查詢操作,在得到數據后才進行修改和刪除。

            1.  不適用Hibernate API而是直接使用JDBC  API來做原生態SQL語句進行查詢,這種方法比較好,相對來說較快。

            2.  運用存儲過程

            3.  一定量范圍內可以使用hibernate API,但是特大數據量不行。

            第六點:結果集的使用:

                 結果集的使用:list()和iterator()區別

            查詢方式:

            list只能利用查詢緩存(但在交易系統中查詢緩存作用不大),無法利用二級緩存中的單個實體,但是list查出的對象會寫入二級緩存,但它一般只生成較少的sql語句,很多情況就是一條。

            iterator則利用二級緩存,對于一條查詢語句,它會先從數據庫中找到所有符合條件的記錄的ID,在通過ID去緩存找,對于緩存中沒有的記錄,在構造語句從數據庫查出,第一次的執行會產生N+1條SQL語句。

            產生結果:

            用list可能會溢出

            通過Iterator,配合緩存管理API,在海量數據查詢中可以很好的解決內存問題。

            綜合考慮

            一般List會填充二級緩存,卻不能利用二級緩存,而Iterator可以讀二級緩存,然而無法命中的話,效率很低效。一般處理方法,就是第一次查詢使用list,隨后使用iterator查詢。

            總結

             

            Hibernate優化總結還有主配置、方法選用、事物控制沒有涉及到,因為它們相對來說這些方面比較簡單,但是還是很重要的。

            在實施一個項目的時候我們沒有必要想這些問題,做項目的時候第一步運行起來,第二步優化一下。在很多小型項目中第二步一般都不會去做,所以說我們做工程的時候還是要牢記運行出來,假如自己作為研究或者這個問題比較嚴重的話我們才考慮優化。

            Hibernate調優方面沒有最有只有更優,讓我們不斷積極找到優化的方法,來優化我們的程序,來優化我們自己。

            關于Hibernate優化方面,希望大家留下寶貴的意見,多對交流!

            posted @ 2012-07-12 13:15 tbwshc| 編輯 收藏

            Sql Server臨時表的生存周期可能很多人都不是非常了解,下文就為您介紹Sql Server臨時表的生存周期,供您參考,希望對您能有所幫助。

            局部臨時表#temp_table:
            只在當前會話結有效。會話終止則生存終止。
            根據session不同開辟不一樣的內存存放數據。
            相同session的用戶可以使用同一張臨時表,只能create table 一次。
            不同session建的臨時表,即使表名相同,指向的內存也是不一樣的,互相內容不可見。

            全局臨時表##temp_table:
            顧名思義,不同的session可以使用同一塊內存。但是其中的內容到底什么時候才被回收呢?

            自己做了一個測試,結果用小白文說起來就是:
            只要有任何session用到過這個表,且這些session沒有被全部終止,就不被回收。
            所謂session終止,我的理解,就sqlserver本身來說就是query窗體被關掉。如果是因為有應用程序連接而產生的session的話(以上所說的session都是sqlserver的session),web系就是session重啟(IIS application pool重啟,這里所說的session是http的session),應用系的話就是充啟應用程序了(←猜想,沒試過)。

            下面是網上找的,tb概括一下機能就是,創建一個不被自動回收的全局臨時表。沒有經過測試,雖然貌似看上去沒啥意義,和常規表有什么區別?說不定以后有用,所以還是記下來:
            USE master;
            GO
            IF OBJECT_ID('dbo.sp_Globals') IS NOT NULL
              DROP PROC dbo.sp_Globals
            GO
            CREATE proc dbo.sp_Globals
            AS
            CREATE TABLE ##Globals
            (
            id varchar(36) NOT NULL PRIMARY KEY
            value varchar(500)
            )
            GO
            ↑sp內容

            EXEC dbo.sp_procoption 'dbo.sp_Globals','startup','true';

            只有顯示刪除##Globals才會被清除

            以上Sql Server臨時表的生存周期的介紹。

            posted @ 2012-07-08 10:53 tbwshc 閱讀(925) | 評論 (0)編輯 收藏

            Oracle臨時表在實際開發中的應用是本文我們主要要介紹的內容,我們知道,SQL Server 在編寫查詢式的存儲過程的時候,一直都令我為之贊嘆。Create procedure ps_procedure_name as select * from table; Select查詢語句可以作為SQL Server存儲過程的一部分,直接返回結果集。但在Oracle實現這種形式的存儲過程是不合語法的。

            為了達到這種目的,我們需要使用Oracle臨時表(這是其中一種解決方案)。

            Oracle數據庫除了可以保存永久表外,還可以建立臨時表temporary tables。Oracle臨時表分為會話級臨時表(ON COMMIT PRESERVE ROWS)和事務級臨時表(ON COMMIT DELETE ROWS)。tb會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。

            事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,并且不能訪問其它Session的臨時表中的數據。

            //在數據庫建立一個臨時表:

             

            1. CREATE GLOBAL TEMPORARY TABLE ESPS.ESPS_EMP_RANK_TEMP  
            2. (  
            3. COM                VARCHAR2(20 BYTE),  
            4. EMPNO             VARCHAR2(20 BYTE),  
            5. EMPNAME          VARCHAR2(100 BYTE),  
            6. DEPTNAME         VARCHAR2(300 BYTE),  
            7. AMOUNT            NUMBER,  
            8. APPROVED_AMOUNT  NUMBER,  
            9. FOLDING_AMOUNT   NUMBER,  
            10. BENEFIT          NUMBER,  
            11. EXECUTED_RATE    NUMBER,  
            12. FOLDING_RANK     NUMBER,  
            13. BENEFIT_RANK     NUMBER,  
            14. RANK             NUMBER,  
            15. TOTAL_RANK       NUMBER  
            16. )  
            17. //ON COMMIT PRESERVE ROWS         --這里代表的是事務級臨時表  
            18. ON COMMIT PRESERVE ROWS          --這里代表的是會話級臨時表 

             

            在實際的操作中,我就驗證過上面所說的。一開始我使用了事務級臨時表,將數據插入到臨時表時,使用commit操作,結果臨時表的內容清空了。例如是:INSERT INTO ESPS_EMP_RANK_TEMP select * from table;commint;執行這兩段SQL后,相當于沒有插入數據。

            如果我們使用會話級臨時表,即使使用了commit,臨時表中的內容還是存在的。直到會話斷開時,臨時表中的內容才真正的清空。所以,在實際的開發過程中,我們因該結合場景,使用不同類型的臨時表。

            在建議提案系統開發的過程中,我使用了會話級的臨時表。將查詢的數據插入到臨時表中,并且讀取臨時表的內容,會話斷開時,臨時表中的內容自動清空。 

            在C#里面調用的三大步驟:

            //C#里面定義的一個String類型的變量,存儲一段動態SQL,存儲過程為:

            1. ESPS_EMP_RANK_STATISTIS({0},'{1}')  
            2. public static string I_EMP_RANK_STATISTIS = "BEGIN ESPS_EMP_RANK_STATISTIS({0},'{1}'); END;"

             

            //執行存儲過程,把結果集插入到臨時表ESPS_EMP_RANK_TEMP

             

            1. WAF.COM.Core.OracleHelper. ExecuteNonQuery(conn, CommandType.Text, string.Format(SqlCollector.I_EMP_RANK_STATISTIS, 2,’2011’)); 

             

            //讀取臨時表中保存的結果集

             

            1. Oracle DataReader dr = WAF.COM.Core.OracleHelper. ExecuteReader(“select * from ESPS_EMP_RANK_TEMP”) 

             

            關于Oracle臨時表在實際開發中的應用的相關知識就介紹到這里了,希望本次介紹能夠對您有所收獲!

            posted @ 2012-07-08 10:49 tbwshc 閱讀(939) | 評論 (0)編輯 收藏

            Oracle數據庫創建臨時表的過程以及和SQL Server臨時表的不同點的對比的相關知識是本文我們主要要介紹的內容,接下來就讓我們一起來了解一下這部分內容吧,希望能夠對您有所幫助。

            1.簡介

            Oracle數據庫除了可以保存永久表外,還可以建立臨時表temporary tables。這些臨時表用來保存一個會話SESSION的數據,或者保存在一個事務中需要的數據。當會話退出或者用戶提交commit和回滾rollback事務的時候,臨時表的數據自動清空,但是臨時表的結構以及元數據還存儲在用戶的數據字典中。

            2.詳細介紹

            Oracle臨時表分為會話級臨時表和事務級臨時表。

            會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。

            事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。

            臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,并且不能訪問其它Session的臨時表中的數據。因此,臨時表不需要DML鎖。

            當一個會話結束(用戶正常退出 用戶不正常退出 ORACLE實例崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE 語句清空臨時表數據.但不會清空其它會話臨時表中的數據.

            你可以索引臨時表和在臨時表基礎上建立視圖.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效. 臨時表可以擁有觸發器.

            3.建立臨時表

            臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.

            建立方法:

            1. 1) ON COMMIT DELETE ROWS 定義了建立事務級臨時表的方法.  
            2. CREATE GLOBAL TEMPORARY TABLE admin_work_area  
            3. (startdate DATE,  
            4. enddate DATE,  
            5. class CHAR(20))  
            6. ON COMMIT DELETE ROWS;  
            7. EXAMPLE:  
            8. SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area  
            9. 2 (startdate DATE,  
            10. 3 enddate DATE,  
            11. 4 class CHAR(20))  
            12. 5 ON COMMIT DELETE ROWS;  
            13. SQL> create table permernate( a number);  
            14. SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');  
            15. SQL> insert into permernate values(1);  
            16. SQL> commit;  
            17. SQL> select * from admin_work_area;  
            18. SQL> select * from permernate;  
            19. A  
            20. 1  
            21. 2)ON COMMIT PRESERVE ROWS 定義了創建會話級臨時表的方法.  
            22. CREATE GLOBAL TEMPORARY TABLE admin_work_area  
            23. (startdate DATE,  
            24. enddate DATE,  
            25. class CHAR(20))  
            26. ON COMMIT PRESERVE ROWS;  
            27. EXAMPLE: 

             

            會話1:

            1. SQL> drop table admin_work_area;  
            2. SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area  
            3. 2 (startdate DATE,  
            4. 3 enddate DATE,  
            5. 4 class CHAR(20))  
            6. 5 ON COMMIT PRESERVE ROWS;  
            7. SQL> insert into permernate values(2);  
            8. SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');  
            9. SQL> commit;  
            10. SQL> select * from permernate;  
            11. A  
            12. ----------  
            13. 1  
            14. 2  
            15. SQL> select * from admin_work_area;  
            16. STARTDATE ENDDATE CLASS  
            17. ---------- ---------- --------------------  
            18. 17-1?? -03 17-1?? -03 session temperary 

             

            會話2:

            1. SQL> select * from permernate;  
            2. A  
            3. ----------  
            4. 1  
            5. 2  
            6. SQL> select * from admin_work_area;  
            7. 未選擇行. 

             

            會話2看不見會話1中臨時表的數據。

            4.Oracle臨時表和SQL Server臨時表異同

            SQL Server也可以創建臨時表。臨時表與永久表相似,但臨時表存儲在tempdb中,當不再使用時會自動刪除。

            有本地和全局兩種類型的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字符號 (#) 打頭;它們僅對當前的用戶連接是可見的;當用戶從 Microsoft SQL Server實例斷開連接時被刪除。全局臨時表的名稱以數學符號 (##) 打頭,創建后對任何用戶都是可見的,當所有引用該表的用戶從 SQL Server 斷開連接時被刪除。

            SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:

            1. CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)  
            2. INSERT INTO #MyTempTable VALUES (1) 

             

            如果本地臨時表由存儲過程創建或由多個用戶同時執行的應用程序創建,則 SQL Server 必須能夠區分由不同用戶創建的表。為此,SQL Server 在內部為每個本地臨時表的表名追加一個數字后綴。存儲在 tempdb 數據庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字后綴組成。為了允許追加后綴,為本地臨時表指定的表名 table_name 不能超過116 個字符。

            除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:

            當存儲過程完成時,將自動除去在存儲過程中創建的本地臨時表。由創建表的存儲過程執行的所有嵌套存儲過程都可以引用此表。但調用創建此表的存儲過程的進程無法引用此表。

            所有其它本地臨時表在當前會話結束時自動除去。

            全局臨時表在創建此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存周期內保持。換言之,當創建全局臨時表的會話結束時,最后一條引用此表的Transact-SQL語句完成后,將自動除去此表。

            例如,如果創建名為 employees 的表,則任何人只要在數據庫中有使用該表的安全權限就可以使用該表,除非它已刪除。如果創建名為 #employees 的本地臨時表,只有您能對該表執行操作且在斷開連接時該表刪除。如果創建名為 ##employees 的全局臨時表,數據庫中的任何用戶均可對該表執行操作。如果該表在您創建后沒有其他用戶使用,則當您斷開連接時該表刪除。如果該表在您創建后有其他用戶使用,則 SQL Server在所有用戶斷開連接后刪除該表。

            在存儲過程或觸發器中創建的本地臨時表與在調用存儲過程或觸發器之前創建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。tb嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所創建的表,例如:

             

            1. CREATE PROCEDURE Test2  
            2. AS  
            3. CREATE TABLE #t(x INT PRIMARY KEY)  
            4. INSERT INTO #t VALUES (2)  
            5. SELECT Test2Col = x FROM #t  
            6. GO  
            7. CREATE PROCEDURE Test1  
            8. AS  
            9. CREATE TABLE #t(x INT PRIMARY KEY)  
            10. INSERT INTO #t VALUES (1)  
            11. SELECT Test1Col = x FROM #t  
            12. EXEC Test2  
            13. GO  
            14. CREATE TABLE #t(x INT PRIMARY KEY)  
            15. INSERT INTO #t VALUES (99)  
            16. GO  
            17. EXEC Test1  
            18. GO  

             

            下面是結果集:

            1. (1 row(s) affected)  
            2. Test1Col   
            3. -----------   
            4. 1   
            5. (1 row(s) affected)  
            6. Test2Col   
            7. -----------   

             

            當創建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創建,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。

            考慮使用表變量而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變量提供更有效的查詢處理。

            和Oracle的不同點:

            1. SQL Server臨時表是一種”內存表”,tb表是存儲在內存中的.ORACLE臨時表除非執行DROP TABLE,否則表定義會保留在數據字典中。

            2. SQL Server臨時表不存在類似ORACLE臨時表事務級別上的功能。

            3.SQL Server本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,ORACLE不會刪除表。

            4.SQL Server的全局臨時表(##) 是指多個連接共享同一片內存.當沒有指針引用該內存區域時,SQL Server自動釋放全局臨時表。

            5.由于Oracle不是一種內存中的數據庫. 所以如果Oracle類似SQL Server 頻繁的對臨時表進行建立和刪除,必定會影響性能.所以Oracle會保留臨時表的定義直到用戶DROP TABLE。

            6.在Oracle中,如果需要多個用戶共享一個表(類似SQL Server的全局臨時表##).則可以利用永久表,并且在表中添加一些可以唯一標識用戶的列.利用觸發器和視圖.當用戶退出的時候,根據該登陸用戶的唯一信息刪除相應的表中的數據. 這種方法給Oracle帶來了一定量的負載。

             

            關于Oracle臨時表和SQL Server臨時表的不同點對比的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!

            posted @ 2012-07-08 10:47 tbwshc 閱讀(868) | 評論 (0)編輯 收藏

            Oracle臨時表可以說是提高數據庫處理性能的好方法,在沒有必要存儲時,只存儲在Oracle臨時表空間中。希望本文能對大家有所幫助。

            1 、前言

             

            Oracle Logo

            目前所有使用 Oracle 作為數據庫支撐平臺的應用,大部分數據量比較龐大的系統,即表的數據量一般情況下都是在百萬級以上的數據量。

            當然在 Oracle 中創建分區是一種不錯的選擇,但是當你發現你的應用有多張表關聯的時候,并且這些表大部分都是比較龐大,而你關聯的時候發現其中的某一張或者某幾張表關聯之后得到的結果集非常小并且查詢得到這個結果集的速度非常快,那么這個時候我考慮在 Oracle 中創建“臨時表”。

            我對臨時表的理解:在 Oracle 中創建一張表,這個表不用于其他的什么功能,主要用于自己的軟件系統一些特有功能才用的,而當你用完之后表中的數據就沒用了。 Oracle 的臨時表創建之后基本不占用表空間,如果你沒有指定臨時表(包括臨時表的索引)存放的表空的時候,你插入到臨時表的數據是存放在 ORACLE 系統的臨時表空間中( TEMP )。

            2 、臨時表的創建

            創建Oracle 臨時表,可以有兩種類型的臨時表:

            會話級的臨時表

            事務級的臨時表 。

            1) 會話級的臨時表因為這這個臨時表中的數據和你的當前會話有關系,當你當前SESSION 不退出的情況下,臨時表中的數據就還存在,而當你退出當前SESSION 的時候,臨時表中的數據就全部沒有了,當然這個時候你如果以另外一個SESSION 登陸的時候是看不到另外一個SESSION 中插入到臨時表中的數據的。即兩個不同的SESSION 所插入的數據是互不相干的。當某一個SESSION 退出之后臨時表中的數據就被截斷(truncate table ,即數據清空)了。會話級的臨時表創建方法:


            Create Global Temporary Table Table_Name  (Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;
            舉例:


            create global temporary table Student  (Stu_id Number(5),  Class_id Number(5),  Stu_Name Varchar2(8),  Stu_Memo varchar2(200)) on Commit Preserve Rows ;
            2) 事務級臨時表是指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的數據將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION 的時候,事務級的臨時表也會被自動截斷)。事務級臨時表的創建方法:


            Create Global Temporary Table Table_Name  (Col1 Type1,Col2 Type2...) On Commit Delete Rows ;
            舉例:

            create global temporary table Classes  (Class_id Number(5),  Class_Name Varchar2(8),  Class_Memo varchar2(200)) on Commit delete Rows ; 3) 兩中類型臨時表的區別

            會話級臨時表采用 on commit preserve rows ;而事務級則采用 on commit delete rows ;用法上,會話級別只有當會話結束臨時表中的數據才會被截斷,而且事務級臨時表則不管是 commit 、 rollback 或者是會話結束,tb臨時表中的數據都將被截斷

            4 )什么時候使用臨時表

            1 )、當某一個 SQL 語句關聯的表在 2 張及以上,并且和一些小表關聯。可以采用將大表進行分拆并且得到比較小的結果集合存放在臨時表中

            2 )、程序執行過程中可能需要存放一些臨時的數據,這些數據在整個程序的會話過程中都需要用的等等。

            3 . 例子:略

            4 .臨時表的不足之處

            1 )不支持 lob 對象,這也許是設計者基于運行效率的考慮,但實際應用中確實需要此功能時就無法使用臨時表了。

            2 )不支持主外鍵關系

            所以,由于以上原因,我們可以自己創建臨時表,以彌補 oracle 臨時表的不足之處

            上面的都是本人經過測試的,但下面是在網上搜索到的方法,本人具體沒有測試過,不過覺得可行性很強,有時間測試下

            創建方法:

            1 、以常規表的形式創建臨時數據表的表結構,但要在每一個表的主鍵中加入一個 SessionID 列以區分不同的會話。(可以有 lob 列和主外鍵)

            2 、寫一個用戶注銷觸發器,在用戶結束會話的時候刪除本次會話所插入的所有記錄 (SessionID 等于本次會話 ID 的記錄 ) 。

            3 、程序寫入數據時,要順便將當前的會話 ID(SessionID) 寫入表中。

            4 、程序讀取數據時,只讀取與當前會話 ID 相同的記錄即可。

            功能增強的擴展設計:

            1 、可以在數據表上建立一個視圖,視圖對記錄的篩選條件就是當前會話的SessionID 。

            2 、數據表中的SessionID 列可以通過Trigger 實現,以實現對應用層的透明性。

            3 、高級用戶可以訪問全局數據,以實現更加復雜的功能。

            擴展臨時表的優點:

            1 、實現了與Oracle 的基于會話的臨時表相同的功能。

            2 、支持SDO_GEOMETRY 等lob 數據類型。

            3 、支持表間的主外鍵連接,且主外鍵連接也是基于會話的。

            4 、高級用戶可以訪問全局數據,以實現更加復雜的功能

             

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

            經驗總結:

            聯機日志分為當前聯機日志和非當前聯機日志,非當前聯機日志的損壞是比較簡單的,一般通過clear命令就可以解決問題。

            損壞非當前聯機日志:
            1、啟動數據庫,遇到ORA-00312 or ORA-00313錯誤,如:
            ORA-00313: open failed for members of log group 4 of tbhread 1
            ORA-00312: online log 3 thread 1: '/opt/oracle/db04/oradata/ORCL/redo03.log'
            從這里我們知道日志組1的數據文件損壞或丟失了
            從報警文件可以看到更詳細的信息
            2、查看V$log視圖:
            SQL> select group#,sequence#,archived,status from v$log;

            GROUP# SEQUENCE# ARC STATUS

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

            1 54 YES INACTIVE

            2 55 NO CURRENT

            3 53 YES INACTIVE

            可以知道,該組是非當前狀態,而且已經歸檔。
            3、用CLEAR命令重建該日志文件
            SQL>alter database clear logfile group 3;
            如果是該日志組還沒有歸檔,則需要用
            SQL>alter database clear unarchived logfile group 3;
            4、打開數據庫,重新備份數據庫
            SQL>alter database open;
            說明:
            1)、如果損壞的是非當前的聯機日志文件,一般只需要clear就可以重建該日志文件,但是如果該數據庫處于歸檔狀態但該日志還沒有歸檔,就需要強行clear。
            2)、建議clear,特別是強行clear后作一次數據庫的全備份。
            3)、此方法適用于歸檔與非歸檔數據庫。

            損壞當前聯機日志:

            歸檔模式下當前日志的損壞有兩種情況,
            一、是數據庫是正常關閉,日志文件中沒有未決的事務需要實例恢復,當前日志組的損壞就可以直接用alter database clear unarchived logfile group n來重建。
            二、是日志組中有活動的事務,數據庫需要媒體恢復,日志組需要用來同步,有兩種補救辦法
            A. 最好的辦法就是通過不完全恢復,可以保證數據庫的一致性,但是這種辦法要求在歸檔方式下,并且有可用的備份
            B. 通過強制性恢復,但是可能導致數據庫不一致。
            下面分別用來說明這兩種恢復方法
            5.1.2.1 通過備份來恢復
            1、打開數據庫,會遇到一個類似的錯誤
            ORA-00313: open failed for members of log group 1 of thread 1
            ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'
            ORA-27041: unable to open file
            OSD-04002: unable to open file
            O/S-Error: (OS 2) 系統找不到指定的文件

            2、查看V$log,發現是當前日志
            SQL> select group#,sequence#,archived,status from v$log;

            GROUP# SEQUENCE# ARCHIVED STATUS
            ---------- ---------- -------- ----------------
            1 1 NO CURRENT
            2 2 YES INACTIVE
            3 3 YES INACTIVE

            3、發現clear不成功
            SQL> alter database clear unarchived logfile group 1;
            alter database clear unarchived logfile group 1
            *
            ERROR at line 1:
            ORA-01624: log 1 needed for crash recovery of thread 1
            ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'

            4、拷貝有效的數據庫的全備份,并不完全恢復數據庫
            可以采用獲取最近的SCN的辦法用until scn恢復或用until cnacel恢復
            recover database until cancel
            先選擇auto,盡量恢復可以利用的歸檔日志,然后重新
            recover database until cancel
            這次輸入cancel,完成不完全恢復,也就是說恢復兩次。
            如:
            SQL> recover database until cancel;
            Auto
            ……
            SQL> recover database until cancel;
            Cancel;
            5、利用alter database open resetlogs打開數據庫
            說明:
            1、這種辦法恢復的數據庫是一致的不完全恢復,會丟失當前聯機日志中的事務數據
            2、這種方法適合于歸檔數據庫并且有可用的數據庫全備份。
            3、恢復成功之后,記得再做一次數據庫的全備份。
            4、建議聯機日志文件一定要實現鏡相在不同的磁盤上,避免這種情況的發生,因為任何數據的丟失對于生產來說都是不容許的。

            如果沒有備份,進行強制性恢復
            1、打開數據庫,會遇到一個類似的錯誤
            ORA-00313: open failed for members of log group 1 of thread 1
            ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'
            ORA-27041: unable to open file
            OSD-04002: unable to open file
            O/S-Error: (OS 2) 系統找不到指定的文件

            2、查看V$log,發現是當前日志
            SQL> select group#,sequence#,archived,status from v$log;

            GROUP# SEQUENCE# ARCHIVED STATUS
            ---------- ---------- -------- ----------------
            1 1 NO CURRENT
            2 2 YES INACTIVE
            3 3 YES INACTIVE

            3、發現clear不成功
            SQL> alter database clear unarchived logfile group 1;
            alter database clear unarchived logfile group 1
            *
            ERROR at line 1:
            ORA-01624: log 1 needed for crash recovery of thread 1
            ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'

            4、把數據庫down掉
            SQL>shutdown immediate

            5、在init<sid>.ora中加入如下參數
            _allow_resetlogs_corruption=TRUE

            6、重新啟動數據庫,利用until cancel恢復
            SQL>recover database until cancel;
            Cancel
            如果出錯,不再理會,發出
            SQL>alter database open resetlogs;

            7、數據庫被打開后,馬上執行一個full export

            8、shutdown數據庫,去掉_all_resetlogs_corrupt參數

            9、重建庫

            10、import并完成恢復

            11、建議執行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
            說明:
            1、該恢復方法是沒有辦法之后的恢復方法,一般情況下建議不要采用,因為該方法可能導致數據庫的不一致
            2、該方法也丟失數據,但是丟失的數據沒有上一種方法的數據多,主要是未寫入數據文件的已提交或未提交數據。
            3、建議成功后嚴格執行以上的7到11步,完成數據庫的檢查與分析
            4、全部完成后做一次數據庫的全備份
            5、建議聯機日志文件一定要實現鏡相在不同的磁盤上,避免這種情況的發生,因為任何數據的丟失對于生產來說都是不容許的。

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

            僅列出標題
            共10頁: First 2 3 4 5 6 7 8 9 10 
            9191精品国产免费久久| 久久久久亚洲AV无码专区网站| 色综合合久久天天给综看| 日韩中文久久| 久久综合给合久久狠狠狠97色69| 久久精品国产亚洲AV高清热| 俺来也俺去啦久久综合网| 久久强奷乱码老熟女| 色偷偷88888欧美精品久久久| 99久久精品国产高清一区二区| 久久久精品国产Sm最大网站| 精品久久久久久中文字幕大豆网| 国产成人精品免费久久久久| 久久久黄片| 久久91亚洲人成电影网站| 亚洲国产成人久久精品99| 久久夜色精品国产亚洲| 99久久精品国产一区二区 | 久久久久久免费视频| 久久99精品国产| 久久婷婷成人综合色综合| 久久久久久久亚洲精品| 精品久久8x国产免费观看| 国产69精品久久久久观看软件| 麻豆精品久久精品色综合| 奇米影视7777久久精品| 亚洲国产天堂久久综合| 成人a毛片久久免费播放| 久久久女人与动物群交毛片 | 国产日韩久久免费影院| 成人国内精品久久久久一区| 少妇无套内谢久久久久| 久久久久综合国产欧美一区二区| 国内精品久久久久久99| 久久精品亚洲精品国产色婷| 久久精品国产亚洲AV影院| 亚洲国产成人乱码精品女人久久久不卡 | 久久久国产精华液| 天天爽天天爽天天片a久久网| 久久精品中文无码资源站| 久久午夜综合久久|