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

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

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

    #

    java面試30問

    第一,談談final, finally, finalize的區別。

    第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

    第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

    第四,&和&&的區別。

    第五,HashMap和Hashtable的區別。

    第六,Collection 和 Collections的區別。

    第七,什么時候用assert。

    第八,GC是什么? 為什么要有GC?

    第九,String s = new String("xyz");創建了幾個String Object?

    第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

    第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?

    第十二,sleep() 和 wait() 有什么區別?

    第十三,Java有沒有goto?

    第十四,數組有沒有length()這個方法? String有沒有length()這個方法?

    第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

    第十六,Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?

    第十七,給我一個你最常見到的runtime exception。

    第十八,error和exception有什么區別?

    第十九,List, Set, Map是否繼承自Collection接口?

    第二十,abstract class和interface有什么區別?

    第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

    第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

    第二十三,啟動一個線程是用run()還是start()?

    第二十四,構造器Constructor是否可被override?

    第二十五,是否可以繼承String類?

    第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

    第二十七,try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?

    第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

    第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

    第三十,當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?

    第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

    第三十二,編程題: 寫一個Singleton出來。

    以下是答案

    第一,談談final, finally, finalize的區別。
    final—修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載
    finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后控制就會進入 finally 塊(如果有的話)。
    finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

    第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?
    匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個接口,由另一個內部類實現。

    第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。
    Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。具體可見http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
    注: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象

    第四,&和&&的區別。
    &是位運算符。&&是布爾邏輯運算符。

    第五,HashMap和Hashtable的區別。
    都屬于Map接口的類,實現了將惟一鍵映射到特定的值上。
    HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。
    Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。

    第六,Collection 和 Collections的區別。
    Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
    Collection是個java.util下的接口,它是各種集合結構的父接口。


    第七,什么時候用assert。
    斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那么系統會報告一個 AssertionError。它用于調試目的:
    ? assert(a > 0); // throws an AssertionError if a <= 0
    斷言可以有兩種形式:????
    ? assert Expression1 ;
    ? assert Expression1 : Expression2 ;
    Expression1 應該總是產生一個布爾值。
    Expression2 可以是得出一個值的任意表達式。這個值用于生成顯示更多調試信息的 String 消息。
    斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:?
    ? javac -source 1.4 Test.java
    要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
    要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
    要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。
    可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用于驗證傳遞給私有方法的參數。不過,斷言不應該用于驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言不應該以任何方式改變程序的狀態。


    第八,GC是什么? 為什么要有GC? (基礎)。
    GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:
    ? System.gc()
    ? Runtime.getRuntime().gc()

    第九,String s = new String("xyz");創建了幾個String Object?
    兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s。

    第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
    Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

    第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
    short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

    第十二,sleep() 和 wait() 有什么區別? 搞線程的最愛
    sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級
    (b)正在運行的線程因為其它原因而阻塞。
    wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。

    ?

    第十三,Java有沒有goto?
    Goto—java中的保留字,現在沒有在java中使用。

    第十四,數組有沒有length()這個方法? String有沒有length()這個方法?
    數組沒有length()這個方法,有length的屬性。
    String有有length()這個方法。

    第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
    方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

    第十六,Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?
    Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。
    equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

    第十七,給我一個你最常見到的runtime exception。
    ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
    ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

    第十八,error和exception有什么區別?
    error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
    exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。


    第十九,List, Set, Map是否繼承自Collection接口?
    List,Set是

    Map不是

    第二十,abstract class和interface有什么區別?
    聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
    接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。


    第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
    都不能

    第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
    接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

    第二十三,啟動一個線程是用run()還是start()?
    啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

    ?

    第二十四,構造器Constructor是否可被override?
    構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

    第二十五,是否可以繼承String類?
    String類是final類故不可以繼承。

    第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
    不能,一個對象的一個synchronized方法只能由一個線程訪問。

    第二十七,try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
    會執行,在return前執行。


    第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
    有C背景的程序員特別喜歡問這種問題。

    2 << 3

    第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
    不對,有相同的hash code。

    第三十,當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
    是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。


    第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
    switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

    第三十二,編程題: 寫一個Singleton出來。
    ???? Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
    一般Singleton模式通常有幾種種形式:
    第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
    public class Singleton {
      private Singleton(){}
      //在自己內部定義自己一個實例,是不是很奇怪?
      //注意這是private 只供內部調用
      private static Singleton instance = new Singleton();
      //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問  
      public static Singleton getInstance() {
        return instance;   
       }
    }
    第二種形式:
    public class Singleton {
      private static Singleton instance = null;
      public static synchronized Singleton getInstance() {
      //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次     
      //使用時生成實例,提高了效率!
      if (instance==null)
        instance=new Singleton();
    return instance;   }
    }
    其他形式:
    定義一個類,它的構造函數為private的,所有方法為static的。
    一般認為第一種形式要更加安全些
    第三十三 Hashtable和HashMap
    Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現

    HashMap允許將null作為一個entry的key或者value,而Hashtable不允許

    還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
    多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap
    就必須為之提供外同步。

    Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。


    posted @ 2008-04-10 09:00 金家寶 閱讀(363) | 評論 (1)編輯 收藏

    javascript基礎常識

    Javascript是一種由Netscape的LiveScript發展而來的腳本語言,主要目的是為了解決服務器終端語言,比如Perl,遺留的速度問題。當時服務端需要對數據進行驗證,由于網絡速度相當緩慢,只有28.8kbps,驗證步驟浪費的時間太多。于是Netscape的瀏覽器Navigator加入了Javascript,提供了數據驗證的基本功能。

    歷史
    在1992年,Nombas開始開發一種嵌入式腳本語言,叫做C-minus-minus(Cmm)。[待續...

    能夠具有交互性,能夠包含更多活躍的元素,就有必要在網頁中嵌入其它的技術。如:Javascript、VBScript、Document Object Model(文件目標模塊)、Layers和 Cascading Style Sheets(CSS),這里主要講Javascript。那么Javascript是什么東東?Javascript就是適應動態網頁制作的需要而誕生的一種新的編程語言,如今越來越廣泛地使用于Internet網頁制作上。 Javascript是由 Netscape公司開發的一種腳本語言(scripting language),或者稱為描述語言。在HTML基礎上,使用Javascript可以開發交互式Web網頁。Javascript的出現使得網頁和用戶之間實現了一種實時性的、動態的、交互性的關系,使網頁包含更多活躍的元素和更加精彩的內容。 運行用Javascript編寫的程序需要能支持Javascript語言的瀏覽器。Netscape公司 Navigator 3.0以上版本的瀏覽器都能支持 Javascript程序,微軟公司 Internet Explorer 3.0以上版本的瀏覽器基本上支持Javascript。微軟公司還有自己開發的Javascript,稱為JScript。 Javascript和Jscript基本上是相同的,只是在一些細節上有出入。 Javascript短小精悍, 又是在客戶機上執行的,大大提高了網頁的瀏覽速度和交互能力。 同時它又是專門為制作Web網頁而量身定做的一種簡單的編程語言。

    雖然,在Dreamweaver的Behaviors可以為我們方便地使用Javascript程序而不用編寫代碼,但我們自己了解了Javascript的編程方法后,將能更加方便靈活地應用,也使Javascript的代碼更簡練。本專題通過對一系列典型程序的剖析,使你快速地掌握Javascript的編程技巧,設計出質量上乘的動態網頁打下堅實的基礎。在此之前,我們先了解一些Javascript 的基本概念。

    JavaScript 有什么特點
      JavaScript 使網頁增加互動性。JavaScript 使有規律地重復的HTML文段簡化,減少下載時間。JavaScript 能及時響應用戶的操作,對提交表單做即時的檢查,無需浪費時間交由 CGI 驗證。JavaScript 的特點是無窮無盡的,只要你有創意。

    Java 與 JavaScript 有什么不同
      很多人看到 Java 和 JavaScript 都有“Java”四個字,就以為它們是同一樣東西,連我自己當初也是這樣。其實它們是完完全全不同的兩種東西。Java,全稱應該是 Java Applet,是嵌在網頁中,而又有自己獨立的運行窗口的小程序。Java Applet 是預先編譯好的,一個 Applet 文件(.class)用 Notepad 打開閱讀,根本不能理解。Java Applet 的功能很強大,可以訪問 http、ftp等協議,甚至可以在電腦上種病毒(已有先例了)。相比之下,JavaScript 的能力就比較小了。JavaScript 是一種“腳本”(“Script”),它直接把代碼寫到 HTML 文檔中,瀏覽器讀取它們的時候才進行編譯、執行,所以能查看 HTML 源文件就能查看JavaScript 源代碼。JavaScript 沒有獨立的運行窗口,瀏覽器當前窗口就是它的運行窗口。它們的相同點,我想只有同是以 Java 作編程語言一點了。

    開發 JavaScript 該用什么軟件
      一個 JavaScript 程序其實是一個文檔,一個文本文件。它是嵌入到 HTML 文檔中的。所以,任何可以編寫 HTML 文檔的軟件都可以用來開發 JavaScript。在此我推薦大家用 FrontPage 2000 附帶的 Microsoft 腳本編輯器(在 FrontPage 菜單 | 工具 | 宏 | Microsoft 腳本編輯器)。它是個像 Visual Basic / C++ 一樣的程序開發器,能對正在輸入的語句作出簡要提示。配合 FrontPage 2000,使工作量大大減少。

    一、Javascript在網頁的用法

    Javascript加入網頁有兩種方法:

    1、直接加入HTML文檔

    這是最常用的方法,大部分含有Javascript的網頁都采用這種方法,如:

    <script language="Javascript">

    <!--

    document.writeln("這是Javascript!采用直接插入的方法!");

    //-Javascript結束-->

    </script>

    在這個例子中,我們可看到一個新的標簽: <script>……</script>,而<script language="Javascript”> 用來告訴瀏覽器這是用Javascript編寫的程序,需要調動相應的解釋程序進行解釋。

    HTML的注釋標簽<!--和-->:用來去掉瀏覽器所不能識別的Javascript源代碼的,這對不支持 Javascript 語言的瀏覽器來說是很有用的。

    //-Javascript結束:雙斜杠表示 Javascript的注釋部分,即從//開始到行尾的字符都被忽略。 至于程序中所用到的document.write()函數則表示將括號中的文字輸出到窗口中去, 這在后面將會詳細介紹。 另外一點需要注意的是,<script>……</script>的位置并不是固定的,可以包含在<head>......</head> 或<body>.....</body>中的任何地方。

    2、引用方式 如果已經存在一個Javascript源文件(以js為擴展名),則可以采用這種引用的方式,以提高程序代碼的利用率。其基本格式如下:

    <script src=url language="Javascript"></script>

    其中的Url就是程序文件的地址。同樣的,這樣的語句可以放在HTML文檔頭部或主體的任何部分。 如果要實現“直接插入方式”中所舉例子的效果,可以首先創建一個Javascript源代碼文件“Script.js”,其內容如下:

    document.writeln("這是Javascript!采用直接插入的方法!");

    在網頁中可以這樣調用程序:<script src="Script.js" language="Javascript"></script> 。

    二、Javascript基本概念

    在這里只作簡單介紹,在以后的例子中結程序再作具體解釋其作用。

    1、運算符

    運算符就是完成操和的一系列符號,它有七類:

    賦值運算符、算術運算符、比較運算符、邏輯運算符、條件運算、位操作運算符和字符串運算符。

    2、表達式

    運算符和操作數的組合稱為表達式,通常分為四類:賦值表達式、算術表達式、布爾表達式和字符串表達式。

    3、語句

    Javascript程序是由若干語句組成的,語句是編寫程序的指令。Javascript提供了完整的基本編程語句,它們是:

    賦值語句、switch選擇語句、while循環語句、for循環語句、do while循環語句、break循環中止語句和continue循環中斷語句。

    4、函數

    函數是命名的語句段,這個語句段可以被當作一個整體來引用不著和執行。使用函數要注意以下幾點:

    1)函數由關鍵字function定義;

    2)函數必須先定義后使用,否則將出錯;

    3)函數名是調用函數時引用的名稱,它對大小寫是敏感的,調用函數時不可寫錯函數名;

    4)參數表示傳遞給函數使用或操作的值,它可以是常量,也可以是變量;

    5)return語句用于返回表達式的值,也可以沒有。

    5、對象

    Javascript的一個重要功能就是基于對象的功能,通過基于對象的程序設計,可以用更直觀、模塊化和可重復使用的方式進行程序開發。

    一組包含數據的屬性和對屬性中包含數據進行操作的方法,稱為對象。比如要設定網頁的背景顏色,所針對的對象就是document,所用的屬性名是bgcolor,如document.bgcolor="blue",就是表示使背景的顏色為藍色。

    6、事件

    用戶與網頁交互時產生的操作,稱為事件。絕大部分事都由用戶的動作所引發,如:用戶按鼠標的按鈕,就產生onclick事件,若鼠標的指針的鏈接上移動,就產生onmouseover事件等等。在Javascript中,事件往往與事件處理程序配套使用。

    學習Javascript比較快速有效的方法是先熟悉一些基本概念,然后找幾個別人設計好的程序認真仔細地分析一遍,再稍作改動,再看看能否達到預期目的,不斷地舉一反三,既可以加深對一些參數、設計方法的理解,又可以快速地提高自己的水平。另外,再提醒一下:Javascript對大小寫是敏感的,特別是一些對象、方法、屬性的大小寫一定要一致,要養成一種良好的習慣,否則在調試程序時可要累死你了。

    7、變量

    如 var myVariable = "some value";



    很明顯先前的這個仁兄只是對JAVASCRIPT很厲害,他所說的JAVA其實是錯誤的
    Java是由Sun Microsystems公司于1995年5月推出的Java程序設計語言和Java平臺的總稱。用Java實現的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺、動感的Web、Internet計算。從此,Java被廣泛接受并推動了Web的迅速發展,常用的瀏覽器現在均支持Java applet。另一方面,Java技術也不斷更新。
      Java平臺由Java虛擬機(Java Virtual Machine)和Java 應用編程接口(Application Programming Interface、簡稱API)構成。Java 應用編程接口為Java應用提供了一個獨立于操作系統的標準接口,可分為基本部分和擴展部分。在硬件或操作系統平臺上安裝一個Java平臺之后,Java應用程序就可運行。現在Java平臺已經嵌入了幾乎所有的操作系統。這樣Java程序可以只編譯一次,就可以在各種系統中運行。
    ? ?? ? Java分為三個體系JavaSE,JavaEE,JavaME。

    posted @ 2008-04-09 01:47 金家寶 閱讀(307) | 評論 (0)編輯 收藏

    SQL基礎常識

    SQL全稱是“結構化查詢語言(Structured Query Language)”,最早的是IBM的圣約瑟研究實驗室為其關系數據庫管理系統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言,得到了廣泛的應用。如今無論是像Oracle ,Sybase,Informix,SQL server這些大型的數據庫管理系統,還是像Visual Foxporo,PowerBuilder這些微機上常用的數據庫開發系統,都支持SQL語言作為查詢語言。

    SQL是高級的非過程化編程語言,允許用戶在高層數據結構上工作。他不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫系統可以使用相同的SQL語言作為數據輸入與管理的接口。它以記錄集合作為操縱對象,所有SQL語句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條SQL語句的輸出作為另一條SQL語句的輸入,所以SQL語言可以嵌套,這使他具有極大的靈活性和強大的功能,在多數情況下,在其他語言中需要一大段程序實現的一個單獨事件只需要一個SQL語句就可以達到目的,這也意味著用SQL語言可以寫出非常復雜的語句。

    SQL同時也是數據庫文件格式的擴展名。

    SQL語言包含4個部分:

    數據查詢語言(SELECT語句)

    數據操縱語言(INSERT, UPDATE, DELETE語句)

    數據定義語言(如CREATE, DROP等語句)

    數據控制語言(如COMMIT, ROLLBACK等語句)

    取自"http://zh.wikipedia.org/wiki/SQL"
    SQL(STructured Query Language)是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關聯式資料庫系統。美國國家標準局(ANSI)與國際標準化組織(ISO)已經制定了 SQL 標準。ANSI 是一個美國工業和商業集團組織,發展美國的商務和通訊標準。ANSI 同時也是 ISO 和 International Electrotechnical Commission(IEC)的成員之一。ANSI 發布與國際標準組織相應的美國標準。1992年,ISO 和 IEC 發布了 SQL 的國際標準,稱為 SQL-92。ANSI 隨之發布的相應標準是 ANSI SQL-92。ANSI SQL-92 有時被稱為 ANSI SQL。盡管不同的關聯式資料庫使用的 SQL 版本有一些差異,但大多數都遵循 ANSI SQL 標準。SQL Server 使用 ANSI SQL-92 的擴展集,稱為 T-SQL,其遵循 ANSI 制定的 SQL-92 標準。

    ? ?? ?SQL 語言包括兩種主要程式設計語言類別的陳述式: 資料定義語言 (DDL)與資料操作語言 (DML)。下面我們將介紹這兩類語言。

    DDL
     

    ? ?? ?DDL 用於定義和管理物件,例如資料庫、資料表以及檢視表( 第18章 將會解釋何謂檢視表)。DDL 陳述式通常包括每個物件的CREATE、ALTER 以及 DROP 命令。舉例來說,CREATE TABLE、ALTER TABLE 以及 DROP TABLE 這些陳述式便可以用來建立新資料表、修改其屬性(如新增或刪除資料行)、刪除資料表等,下面我們會一一介紹。

    CREATE TABLE 陳述式
     

    使用 DDL 在 MyDB 資料庫建立一個名為 Customer_Data 的范例資料表,本章后面的例子我們會使用到這個資料表。如前所述,CREATE TABLE 陳述式可以用來建立資料表。這個范例資料表被定義成四個資料行,如下所示:

    Use MyDB
    CREATE TABLE Customer_Data
    (customer_id smallint,
    first_name char(20),
    last_name char(20),
    phone char(10))
    GO
    這個陳述式能產生 Customer_Data 資料表,這個資料表會一直是空的直到資料被填入資料表內。

    ALTER TABLE 陳述式
     

    ALTER TABLE 陳述式用來變更資料表的定義與屬性。在下面的例子中,我們利用 ALTER TABLE 在已經存在的 Customer_Data 資料表中新增 middle_initial 資料行。

    ALTER TABLE Customer_Data
    ADD middle_initial char(1)
    GO
    現在資料表的定義包括了五個資料行,而不是之前的四個資料行。關於使用ALTER TABLE 的更多細節,請參閱 第15章 。

    DROP TABLE 陳述式
     

    DROP TABLE 陳述式用來刪除資料表定義以及所有的資料、索引、觸發程序、條件約束以及資料表的權限。要刪除我們的 Customer_Data 資料表,可利用下列命令:

    DROP TABLE Customer_Data
    GO
    關於 DROP TABLE 陳述式的詳細內容,請參閱 第15章 。

    DML
     

    DML 利用 INSERT、SELECT、UPDATE 及 DELETE 等陳述式來操作資料庫物件所包含的資料。

    INSERT 陳述式
     

    INSERT 陳述式用來在資料表或檢視表中插入一列資料。例如,如果要在Customer_Data 資料表中新增一個客戶,可使用類似以下的 INSERT 陳述式:

    INSERT INTO Customer_Data
    (customer_id, first_name, last_name, phone)
    VALUES (777, "Frankie", "Stein", "4895873900")
    請注意 SQL 陳述式中第二行的資料行名稱清單,清單上資料行名稱的次序決定了資料數值將被放在哪個資料行。舉例來說,第一個資料數值將被放在清單列出的第一個資料行 customer_id、第二個資料數值放在第二個資料行,依此類推。由于我們在建立資料表時,定義資料資料行填入數值的次序與現在相同,因此我們不必特意指定欄位名稱。我們可以用以下的 INSERT 陳述式代替:

    INSERT INTO Customer_Data
    VALUES (777, "Frankie", "Stein", "4895873900")

    注意

    如果使用這種形式的 INSERT 陳述式,但被插入的數值次序上與建立資料表時不同,數值將被放入錯誤的資料行。如果資料的型別與定義不符,則會收到一個錯誤訊息。


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

    SELECT 陳述式
     

    SELECT 陳述式用來檢索資料表中的資料,而哪些資料被檢索由列出的資料行與陳述式中的 WHERE 子句決定。例如,要從之前建立的 Customer_Data 資料表中檢索 customer_id 以及 first_name 資料行的資料,并且只想取出每列中 first_name 資料行值為 Frankie 的資料,那麼可以利用以下的 SELECT 陳述式:

    SELECT customer_id, first_name FROM Customer_Data
    WHERE first_name = "Frankie"
    如果有一列符合 SELECT 陳述式中的標準,則結果將顯示如下:

    customer_id? ???first_name
    -------------? ? ------------
    777? ?? ?? ?? ???Frankie
    UPDATE 陳述式
     

    UPDATE 陳述式用來更新或改變一列或多列中的值。例如,一位名稱為 Frankie Stein 的客戶想要在記錄中改變他的姓氏為 Franklin,可使用以下 UPDATE 陳述式:

    UPDATE Customer_Data
    SET first_name = "Franklin"
    WHERE last_name = "Stein" and customer_id= 777
    我們在 WHERE 子句中加入 customer_id 的項目來確定其他名稱為 Stein 的客戶不會被影響-只有customer_id為777的客戶,姓氏會有所改變。

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

    說明

    當您使用 UPDATE 陳述式時,要確定在 WHERE 子句提供充分的篩選條件,如此才不會不經意地改變了一些不該改變的資料。


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

    DELETE 陳述式
     

    DELETE 陳述式用來刪除資料表中一列或多列的資料,您也可以刪除資料表中的所有資料列。要從 Customer_Data 資料表中刪除所有的列,您可以利用下列陳述式:

    DELETE FROM Customer_Data

    DELETE Customer_Data
    資料表名稱前的 FROM 關鍵字在 DELETE 陳述式中是選擇性的。除此之外,這兩個陳述式完全相同。

    要從 Customer_Data 資料表中刪除 customer_id 資料行的值小於100的列,可利用下列陳述式:

    DELETE FROM Customer_Data
    WHERE customer_id &lt; 100
    現在我們已經快速瀏覽了 SQL 提供的 DDL 與 DML 陳述式,接著,下面將介紹 T-SQL。

    SQL中的五種數據類型??

    簡要描述一下SQL中的五種數據類型:字符型,文本型,數值型,邏輯型和日期型

    字符型

    VARCHAR VS CHAR

    VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字符串長度小于255的字符。

    假如你向一個長度為四十個字符的VARCHAR型字段中輸入數據BIll GAtES。當你以后從這個字段中取出此數據時,你取出的數據其長度為十個字符——字符串Bill Gates的長度。 現在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那么當你取出數據時,所取出的數據長度將是四十個字符。字符串的后面會被附加多余的空格。

    當你建立自己的站點時,你會發現使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不需要為剪掉你數據中多余的空格而操心。

    VARCHAR型字段的另一個突出的好處是它可以比CHAR型字段占用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得非常重要

    文本型

    TEXT

    使用文本型數據,你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。

    注意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據通常要么為空,要么很大。

    當你從HTML fORM的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲于文本型字段中。但是,無論何時,只要你能避免使用文本型字段,你就應該不適用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間。

    一旦你向文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。

    數值型

    SQL支持許多種不同的數值型數據。你可以存儲整數 INT 、小數 NUMERIC、和錢數 MONEY。

    INT VS SMALLINT VS TINYINT

    他們的區別只是字符長度:

    INT型數據的表數范圍是從-2,147,483,647到2,147,483,647的整數

    SMALLINT 型數據可以存儲從-32768到32768的整數

    TINYINT 型的字段只能存儲從0到255的整數,不能用來儲存負數

    通常,為了節省空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據只占用一個字節;一個INT型數據占用四個字節。這看起來似乎差別不大,但是在比較大的表中,字節數的增長是很快的。另一方面,一旦你已經創建了一個字段,要修改它是很困難的。因此,為安全起見,你應該預測以下,一個字段所需要存儲的數值最大有可能是多大,然后選擇適當的數據類型。

    NUMERIC

    為了能對字段所存放的數據有更多的控制,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型字段可以存儲從-1038到1038范圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型字段中存儲小數3.14。

    當定義一個NUMERIC型字段時,你需要同時指定整數部分的大小和小數部分的大小。如:MUNERIC(23,0)

    一個 NUMERIC型數據的整數部分最大只能有28位,小數部分的位數必須小于或等于整數部分的位數,小數部分可以是零。

    MONEY VS SMALLMONEY

    你可以使用 INT型或NUMERIC型數據來存儲錢數。但是,專門有另外兩種數據類型用于此目的。如果你希望你的網點能掙很多錢,你可以使用MONEY型數據。如果你的野心不大,你可以使用SMALLMONEY型數據。MONEY型數據可以存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數。如果你需要存儲比這還大的金額,你可以使用NUMERIC型數據。

    SMALLMONEY型數據只能存儲從-214,748.3648到214,748.3647 的錢數。同樣,如果可以的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間。

    邏輯型

    BIT

    如果你使用復選框( CHECKBOX)從網頁中搜集信息,你可以把此信息存儲在BIT型字段中。BIT型字段只能取兩個值:0或1。

    當心,在你創建好一個表之后,你不能向表中添加 BIT型字段。如果你打算在一個表中包含BIT型字段,你必須在創建表時完成。

    日期型

    DATETIME VS SMALLDATETIME

    一個 DATETIME型的字段可以存儲的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最后一毫秒。

    如果你不需要覆蓋這么大范圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,只不過它能表示的日期和時間范圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。

    DATETIME型字段在你輸入日期和時間之前并不包含實際的數據,認識這一點是重要的。

    posted @ 2008-04-09 01:08 金家寶 閱讀(275) | 評論 (0)編輯 收藏

    SQL基礎常識

    SQL全稱是“結構化查詢語言(Structured Query Language)”,最早的是IBM的圣約瑟研究實驗室為其關系數據庫管理系統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言,得到了廣泛的應用。如今無論是像Oracle ,Sybase,Informix,SQL server這些大型的數據庫管理系統,還是像Visual Foxporo,PowerBuilder這些微機上常用的數據庫開發系統,都支持SQL語言作為查詢語言。

    SQL是高級的非過程化編程語言,允許用戶在高層數據結構上工作。他不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫系統可以使用相同的SQL語言作為數據輸入與管理的接口。它以記錄集合作為操縱對象,所有SQL語句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條SQL語句的輸出作為另一條SQL語句的輸入,所以SQL語言可以嵌套,這使他具有極大的靈活性和強大的功能,在多數情況下,在其他語言中需要一大段程序實現的一個單獨事件只需要一個SQL語句就可以達到目的,這也意味著用SQL語言可以寫出非常復雜的語句。

    SQL同時也是數據庫文件格式的擴展名。

    SQL語言包含4個部分:

    數據查詢語言(SELECT語句)

    數據操縱語言(INSERT, UPDATE, DELETE語句)

    數據定義語言(如CREATE, DROP等語句)

    數據控制語言(如COMMIT, ROLLBACK等語句)

    取自"http://zh.wikipedia.org/wiki/SQL"
    SQL(STructured Query Language)是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關聯式資料庫系統。美國國家標準局(ANSI)與國際標準化組織(ISO)已經制定了 SQL 標準。ANSI 是一個美國工業和商業集團組織,發展美國的商務和通訊標準。ANSI 同時也是 ISO 和 International Electrotechnical Commission(IEC)的成員之一。ANSI 發布與國際標準組織相應的美國標準。1992年,ISO 和 IEC 發布了 SQL 的國際標準,稱為 SQL-92。ANSI 隨之發布的相應標準是 ANSI SQL-92。ANSI SQL-92 有時被稱為 ANSI SQL。盡管不同的關聯式資料庫使用的 SQL 版本有一些差異,但大多數都遵循 ANSI SQL 標準。SQL Server 使用 ANSI SQL-92 的擴展集,稱為 T-SQL,其遵循 ANSI 制定的 SQL-92 標準。

    ? ?? ?SQL 語言包括兩種主要程式設計語言類別的陳述式: 資料定義語言 (DDL)與資料操作語言 (DML)。下面我們將介紹這兩類語言。

    DDL
     

    ? ?? ?DDL 用於定義和管理物件,例如資料庫、資料表以及檢視表( 第18章 將會解釋何謂檢視表)。DDL 陳述式通常包括每個物件的CREATE、ALTER 以及 DROP 命令。舉例來說,CREATE TABLE、ALTER TABLE 以及 DROP TABLE 這些陳述式便可以用來建立新資料表、修改其屬性(如新增或刪除資料行)、刪除資料表等,下面我們會一一介紹。

    CREATE TABLE 陳述式
     

    使用 DDL 在 MyDB 資料庫建立一個名為 Customer_Data 的范例資料表,本章后面的例子我們會使用到這個資料表。如前所述,CREATE TABLE 陳述式可以用來建立資料表。這個范例資料表被定義成四個資料行,如下所示:

    Use MyDB
    CREATE TABLE Customer_Data
    (customer_id smallint,
    first_name char(20),
    last_name char(20),
    phone char(10))
    GO
    這個陳述式能產生 Customer_Data 資料表,這個資料表會一直是空的直到資料被填入資料表內。

    ALTER TABLE 陳述式
     

    ALTER TABLE 陳述式用來變更資料表的定義與屬性。在下面的例子中,我們利用 ALTER TABLE 在已經存在的 Customer_Data 資料表中新增 middle_initial 資料行。

    ALTER TABLE Customer_Data
    ADD middle_initial char(1)
    GO
    現在資料表的定義包括了五個資料行,而不是之前的四個資料行。關於使用ALTER TABLE 的更多細節,請參閱 第15章 。

    DROP TABLE 陳述式
     

    DROP TABLE 陳述式用來刪除資料表定義以及所有的資料、索引、觸發程序、條件約束以及資料表的權限。要刪除我們的 Customer_Data 資料表,可利用下列命令:

    DROP TABLE Customer_Data
    GO
    關於 DROP TABLE 陳述式的詳細內容,請參閱 第15章 。

    DML
     

    DML 利用 INSERT、SELECT、UPDATE 及 DELETE 等陳述式來操作資料庫物件所包含的資料。

    INSERT 陳述式
     

    INSERT 陳述式用來在資料表或檢視表中插入一列資料。例如,如果要在Customer_Data 資料表中新增一個客戶,可使用類似以下的 INSERT 陳述式:

    INSERT INTO Customer_Data
    (customer_id, first_name, last_name, phone)
    VALUES (777, "Frankie", "Stein", "4895873900")
    請注意 SQL 陳述式中第二行的資料行名稱清單,清單上資料行名稱的次序決定了資料數值將被放在哪個資料行。舉例來說,第一個資料數值將被放在清單列出的第一個資料行 customer_id、第二個資料數值放在第二個資料行,依此類推。由于我們在建立資料表時,定義資料資料行填入數值的次序與現在相同,因此我們不必特意指定欄位名稱。我們可以用以下的 INSERT 陳述式代替:

    INSERT INTO Customer_Data
    VALUES (777, "Frankie", "Stein", "4895873900")

    注意

    如果使用這種形式的 INSERT 陳述式,但被插入的數值次序上與建立資料表時不同,數值將被放入錯誤的資料行。如果資料的型別與定義不符,則會收到一個錯誤訊息。


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

    SELECT 陳述式
     

    SELECT 陳述式用來檢索資料表中的資料,而哪些資料被檢索由列出的資料行與陳述式中的 WHERE 子句決定。例如,要從之前建立的 Customer_Data 資料表中檢索 customer_id 以及 first_name 資料行的資料,并且只想取出每列中 first_name 資料行值為 Frankie 的資料,那麼可以利用以下的 SELECT 陳述式:

    SELECT customer_id, first_name FROM Customer_Data
    WHERE first_name = "Frankie"
    如果有一列符合 SELECT 陳述式中的標準,則結果將顯示如下:

    customer_id? ???first_name
    -------------? ? ------------
    777? ?? ?? ?? ???Frankie
    UPDATE 陳述式
     

    UPDATE 陳述式用來更新或改變一列或多列中的值。例如,一位名稱為 Frankie Stein 的客戶想要在記錄中改變他的姓氏為 Franklin,可使用以下 UPDATE 陳述式:

    UPDATE Customer_Data
    SET first_name = "Franklin"
    WHERE last_name = "Stein" and customer_id= 777
    我們在 WHERE 子句中加入 customer_id 的項目來確定其他名稱為 Stein 的客戶不會被影響-只有customer_id為777的客戶,姓氏會有所改變。

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

    說明

    當您使用 UPDATE 陳述式時,要確定在 WHERE 子句提供充分的篩選條件,如此才不會不經意地改變了一些不該改變的資料。


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

    DELETE 陳述式
     

    DELETE 陳述式用來刪除資料表中一列或多列的資料,您也可以刪除資料表中的所有資料列。要從 Customer_Data 資料表中刪除所有的列,您可以利用下列陳述式:

    DELETE FROM Customer_Data

    DELETE Customer_Data
    資料表名稱前的 FROM 關鍵字在 DELETE 陳述式中是選擇性的。除此之外,這兩個陳述式完全相同。

    要從 Customer_Data 資料表中刪除 customer_id 資料行的值小於100的列,可利用下列陳述式:

    DELETE FROM Customer_Data
    WHERE customer_id &lt; 100
    現在我們已經快速瀏覽了 SQL 提供的 DDL 與 DML 陳述式,接著,下面將介紹 T-SQL。

    SQL中的五種數據類型??

    簡要描述一下SQL中的五種數據類型:字符型,文本型,數值型,邏輯型和日期型

    字符型

    VARCHAR VS CHAR

    VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字符串長度小于255的字符。

    假如你向一個長度為四十個字符的VARCHAR型字段中輸入數據BIll GAtES。當你以后從這個字段中取出此數據時,你取出的數據其長度為十個字符——字符串Bill Gates的長度。 現在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那么當你取出數據時,所取出的數據長度將是四十個字符。字符串的后面會被附加多余的空格。

    當你建立自己的站點時,你會發現使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不需要為剪掉你數據中多余的空格而操心。

    VARCHAR型字段的另一個突出的好處是它可以比CHAR型字段占用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得非常重要

    文本型

    TEXT

    使用文本型數據,你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。

    注意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據通常要么為空,要么很大。

    當你從HTML fORM的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲于文本型字段中。但是,無論何時,只要你能避免使用文本型字段,你就應該不適用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間。

    一旦你向文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。

    數值型

    SQL支持許多種不同的數值型數據。你可以存儲整數 INT 、小數 NUMERIC、和錢數 MONEY。

    INT VS SMALLINT VS TINYINT

    他們的區別只是字符長度:

    INT型數據的表數范圍是從-2,147,483,647到2,147,483,647的整數

    SMALLINT 型數據可以存儲從-32768到32768的整數

    TINYINT 型的字段只能存儲從0到255的整數,不能用來儲存負數

    通常,為了節省空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據只占用一個字節;一個INT型數據占用四個字節。這看起來似乎差別不大,但是在比較大的表中,字節數的增長是很快的。另一方面,一旦你已經創建了一個字段,要修改它是很困難的。因此,為安全起見,你應該預測以下,一個字段所需要存儲的數值最大有可能是多大,然后選擇適當的數據類型。

    NUMERIC

    為了能對字段所存放的數據有更多的控制,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型字段可以存儲從-1038到1038范圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型字段中存儲小數3.14。

    當定義一個NUMERIC型字段時,你需要同時指定整數部分的大小和小數部分的大小。如:MUNERIC(23,0)

    一個 NUMERIC型數據的整數部分最大只能有28位,小數部分的位數必須小于或等于整數部分的位數,小數部分可以是零。

    MONEY VS SMALLMONEY

    你可以使用 INT型或NUMERIC型數據來存儲錢數。但是,專門有另外兩種數據類型用于此目的。如果你希望你的網點能掙很多錢,你可以使用MONEY型數據。如果你的野心不大,你可以使用SMALLMONEY型數據。MONEY型數據可以存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數。如果你需要存儲比這還大的金額,你可以使用NUMERIC型數據。

    SMALLMONEY型數據只能存儲從-214,748.3648到214,748.3647 的錢數。同樣,如果可以的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間。

    邏輯型

    BIT

    如果你使用復選框( CHECKBOX)從網頁中搜集信息,你可以把此信息存儲在BIT型字段中。BIT型字段只能取兩個值:0或1。

    當心,在你創建好一個表之后,你不能向表中添加 BIT型字段。如果你打算在一個表中包含BIT型字段,你必須在創建表時完成。

    日期型

    DATETIME VS SMALLDATETIME

    一個 DATETIME型的字段可以存儲的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最后一毫秒。

    如果你不需要覆蓋這么大范圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,只不過它能表示的日期和時間范圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。

    DATETIME型字段在你輸入日期和時間之前并不包含實際的數據,認識這一點是重要的。

    posted @ 2008-04-09 01:08 金家寶 閱讀(221) | 評論 (0)編輯 收藏

    關于sql的執行計劃(推薦詳細)

    剛開始用SQL Server的時候,我沒有用顯示執行計劃來對查詢進行分析。我曾經一直認為我遞交的SQL查詢都是最優的,而忽略了查詢性能究竟如何,從而對“執行計劃”重視不夠。在我職業初期,我只要能獲取數據就很開心,而不去考慮數據是如何返回的,“執行計劃”對我的查詢作了什么工作。我以為SQL Server會自己去處理查詢的性能問題的。作為一個剛進入IT行業或者剛學到新技術的軟件工程師,在編寫代碼前不太可能有時間去學習其實必須掌握的知識。也許這是因為IT行業競爭太激烈的緣故。

    隨著時間的流逝,數據庫容量慢慢變大了。終于某天,客戶對應用系統的查詢性能感到不滿意了。他面帶怒容來找我,抱怨由于查詢太慢,使得他需要花更多的時間來處理公務。最初,我建議客戶升級其系統資源,例如作為臨時解決方案,增加硬盤容量。雖然硬盤價格現在很便宜了,但是客戶還是要求我提供一個永久性的解決方案,檢查和好好調試查詢語句,來替代那種無休止地升級資源的臨時方案。因為客戶的滿意度對IT行業來說是十分重要的,因此我不得不考慮他的個人建議。我答應他一定會檢查和調整我的代碼。


    如何入手呢?

    在剛進入IT行業時,我知道SQL Server的基礎只是。說實話,向客戶承諾檢查系統的時候,我還沒有一點入手的頭緒。不過我相信我可以通過GOOGL和BOL來獲取相應的信息。

    我閱讀了一些關于SQL Server的書籍,BOL,以及在網上搜索的信息。于是我知道了“顯示執行計劃”的概念。可以在查詢管理器中將該選項的開關設置為ON。“顯示執行計劃”是一個圖形化工具,可以幫助開發者和DBA分析,優化查詢,從而改善性能。

    “顯示執行計劃”中不同的任務具有不同的圖標。本文中我主要對“Table Scan”、“Index Scan”、“Index Seek”、“Cluster Index Scan”以及“Clustered Index Seek”感興趣。也許在以后,可以對別的任務進行另外介紹。

    時間以F1方程式的速度開始流逝,我覺得該是我全面理解“Table Scan”、“Index Scan”、“Index Seek”、“Clustered Index Scan”、和“Clustered Index Seek”如何工作的時候了。

    我準備開始分析并優化我的查詢。在分析之前,我想到了一些問題。

    • MS-SQL Server什么時候使用"Table Scan"?
    • MS-SQL Server什么時候使用"Index Scan"?
    • MS-SQL Server什么時候使用"Index Seek"?
    • MS-SQL Server什么時候使用"Clustered Index Scan"?
    • MS-SQL Server什么時候使用"Clustered Index Seek"?

    ?

    我主要關注SQL Server是根據什么來使用“執行計劃”分析查詢的。在經過一段時間學習后,我了解了一些相關知識。這些知識應該對開發和DBA新手有幫助。于是我決定寫這篇文章,共享我的知識以幫助別人來理解“執行計劃”。

    如果你喜歡,可以慢慢讀完,也可以在SQL Server上,模擬我下面做的實驗。


    開始入手

    為了解釋“顯示執行計劃”中的“Table Scan”、“Index Scan”、“Index Seek”、“Clustered Index Scan”和“Clustered Index Seek”,先創建新表,并添加一些示例數據進去。下面是創建新表的腳本:

    ?

    Create Table PerformanceIssue
    (
    ????PRID UniqueIdentifier NOT NULL,
    ????PRCode Int NOT NULL,
    ????PRDesc Varchar (100) NOT NULL
    )
    ON [PRIMARY]

    ?

    表創建后需要添加一些數據。使用下面的腳本添加100,000條記錄進去。腳本執行時間可能比較長,請耐心等待其執行完畢。

    ?

    Declare @Loop Int
    Declare @PRID UniqueIdentifier
    Declare @ PRDesc Varchar (100)

    Set @Loop = 1
    Set @ PRDesc = ''

    WHILE @Loop <= 100000
    BEGIN
    ?? Set @PRID = NewID()
    ?? Set @PRDesc = ' PerformanceIssue - ' + Convert( Varchar(10),@Loop )
    ?? Insert Into PerformanceIssue Values (@PRID, @Loop, @PRDesc)
    ?? Set @Loop = @Loop + 1
    END

    ?

    腳本成功執行后,數據就添加進去了。

    用下面語句來看一下表的內容:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    GO

    ?

    由于記錄較長,因此這里就不列出查詢結果了。

    正如我前面講到,我想解釋何時會有“Table Scan”、“Index Scan”、“Index Seek”、“Clustered Index Scan”和“Clustered Index Seek”。上述哪個會改善性能呢?

    當SQL Server返回數據時,我們想知道SQL Server采取何種掃描機制來協助獲取數據。首先看一下“Table Scan”。我們想了解什么時候“Table Scan”會產生。

    選擇“顯示執行計劃”或者使用熱鍵“Alt + Q”來激活“顯示執行計劃”,當然也可以用快捷鍵“Ctrl+K”。

    看一下執行下面查詢后的“執行計劃”結果。

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    GO


    上面的“執行計劃”中,SQL Server用到了“Table Scan”。我問自己為什么會有“Table Scan”,SQL Server是根據什么來使用該方法的。難道是因為我想獲取所有100,000條記錄嗎?于是我換了一個角度進行思考,如果來避免查詢中出現“Table Scan”呢?此時我對SQL Server的掃描機制還不是很清楚,那么該如何優化查詢呢?下面的SELECT查詢中僅選擇兩列:[PRID, PRCode]。

    ?

    Select PRID, PRCode
    From PerformanceIssue
    GO


    查詢執行后,執行計劃和第一個查詢一樣。于是將查詢改變為只檢索一個字段 [PRID]。

    ?

    Select PRID
    From PerformanceIssue

    GO


    查詢執行后,執行計劃仍然和第一個查詢的相同。對“Estimated row size”屬性不需要太大關注。意思我立刻決定只獲取一條記錄,看看執行計劃會如何。查詢語句如下:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRID = 'D386C151-5F74-4C2A-B527-86FEF9712955'
    -- PRID GUID value might be differ in your machine

    GO

    ?

    執行完成后,執行計劃顯示:

    查詢仍然使用了“Table Scan”方法來顯示數據。

    那么,我需要想其它辦法來避免“Table Scan”。首先我想到應該給表加上索引。于是我在PRID字段上創建非聚集索引。添加了索引后是否就能避免“Table Scan”?下面我們開始討論關于“Index Scan”和“Index Seek”的主題。


    Index Scan 和 Index Seek

    首先在PRID字段上創建非聚集索引。

    ?

    CREATE UNIQUE NONCLUSTERED INDEX UNC_PRID
    ON PerformanceIssue (PRID)
    GO

    ?

    本文假定讀者已經知道非聚集索引如何工作的知識。了解非聚集索引更詳細的信息,請閱讀BOL相關主題,也可參看 http://www.sql-server-performance.com/gv_index_data_structures.asp。下面我們詳細講述“Index Scan”是如何工作的。

    執行下面語句并查看執行計劃的結果。

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    GO


    奇怪了,“Table Scan”仍然用到了。為什么SQL Server沒有用到那個非聚集索引?于是繼續優化查詢語句,選擇檢索兩個字段 [PRID, PRCode] 。

    ?

    Select PRID, PRCode From PerformanceIssue
    GO


    執行結果是和上一個查詢結果一摸一樣。于是修改查詢為只檢索一個字段 [PRID] 。

    ?

    Select PRID
    From PerformanceIssue
    GO

    ?

    執行計劃結果如下:

    “Index Scan”在查詢中被用到了,這很好。很自然,接下來的問題就是“Index Scan”什么時候會被用到。字段PRID上有一個索引,查詢語句中選中的字段為PRID。執行查詢的時候,SQL Server掃描索引頁,因此用到了“Index Scan”方法。前面的查詢中選擇了有索引的和沒有索引的字段,SQL Server無法使用“Index Scan”。當查詢中只選擇有索引的字段時,SQL Server就使用了“Index Scan”。我不清楚SQL Server底層到底是如何判斷的,不過通過這些試驗,我認為當查詢中只選擇有索引的字段時,SQL Server就使用“Index Scan”方法

    下面看“Index Seek”方法何時產生。當我看到“Seek”這個詞時,第一反應就是條件查詢這個主意。

    我嘗試三種不同的帶WHERE語法的查詢語句,以找出那種會用“Index Seek”。第一種語句如下:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRCode = 8
    GO

    ?

    結果顯示,執行計劃使用了“Table Scan”。

    第二種語句如下:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRDesc = ' PerformanceIssue - 8'
    GO

    ?

    執行計劃仍然使用“Table Scan”方法。

    第三種查詢語句如下:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRID = 'D386C151-5F74-4C2A-B527-86FEF9712955'

    -- PRID GUID value might be differ in your machine
    GO



    查詢用到了“Index Seek”和“Bookmark Lookup”方法。用到“Index Seek”是因為WHERE后面使用帶索引的字段PRID來進行過濾。“Bookmark Lookup”方法被用到是因為查詢中選擇了沒有索引的字段。如果去掉這兩個沒有索引的字段,那么“Bookmark Lookup”方法就可以去掉。當然如果只返回PRID字段,那么該查詢就沒什么意義了,因為WHERE語句后面已經給出PRID具體取值了。

    我認為“Index Seek”在性能改善上比“Index Scan”和“Table Scan”要好,這主要表現在下面幾個方面:

    ?

    1. “Index Seek”不需要對表和索引頁進行掃描;而“Table Scan”和“Index Scan”需要。
    2. “Index Seek”利用“WHERE”來過濾獲取的數據,這樣比用“Index Scan”和“Table Scan”快很多。

    ?

    當我完成這些測試后,我同事問我一個很有意思的問題:SQL Server什么時候使用“Clustered Index Scan”和“Clustered Index Seek”?下面對“Clustered Index Scan”和“Clustered Index Seek”進行實驗。

    我決定在PRCode上建一個聚集索引來測試“Clustered Index Scan”和“Clustered Index Seek”。


    Clustered Index Scan & Clustered Index Seek

    下面的腳本刪除PRID字段上的索引,并在PRCode字段上創建聚集索引。

    ?

    Drop Index PerformanceIssue.UNC_PRID
    GO
    CREATE UNIQUE CLUSTERED INDEX UC_PRCode
    ON PerformanceIssue( PRCode)
    GO
    -------------
    Clustered index has been created successfully.
    Index has been created.

    ?

    關于聚集索引的基礎知識請查閱聯機幫助的相關主題或者 http://www.sql-server-performance.com/gv_index_data_structures.asp。下面我們將重點放在“Clustered Index Scan”和“Clustered Index Seek”如何被使用上。

    執行下面查詢語句:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    GO

    ?

    查詢執行后,可以看到執行計劃中用到了“Clustered Index Scan”。

    下面用三種不同的WHERE方式來試驗何時SQL Server會用到“Clustered Index Seek”。第一種形式如下:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRDesc = ' PerformanceIssue - 8'
    GO

    ?

    查詢執行后,可以看到執行計劃中用到了“Clustered Index Scan”。

    第二種形式如下:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRID = 'D386C151-5F74-4C2A-B527-86FEF9712955'

    -- PRID GUID value might be differ in your machine
    GO

    ?

    查詢執行后,發現執行計劃中用到的仍然是“Clustered Index Scan”。

    第三種形式:

    ?

    Select PRID, PRCode, PRDesc
    From PerformanceIssue
    Where PRCode = 8
    GO

    ?

    這次執行計劃用到了“Clustered Index Seek”。

    當在WHERE后用到PRCode字段的時候,“Clustered Index Seek”被用到。執行計劃對聚集索引表檢索的時候,因為在選取的字段中,包括沒有索引的字段,所以不用用到“Bookmark Lookup”方法。

    我個人認為,從改善性能角度考慮,“Clustered Index Seek”比“Clustered Index Scan”和“Index Seek”要好。

    ?

    1. “Clustered Index Seek”不需要掃描整個聚集索引頁。
    2. 和“Index Scan”相比,對于檢索選擇的字段包含那些沒有索引的字段時,“Clustered Index Seek”不會有“Bookmark Lookup”方法出現。

    ?

    通過這些試驗,我對執行計劃的應用積累了實際經驗。我知道哪種掃描機制可以提高性能,從而是的客戶滿意。

    ?

    posted @ 2008-04-08 23:38 金家寶 閱讀(20342) | 評論 (8)編輯 收藏

    怎樣查看sql的執行計劃||如何啟用AutoTrace 查看SQL執行計劃

    怎樣查看sql的執行計劃

    如何啟用AutoTrace 查看SQL執行計劃

    通過以下方法可以把Autotrace的權限授予Everyone,
    如果你需要限制Autotrace權限,可以把對public的授權改為對特定user的授權。


    D:\oracle\ora92>sqlplus /nolog
    SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 6月 3 15:16:03 2003
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
    SQL> connect sys as sysdba
    請輸入口令:
    已連接。
    SQL> [b]@?\rdbms\admin\utlxplan[/b]
    表已創建。
    SQL> create public synonym plan_table for plan_table;
    同義詞已創建。
    SQL> grant all on plan_table to public ;
    授權成功。
    SQL>[b] @?\sqlplus\admin\plustrce[/b]
    SQL>
    SQL> drop role plustrace;
    drop role plustrace
    *
    ERROR 位于第 1 行:
    ORA-01919: 角色'PLUSTRACE'不存在
    SQL> create role plustrace;
    角色已創建
    SQL>
    SQL> grant select on v_$sesstat to plustrace;
    授權成功。
    SQL> grant select on v_$statname to plustrace;
    授權成功。
    SQL> grant select on v_$session to plustrace;
    授權成功。
    SQL> grant plustrace to dba with admin option;
    授權成功。
    SQL>
    SQL> set echo off


    DBA用戶首先被授予了plustrace角色,然后我們可以把plustrace授予public
    這樣所有用戶都將擁有plustrace角色的權限.


    SQL> [b]grant plustrace to public ;[/b]

    授權成功。
    然后我們就可以使用AutoTrace的功能了.


    SQL> connect eqsp/eqsp
    已連接。
    SQL> set autotrace on
    SQL> set timing on
    SQL>


    關于Autotrace幾個常用選項的說明:
    SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是缺省模式
    SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只顯示優化器執行路徑報告
    SET AUTOTRACE ON STATISTICS -- 只顯示執行統計信息
    SET AUTOTRACE ON ----------------- 包含執行計劃和統計信息
    SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不顯示查詢輸出

    SQL> set autotrace traceonly
    SQL> select table_name from user_tables;
    已選擇98行。
    已用時間: 00: 00: 00.04
    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 NESTED LOOPS
    2 1 NESTED LOOPS (OUTER)
    3 2 NESTED LOOPS (OUTER)
    4 3 NESTED LOOPS (OUTER)
    5 4 NESTED LOOPS (OUTER)
    6 5 NESTED LOOPS
    7 6 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
    8 7 INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
    9 6 TABLE ACCESS (CLUSTER) OF 'TAB$'
    10 9 INDEX (UNIQUE SCAN) OF 'I_OBJ#' (NON-UNIQUE)
    11 5 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
    12 11 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
    13 4 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
    14 3 TABLE ACCESS (CLUSTER) OF 'USER$'
    15 14 INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
    16 2 TABLE ACCESS (CLUSTER) OF 'SEG$'
    17 16 INDEX (UNIQUE SCAN) OF 'I_FILE#_BLOCK#' (NON-UNIQUE)
    18 1 TABLE ACCESS (CLUSTER) OF 'TS$'
    19 18 INDEX (UNIQUE SCAN) OF 'I_TS#' (NON-UNIQUE)

    Statistics
    ----------------------------------------------------------
    0 recursive calls
    0 db block gets
    1389 consistent gets
    0 physical reads
    0 redo size
    2528 bytes sent via SQL*Net to client
    569 bytes received via SQL*Net from client
    8 SQL*Net roundtrips to/from client
    0 sorts (memory)
    0 sorts (disk)
    98 rows processed
    SQL>

    posted @ 2008-04-08 23:32 金家寶 閱讀(294) | 評論 (0)編輯 收藏

    怎樣查看sql的執行計劃||如何啟用AutoTrace 查看SQL執行計劃

    怎樣查看sql的執行計劃

    如何啟用AutoTrace 查看SQL執行計劃

    通過以下方法可以把Autotrace的權限授予Everyone,
    如果你需要限制Autotrace權限,可以把對public的授權改為對特定user的授權。


    D:\oracle\ora92>sqlplus /nolog
    SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 6月 3 15:16:03 2003
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
    SQL> connect sys as sysdba
    請輸入口令:
    已連接。
    SQL> [b]@?\rdbms\admin\utlxplan[/b]
    表已創建。
    SQL> create public synonym plan_table for plan_table;
    同義詞已創建。
    SQL> grant all on plan_table to public ;
    授權成功。
    SQL>[b] @?\sqlplus\admin\plustrce[/b]
    SQL>
    SQL> drop role plustrace;
    drop role plustrace
    *
    ERROR 位于第 1 行:
    ORA-01919: 角色'PLUSTRACE'不存在
    SQL> create role plustrace;
    角色已創建
    SQL>
    SQL> grant select on v_$sesstat to plustrace;
    授權成功。
    SQL> grant select on v_$statname to plustrace;
    授權成功。
    SQL> grant select on v_$session to plustrace;
    授權成功。
    SQL> grant plustrace to dba with admin option;
    授權成功。
    SQL>
    SQL> set echo off


    DBA用戶首先被授予了plustrace角色,然后我們可以把plustrace授予public
    這樣所有用戶都將擁有plustrace角色的權限.


    SQL> [b]grant plustrace to public ;[/b]

    授權成功。
    然后我們就可以使用AutoTrace的功能了.


    SQL> connect eqsp/eqsp
    已連接。
    SQL> set autotrace on
    SQL> set timing on
    SQL>


    關于Autotrace幾個常用選項的說明:
    SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是缺省模式
    SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只顯示優化器執行路徑報告
    SET AUTOTRACE ON STATISTICS -- 只顯示執行統計信息
    SET AUTOTRACE ON ----------------- 包含執行計劃和統計信息
    SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不顯示查詢輸出

    SQL> set autotrace traceonly
    SQL> select table_name from user_tables;
    已選擇98行。
    已用時間: 00: 00: 00.04
    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 NESTED LOOPS
    2 1 NESTED LOOPS (OUTER)
    3 2 NESTED LOOPS (OUTER)
    4 3 NESTED LOOPS (OUTER)
    5 4 NESTED LOOPS (OUTER)
    6 5 NESTED LOOPS
    7 6 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
    8 7 INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
    9 6 TABLE ACCESS (CLUSTER) OF 'TAB$'
    10 9 INDEX (UNIQUE SCAN) OF 'I_OBJ#' (NON-UNIQUE)
    11 5 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
    12 11 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
    13 4 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
    14 3 TABLE ACCESS (CLUSTER) OF 'USER$'
    15 14 INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
    16 2 TABLE ACCESS (CLUSTER) OF 'SEG$'
    17 16 INDEX (UNIQUE SCAN) OF 'I_FILE#_BLOCK#' (NON-UNIQUE)
    18 1 TABLE ACCESS (CLUSTER) OF 'TS$'
    19 18 INDEX (UNIQUE SCAN) OF 'I_TS#' (NON-UNIQUE)

    Statistics
    ----------------------------------------------------------
    0 recursive calls
    0 db block gets
    1389 consistent gets
    0 physical reads
    0 redo size
    2528 bytes sent via SQL*Net to client
    569 bytes received via SQL*Net from client
    8 SQL*Net roundtrips to/from client
    0 sorts (memory)
    0 sorts (disk)
    98 rows processed
    SQL>

    posted @ 2008-04-08 23:32 金家寶 閱讀(677) | 評論 (0)編輯 收藏

    對于drop procedure 時hang住的問題

    問題:在drop procedure的時候發現一直沒反應,查詢原因
    SQL> conn sys/pwd@sid as sysdba
    已連接。
    SQL> oradebug username
    ORA-00070: 命令gdyf無效
    SQL> oradebug setmypid
    已處理的語句
    SQL> oradebug hanganalyze 3
    Hang Analysis in d:\oracle\admin\oracle\udump\oracle_ora_3200.trc
    內容如下:
    Dump file d:\oracle\admin\oracle\udump\oracle_ora_3200.trc
    Tue Mar 18 15:39:01 2008
    ORACLE V9.2.0.5.0 - Production vsnsta=0
    vsnsql=12 vsnxtr=3
    Windows 2000 Version 5.0 Service Pack 4, CPU type 586
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.5.0 - Production
    Windows 2000 Version 5.0 Service Pack 4, CPU type 586
    Instance name: oracle
    Redo thread mounted by this instance: 1
    Oracle process number: 82
    Windows thread id: 3200, image: ORACLE.EXE
    *** SESSION ID:(26.2234) 2008-03-18 15:39:01.390
    *** 2008-03-18 15:39:01.390
    ==============
    HANG ANALYSIS:
    ==============
    Open chains found:
    Chain 1 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/48/20150/0x45a2b2e8/3336/No Wait>
    -- <0/40/11993/0x45a29c68/3284/library cache lock>
    Other chains found:
    Chain 2 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/8/1/0x45a1ca68/2796/wakeup time manager>
    Chain 3 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/26/2234/0x45a2dc28/3200/No Wait>
    Chain 4 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/29/2338/0x45a25528/672/db file sequential read>
    Chain 5 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/30/23502/0x45a23728/3224/db file sequential read>
    Chain 6 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/64/22233/0x45a1f3a8/1892/No Wait>
    Chain 7 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/69/1878/0x45a1dd28/2084/No Wait>
    Extra information that will be dumped at higher levels:
    [level??4] :?? 1 node dumps -- [REMOTE_WT] [LEAF] [LEAF_NW]
    [level??5] :?? 6 node dumps -- [SINGLE_NODE] [SINGLE_NODE_NW] [IGN_DMP]
    [level??6] :?? 1 node dumps -- [NLEAF]
    [level 10] :??73 node dumps -- [IGN]
    State of nodes
    ([nodenum]/cnode/sid/sess_srno/session/ospid/state/start/finish/[adjlist]/predecessor):
    [0]/0/1/1/0x4520da08/3160/IGN/1/2//none
    [1]/0/2/1/0x45a652ac/2828/IGN/3/4//none
    [2]/0/3/1/0x4520e378/1924/IGN/5/6//none
    [3]/0/4/1/0x45a65c1c/3308/IGN/7/8//none
    [4]/0/5/1/0x4520ece8/156/IGN/9/10//none
    [5]/0/6/1/0x45a6658c/1884/IGN/11/12//none
    [6]/0/7/1/0x4520f658/3064/IGN/13/14//none
    [7]/0/8/1/0x45a66efc/2796/SINGLE_NODE/15/16//none
    [8]/0/9/18325/0x4520ffc8/2496/IGN/17/18//none
    [12]/0/13/17667/0x452112a8/1928/IGN/19/20//none
    [13]/0/14/18771/0x45a68b4c/816/IGN/21/22//none
    [14]/0/15/9177/0x45211c18/2816/IGN/23/24//none
    [15]/0/16/16965/0x45a694bc/3108/IGN/25/26//none
    [16]/0/17/19671/0x45212588/2724/IGN/27/28//none
    [17]/0/18/25029/0x45a69e2c/3272/IGN/29/30//none
    [18]/0/19/11291/0x45212ef8/3080/IGN/31/32//none
    [19]/0/20/25825/0x45a6a79c/3164/IGN/33/34//none
    [20]/0/21/26486/0x45213868/448/IGN/35/36//none
    [21]/0/22/21584/0x45a6b10c/2316/IGN/37/38//none
    [22]/0/23/37646/0x452141d8/3340/IGN/39/40//none
    [23]/0/24/5364/0x45a6ba7c/1468/IGN/41/42//none
    [24]/0/25/33844/0x45214b48/2920/IGN/43/44//none
    [25]/0/26/2234/0x45a6c3ec/3200/SINGLE_NODE_NW/45/46//none
    [26]/0/27/28532/0x452154b8/2848/IGN/47/48//none
    [28]/0/29/2338/0x45215e28/672/SINGLE_NODE/49/50//none
    [29]/0/30/23502/0x45a6d6cc/3224/SINGLE_NODE/51/52//none
    [31]/0/32/17993/0x45a6e03c/2580/IGN/53/54//none
    [32]/0/33/21925/0x45217108/2584/IGN/55/56//none
    [33]/0/34/20841/0x45a6e9ac/1316/IGN/57/58//none
    [34]/0/35/19307/0x45217a78/3076/IGN/59/60//none
    [35]/0/36/19269/0x45a6f31c/3092/IGN/61/62//none
    [36]/0/37/11711/0x452183e8/2908/IGN/63/64//none
    [37]/0/38/29651/0x45a6fc8c/2156/IGN/65/66//none
    [38]/0/39/13933/0x45218d58/3332/IGN/67/68//none
    [39]/0/40/11993/0x45a705fc/3284/NLEAF/69/72/[47]/none
    [40]/0/41/23604/0x452196c8/3280/IGN/73/74//none
    [41]/0/42/30238/0x45a70f6c/3312/IGN/75/76//none
    [43]/0/44/15405/0x45a718dc/2528/IGN/77/78//none
    [45]/0/46/33109/0x45a7224c/1920/IGN/79/80//none
    [47]/0/48/20150/0x45a72bbc/3336/LEAF_NW/70/71//39
    [48]/0/49/30884/0x4521bc88/2436/IGN/81/82//none
    [49]/0/50/17150/0x45a7352c/2620/IGN/83/84//none
    [50]/0/51/24541/0x4521c5f8/2376/IGN/85/86//none
    [51]/0/52/20825/0x45a73e9c/2924/IGN/87/88//none
    [52]/0/53/8516/0x4521cf68/764/IGN/89/90//none
    [53]/0/54/16868/0x45a7480c/3320/IGN/91/92//none
    [55]/0/56/14359/0x45a7517c/3356/IGN/93/94//none
    [56]/0/57/32976/0x4521e248/2624/IGN/95/96//none
    [57]/0/58/30428/0x45a75aec/3212/IGN/97/98//none
    [58]/0/59/12175/0x4521ebb8/3268/IGN/99/100//none
    [59]/0/60/15084/0x45a7645c/3032/IGN/101/102//none
    [60]/0/61/31222/0x4521f528/1912/IGN/103/104//none
    [61]/0/62/20108/0x45a76dcc/2564/IGN/105/106//none
    [62]/0/63/32235/0x4521fe98/3376/IGN/107/108//none
    [63]/0/64/22233/0x45a7773c/1892/SINGLE_NODE_NW/109/110//none
    [64]/0/65/27250/0x45220808/1948/IGN/111/112//none
    [65]/0/66/33424/0x45a780ac/3252/IGN/113/114//none
    [66]/0/67/41625/0x45221178/3360/IGN/115/116//none
    [67]/0/68/33495/0x45a78a1c/2420/IGN/117/118//none
    [68]/0/69/1878/0x45221ae8/2084/SINGLE_NODE_NW/119/120//none
    [70]/0/71/7937/0x45222458/3380/IGN/121/122//none
    [71]/0/72/18116/0x45a79cfc/1448/IGN/123/124//none
    [72]/0/73/37603/0x45222dc8/2936/IGN/125/126//none
    [73]/0/74/23965/0x45a7a66c/2480/IGN/127/128//none
    [74]/0/75/7067/0x45223738/3300/IGN/129/130//none
    [75]/0/76/8541/0x45a7afdc/1068/IGN/131/132//none
    [76]/0/77/9178/0x452240a8/2360/IGN/133/134//none
    [77]/0/78/25889/0x45a7b94c/2864/IGN/135/136//none
    [78]/0/79/11006/0x45224a18/2996/IGN/137/138//none
    [79]/0/80/19934/0x45a7c2bc/3384/IGN/139/140//none
    [80]/0/81/24305/0x45225388/3136/IGN/141/142//none
    [81]/0/82/27089/0x45a7cc2c/2744/IGN/143/144//none
    [82]/0/83/15792/0x45225cf8/3236/IGN/145/146//none
    [83]/0/84/19887/0x45a7d59c/2788/IGN/147/148//none
    [86]/0/87/20152/0x45226fd8/2284/IGN/149/150//none
    [87]/0/88/7617/0x45a7e87c/2776/IGN/151/152//none
    [88]/0/89/33192/0x45227948/3248/IGN/153/154//none
    [89]/0/90/22038/0x45a7f1ec/2652/IGN/155/156//none
    [90]/0/91/31249/0x452282b8/2852/IGN/157/158//none
    [91]/0/92/15647/0x45a7fb5c/3088/IGN/159/160//none
    [92]/0/93/3053/0x45228c28/3100/IGN/161/162//none
    ====================
    END OF HANG ANALYSIS
    ====================


    發現是如下出現問題:
    Chain 1 : <cnode/sid/sess_srno/proc_ptr/ospid/wait_event> :
    ????<0/48/20150/0x45a2b2e8/3336/No Wait>
    -- <0/40/11993/0x45a29c68/3284/library cache lock>

    當前drop的session為40,然后查詢48的session,居然是前面做重編譯時候未成功退出的一個SESSION
    然后orakill 這個session后正常drop完成

    posted @ 2008-04-08 23:30 金家寶 閱讀(512) | 評論 (0)編輯 收藏

    關于SQL的執行計劃。

    C、語句級別
    這些需要用到Hint,比如:
    SQL> SELECT /*+ RULE */ a.userid,
    2 b.name,
    3 b.depart_name
    4 FROM tf_f_yhda a,
    5 tf_f_depart b
    6 WHERE a.userid=b.userid;

    4、為什么有時一個表的某個字段明明有索引,當觀察一些語的執行計劃確不走索引呢?如何解決呢 ?

    A、不走索引大體有以下幾個原因
    ♀你在Instance級別所用的是all_rows的方式
    ♀你的表的統計信息(最可能的原因)
    ♀你的表很小,上文提到過的,Oracle的優化器認為不值得走索引。

    B、解決方法
    ♀可以修改init<SID>.ora中的OPTIMIZER_MODE這個參數,把它改為Rule或Choose,重起數據庫。也可以使用4中所提的Hint.
    ♀刪除統計信息
    SQL>analyze table table_name delete statistics;
    ♀表小不走索引是對的,不用調的。

    5、其它相關

    A、如何看一個表或索引是否是統計信息

    SQL>SELECT * FROM user_tables
    2 WHERE table_name=<table_name>
    3 AND num_rows is not null;
    SQL>SELECT * FROM user_indexes
    2 WHERE table_name=<table_name>
    3 AND num_rows is not null;

    b、如果我們先用CBO的方式,我們應及時去更新表和索引的統計信息,以免生形不切合實的執行計劃。

    SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
    SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;

    具體的ANALYZE語句請參照Oracle8i/9i 的refrence文檔。
    <================end of file“Oracle的優化器(Optimizer)”=====================>


    下面的是我的關于一點執行計劃的理解:

    1。首先要啟動trace的選項:
    set autotrace trace eXPlain
    如果出現下面的錯誤:

    SQL>? set autotrace trace explain
    SP2-0613: Unable to verify PLAN_TABLE format or existence
    SP2-0611: Error enabling EXPLAIN report

    那么要先運行下面的語句:
    ?@?/rdbms/admin/utlxplan.sql;

    2。分析下面的執行計劃:

    SQL> select ename,dname??? from emp, dept?? where emp.deptno=dept.deptno???? and dept.dname in ('ACCOUNTING','RESEARCH','SALES','OPERATIONS');

    Execution Plan
    ----------------------------------------------------------
    ?? 0????? SELECT STATEMENT Optimizer=CHOOSE
    ?? 1??? 0?? NESTED LOOPS
    ?? 2??? 1???? TABLE Access (FULL) OF 'EMP'
    ?? 3??? 1???? TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
    ?? 4??? 3?????? INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

    關于前面的兩個數字,第一個是狀態ID,第二個是父ID。
    就是如下所示:0-->1-->2
    ??? ?? ?? ?? ?? ?? ?????
    ??? ?? ?? ?? ?? ?? ?? ?? -->3-->4
    在上圖里,0的執行依靠1,1的執行又依賴2和3,2是沒有子ID的,所以2最先執行,然后是4,在然后是3;然后2和3的結果傳回1。
    在這個里面0行有個字“Optimizer=CHOOSE”,這個就是上文說的那個oracle的優化器了。
    還有,看這個“ INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)”,就知道這個語句運行的時候是走INDEX的。

    posted @ 2008-04-08 23:19 金家寶 閱讀(205) | 評論 (0)編輯 收藏

    7月15日

    培訓的第一天,如果JAVAC 和 JAVA 的版本不一致,將導致有時編譯成功,運行時卻出現錯誤提示。
    當天發現的原因是,本機安裝了ORACLE ,且在path中的變量排序中,oracle 和oracle\bin排在jdk之前,這將導致提前在運行的過程中,即java命令調用的是oracle\bin程序內的java程序。而非jdk中的。這將很容易導致兩者(javac .java)兩文件版本不一致而使高版本編譯,卻低版本(jre)運行。
    第一天,主要是對學生的介紹,期待明天的課程。

    posted @ 2007-07-15 22:31 金家寶 閱讀(236) | 評論 (0)編輯 收藏

    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 亚洲精品无码AV中文字幕电影网站| 国产精品亚洲w码日韩中文| 国产成人不卡亚洲精品91| 国产成人亚洲精品影院| 99re6免费视频| 国产亚洲福利精品一区二区| 亚洲精品无码永久在线观看你懂的| 亚欧在线精品免费观看一区| 美女视频黄频a免费大全视频| 亚洲AV无码1区2区久久| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 国产zzjjzzjj视频全免费| 国产永久免费高清在线| 亚洲精品欧美综合四区| 久久亚洲精品国产精品黑人| 国产免费黄色大片| 青柠影视在线观看免费高清 | 亚洲AV福利天堂一区二区三| 在线免费观看视频你懂的| 青柠影视在线观看免费高清| 香蕉视频亚洲一级| 亚洲第一页在线视频| 苍井空亚洲精品AA片在线播放| 久久精品国产亚洲AV果冻传媒| 日本特黄a级高清免费大片| 99在线观看免费视频| 成年免费大片黄在线观看com| 亚洲人精品亚洲人成在线| 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲国产女人aaa毛片在线 | 亚洲人成网站日本片| 亚洲热妇无码AV在线播放| 又粗又黄又猛又爽大片免费 | 日本红怡院亚洲红怡院最新| 国产国产人免费人成免费视频| 亚洲一区免费在线观看| 黄色片免费在线观看| 亚洲精品黄色视频在线观看免费资源| 亚洲熟妇无码AV| 亚洲中文字幕人成乱码| 亚洲人成电影在线天堂|