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

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

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

    心的方向

    新的征途......
    posts - 75,comments - 19,trackbacks - 0

    ?? 把方法留這做個紀念。
    打開“記事本”程序,在其中輸入如下內容:
      [Shell]?
      Command=2?
      IconFile=explorer.exe,3?
      [Taskbar]?
      Command=ToggleDesktop?
    然后把這個文件保存為:“顯示桌面.scf”,必須確認文件名和雙引號中的一樣。然后把保存的“顯示桌面.scf”文件復制到:“C:\Documents and Settings\用戶名\Application Data\ Microsoft\Internet Explorer\Quick Launch”目錄下。其中你需要把“用戶名”替換成你需要恢復“顯示桌面”按鈕的用戶名。
    如WIN98用戶的話放到“C:\WINDOWS\Application Data\Microsoft\Internet Explorer\Quick Launch”就可以了。
    如WINXP用戶的話放到“C:\Documents and Settings\Administrator\Application Data\Microsoft\Internet Explorer\Quick Launch”?就可以了。
    根據不同的系統找到Application Data\Microsoft\Internet Explorer\Quick Launch文件夾就可以了

    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!200.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(785) | 評論 (1)編輯 收藏
    ?
    1.document.write(""); 輸出語句
    2.JS中的注釋為//
    3.傳統的HTML文檔順序是:document->html->(head,body)
    4.一個瀏覽器窗口中的DOM順序是:window->(navigator,screen,history,location,document)
    5.得到表單中元素的名稱和值:document.getElementById("表單中元素的ID號").name(或value)
    6.一個小寫轉大寫的JS: document.getElementById("output").value = document.getElementById("input").value.toUpperCase();
    7.JS中的值類型:String,Number,Boolean,Null,Object,Function
    8.JS中的字符型轉換成數值型:parseInt(),parseFloat()
    9.JS中的數字轉換成字符型:(""+變量)
    10.JS中的取字符串長度是:(length)
    11.JS中的字符與字符相連接使用+號.
    12.JS中的比較操作符有:==等于,!=不等于,>,>=,<.<=
    13.JS中聲明變量使用:var來進行聲明
    14.JS中的判斷語句結構:if(condition){}else{}
    15.JS中的循環結構:for([initial expression];[condition];[upadte expression]) {inside loop}
    16.循環中止的命令是:break
    17.JS中的函數定義:function functionName([parameter],...){statement[s]}
    18.當文件中出現多個form表單時.可以用document.forms[0],document.forms[1]來代替.
    19.窗口:打開窗口window.open(), 關閉一個窗口:window.close(), 窗口本身:self
    20.狀態欄的設置:window.status="字符";
    21.彈出提示信息:window.alert("字符");
    22.彈出確認框:window.confirm();
    23.彈出輸入提示框:window.prompt();
    24.指定當前顯示鏈接的位置:window.location.href="URL"
    25.取出窗體中的所有表單的數量:document.forms.length
    26.關閉文檔的輸出流:document.close();
    27.字符串追加連接符:+=
    28.創建一個文檔元素:document.createElement(),document.createTextNode()
    29.得到元素的方法:document.getElementById()
    30.設置表單中所有文本型的成員的值為空:
    var form = window.document.forms[0]
    for (var i = 0; i<form.elements.length;i++){
    if (form.elements[i].type == "text"){
    form.elements[i].value = "";
    }
    }
    31.復選按鈕在JS中判斷是否選中:document.forms[0].checkThis.checked (checked屬性代表為是否選中返回TRUE或FALSE)
    32.單選按鈕組(單選按鈕的名稱必須相同):取單選按鈕組的長度document.forms[0].groupName.length
    33.單選按鈕組判斷是否被選中也是用checked.
    34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有時用下拉列表框名稱加上.selectedIndex來確定被選中的值)
    35.字符串的定義:var myString = new String("This is lightsword");
    36.字符串轉成大寫:string.toUpperCase(); 字符串轉成小寫:string.toLowerCase();
    37.返回字符串2在字符串1中出現的位置:String1.indexOf("String2")!=-1則說明沒找到.
    38.取字符串中指定位置的一個字符:StringA.charAt(9);
    39.取出字符串中指定起點和終點的子字符串:stringA.substring(2,6);
    40.數學函數:Math.PI(返回圓周率),Math.SQRT2(返回開方),Math.max(value1,value2)返回兩個數中的最在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函數,Math.floor(Math.random()*(n+1))返回隨機數
    41.定義日期型變量:var today = new Date();
    42.日期函數列表:dateObj.getTime()得到時間,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期幾,dateObj.getHours()得到小時,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(value)設置時間,dateObj.setYear(val)設置年,dateObj.setMonth(val)設置月,dateObj.setDate(val)設置日,dateObj.setDay(val)設置星期幾,dateObj.setHours設置小時,dateObj.setMinutes(val)設置分,dateObj.setSeconds(val)設置秒 [注意:此日期時間從0開始計]
    43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName
    44.parent代表父親對象,top代表最頂端對象
    45.打開子窗口的父窗口為:opener
    46.表示當前所屬的位置:this
    47.當在超鏈接中調用JS函數時用:(javascript :)來開頭后面加函數名
    48.在老的瀏覽器中不執行此JS:<!-- //-->
    49.引用一個文件式的JS:<script type="text/javascript" src="aaa.js"></script>
    50.指定在不支持腳本的瀏覽器顯示的HTML:<noscript></noscript>
    51.當超鏈和ONCLICK事件都有時,則老版本的瀏覽器轉向a.html,否則轉向b.html.例:<a href="a.html" onclick="location.href='b.html';return false">dfsadf</a>
    52.JS的內建對象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError
    53.JS中的換行:\n
    54.窗口全屏大小:<script>function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</script>
    55.JS中的all代表其下層的全部元素
    56.JS中的焦點順序:document.getElementByid("表單元素").tabIndex = 1
    57.innerHTML的值是表單元素的值:如<p id="para">"how are <em>you</em>"</p>,則innerHTML的值就是:how are <em>you</em>
    58.innerTEXT的值和上面的一樣,只不過不會把<em>這種標記顯示出來.
    59.contentEditable可設置元素是否可被修改,isContentEditable返回是否可修改的狀態.
    60.isDisabled判斷是否為禁止狀態.disabled設置禁止狀態
    61.length取得長度,返回整型數值
    62.addBehavior()是一種JS調用的外部函數文件其擴展名為.htc
    63.window.focus()使當前的窗口在所有窗口之前.
    64.blur()指失去焦點.與FOCUS()相反.
    65.select()指元素為選中狀態.
    66.防止用戶對文本框中輸入文本:onfocus="this.blur()"
    67.取出該元素在頁面中出現的數量:document.all.tags("div(或其它HTML標記符)").length
    68.JS中分為兩種窗體輸出:模態和非模態.window.showModaldialog(),window.showModeless()
    69.狀態欄文字的設置:window.status='文字',默認的狀態欄文字設置:window.defaultStatus = '文字.';
    70.添加到收藏夾:external.AddFavorite("http://www.dannyg.com","jaskdlf");
    71.JS中遇到腳本錯誤時不做任何操作:window.onerror = doNothing; 指定錯誤句柄的語法為:window.onerror = handleError;
    72.JS中指定當前打開窗口的父窗口:window.opener,支持opener.opener...的多重繼續.
    73.JS中的self指的是當前的窗口
    74.JS中狀態欄顯示內容:window.status="內容"
    75.JS中的top指的是框架集中最頂層的框架
    76.JS中關閉當前的窗口:window.close();
    77.JS中提出是否確認的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");}
    78.JS中的窗口重定向:window.navigate("http://www.sina.com.cn");
    79.JS中的打印:window.print()
    80.JS中的提示輸入框:window.prompt("message","defaultReply");
    81.JS中的窗口滾動條:window.scroll(x,y)
    82.JS中的窗口滾動到位置:window.scrollby
    83.JS中設置時間間隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout
    84.JS中的模態顯示在IE4+行,在NN中不行:showModalDialog("URL"[,arguments][,features]);
    85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue="we really like you and hope you will stay longer.";}} window.onbeforeunload=verifyClose;
    86.當窗體第一次調用時使用的文件句柄:onload()
    87.當窗體關閉時調用的文件句柄:onunload()
    88.window.location的屬性: protocol(http:),hostname(www.example.com),port(80),host(www.example.com:80),pathname("/a/a.html"),hash("#giantGizmo",指跳轉到相應的錨記),href(全部的信息)
    89.window.location.reload()刷新當前頁面.
    90.window.history.back()返回上一頁,window.history.forward()返回下一頁,window.history.go(返回第幾頁,也可以使用訪問過的URL)
    91.document.write()不換行的輸出,document.writeln()換行輸出
    92.document.body.noWrap=true;防止鏈接文字折行.
    93.變量名.charAt(第幾位),取該變量的第幾位的字符.
    94."abc".charCodeAt(第幾個),返回第幾個字符的ASCii碼值.
    95.字符串連接:string.concat(string2),或用+=進行連接
    96.變量.indexOf("字符",起始位置),返回第一個出現的位置(從0開始計算)
    97.string.lastIndexOf(searchString[,startIndex])最后一次出現的位置.
    98.string.match(regExpression),判斷字符是否匹配.
    99.string.replace(regExpression,replaceString)替換現有字符串.
    100.string.split(分隔符)返回一個數組存儲值.
    101.string.substr(start[,length])取從第幾位到指定長度的字符串.
    102.string.toLowerCase()使字符串全部變為小寫.
    103.string.toUpperCase()使全部字符變為大寫.
    104.parseInt(string[,radix(代表進制)])強制轉換成整型.
    105.parseFloat(string[,radix])強制轉換成浮點型.
    106.isNaN(變量):測試是否為數值型.
    107.定義常量的關鍵字:const,定義變量的關鍵字:var?

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1490206


    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!203.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(782) | 評論 (1)編輯 收藏
    public static Date getDateofMonth(int year,int month){
    Calendar cal=Calendar.getInstance();
    cal.set(cal.MONTH,month-1);
    cal.set(cal.YEAR,year);
    cal.set(cal.DAY_OF_MONTH,1);
    int dayofweek=cal.get(cal.DAY_OF_WEEK);
    if(dayofweek>4){
    cal.set(cal.WEEK_OF_MONTH,4);
    }else{
    cal.set(cal.WEEK_OF_MONTH,3);
    }
    cal.set(cal.DAY_OF_WEEK,4);
    return cal.getTime();
    }

    調用getDateofMonth(2007,2);
    就行了,哈哈,謝謝大家的幫助
    **************************************************************
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.set(Calendar.MONTH,某月的月份);//注意這個月份是從0開始的
    cal.set(Calendar.WEEK_OF_MONTH,3);
    cal.set(Calendar.DAY_OF_WEEK,Calendar.WEDNESDAY);
    cal.getTime();//這個應該就是你要的日期了
    ?
    ******************************************************
    ?
    Calendar c = Calendar.getInstance();
    c.setTime(new Date());
    c.set(Calendar.YEAR,2007);//2007 current year
    c.set(Calendar.MONTH,(4-1));//4 current month
    c.set(Calendar.DATE,1);
    c.set(Calendar.WEEK_OF_MONTH,
    c.get(Calendar.DAY_OF_WEEK)>Calendar.WEDNESDAY?4:3);
    c.set(Calendar.DAY_OF_WEEK,Calendar.WEDNESDAY);
    c.getTime();
    System.out.println(c.getTime());
    ?

    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!204.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(285) | 評論 (0)編輯 收藏
    作者tag:jvm?算法?應用服務器?j2ee?大小?

    ????????性能問題的最明顯表現是網頁的響應時間變慢。在J2EE系統中,經常體現有下面更為基本的癥狀:

  • 應用服務器資源的使用情況
  • JVM堆的使用情況
  • 系統資源的使用情況
  • 數據庫資源的使用情況
  • 網絡活動

    ????????這些現象表明J2EE應用依賴很多外部資源,并且是運行在一個層次化的執行模式的環境中:

    ????????由于Java虛擬機和應用服務器掩蓋了操作系統和硬件的特性,所以在設計軟件系統時,架構工程師更應該深刻理解整個操作環境。

    ????????在設計軟件系統時,架構工程師應把性能和可擴展性放在首位,然后開始尋找容易解決的問題,反應時間緩慢通常的原因是訪問數據庫效率低和過多地調用遠程對象和方法。接下來,架構工程師可繼續尋找不明顯的原因,例如算法的累積影響和不必要的開銷。

    ????????現在市場上的各個J2EE應用服務器有很多配置項目。這里只簡單介紹一些常見的性能優化配置項目。

    ????????很多應用服務器都有一些與J2EE規范有關的操作系統配置項目或非標準的特性,這可以提高系統性能。應該化時間來理解這些性能配置。

    Java虛擬機堆和垃圾回收設置

    ????????任何Java應用的性能調整基礎都涉及到堆的大小和垃圾回收設置。(這里主要討論Sun HotSpor JVM).

    ????????堆可分為三代,年輕的(新的),年老的和持久的。Hotspot JVM的內存基本配置包括最大堆大小,初始堆大小和年輕一代堆的大小。當配置最大堆大小時可參考下面一些指導:

  • 最大大小應小于物理內存,避免虛存的頁面調度。
  • 需要減去其他進程使用的內存
  • 在負載測試時進行優化

    ????????注意不要將最大堆大小設置得過大。堆越大,內存中保存的對象越多。內存中對象越多,回收過程時間越長。

    ????????配置初試堆大小的一般性策略包括:

    ?

  • 將初始大小設置為最大堆大小
  • 將初始大小設置為最大堆大小的1/4到1/2

    ????????對于年輕一代堆大小,Sun 推薦是設置為最大堆大小的1/3。

    ????????也可以選擇不同的垃圾回收算法。首先是增量垃圾回收。該算法的意思是減少單個對象回收停頓時間,這樣的結果是整體回收性能的下降。該算法將相互引用的對象分組,然后嘗試按組回收。嘗試回收的部分越小,回收處理的時間往往會越少。

    ????????1.4.1版的HotSpot JVM增加了兩個垃圾回收算法:并行算法和并發算法。

    ????????在年輕一代堆中實現了并行算法。在多處理器的機器上,這種回收算法使用了多線程來提高性能。雖然這個算法會暫停所有的應用線程,但是由于利用了多個CPU使得回收時間非常快。在年輕一代堆中,該算法顯著地減少了回收帶來的停頓。

    ????????在年老一代堆中實現了并發算法。在應用中最大限度地執行并發。回收過程分為4個階段,覆蓋了可回收對象的標記和清除操作。前兩個過程會暫停應用線程,后兩階段可與應用并發執行。并發垃圾回收算法的"最大限度并發"特點可以使JVM利用更大的堆和多個CPU。因此應關注由于采用缺省的mark-compact(標記-壓縮)和stop-the-world(停頓所有處理)等垃圾回收算法所帶來的延遲和吞吐量問題。

    處理線程

    ????????J2EE應用服務器是多線程的應用。應用服務器的線程是一種資源池,處理請求和和應用服務器的內部功能等任務共享這些資源。

    ????????很多應用服務器允許為特定的任務或應用配置不同大小的線程池。通常需要增加這些線程池的大小以滿足應用負載的需要。

    ????????架構工程師應該避免將線程池大小設置過大,這是因為會增加上下文交換的次數,從而降低應用的性能。線程池的大小通常應該能最大利用機器上的CPU,同時又不能使CPU過載。

    EJB配置項目

    ???????? 在應用服務器中,很多不同類型的EJB是以資源池的方式實現的。通常這些池大小和初始Bean的數量會明顯影響應用的性能。

    ????????架構工程師應該避免將這些池大小設置的過大,這樣會導致不必要地消耗JVM和操作系統內存。另外,將初始Bean數量設置過高會使得應用服務器的啟動時間長的難以接受。

    ????????在應用服務器中,緩存很多不同類型的EJB。緩存大小和超時設置通常也會對應用性能帶來顯著影響。

    ???????? 架構工程師應該避免將緩寸大小設置過大,這同樣會不必要地消耗大量JVM和操作系統內存。此外,應避免設置過長的超時--例如當EJB不用時,仍被緩存---,這也會導致不必要地消耗大量內存。

    數據庫配置項目

    ????????J2EE規范要求應用服務器廠商必須提供數據庫連接資源池功能。通常增加數據庫連接池的大小會提高性能。架構工程師應該考慮不同類型的SQL操作(例如事務型和批處理型)應使用不同的連接池。如果一個消息Bean執行批處理操作,那么應該為此另創建一個連接池,而不要與事務型操作使用同一個連接池。

    ????????很多J2EE應用服務器提供了Prepared Statement 的緩存功能。創建Prepared Statement是很耗費資源的。在事務型的J2EE應用中通常執行很多同樣的SQL語句,只是參數不同而已。所以在應用中應發揮數據庫配置項目的作用,盡量使用Prepared Statement。?

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1527474


  • 文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!207.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(208) | 評論 (0)編輯 收藏
    SQL Server SQL語句調優技巧
    ????????www.InnovateDigital.com 整理


    ??????通過例子和解析計劃,本文展示了在Microsoft SQL Server上提高查詢效率有效的一些技巧。在編程中有很多小提示和技巧。了解這些技巧可以擴展你在性能優化上的可用機能。在這部分里我們所有的例子都選擇使用Microsoft SHOWPLAN_ALL輸出,因為它更緊湊并且展示典型的信息。(Sybase的查詢計劃基本與此相同,可能包含其它一些信息)大部分的例子都是要么基于PUBS數據庫,要么基于標準系統表的。我們在PUBS數據庫中對用到的表進行了很大擴充,對很多表增加了好幾萬行。

    ??????子查詢優化


    ??????一條好的值得稱贊的規則是盡量用連接代替所有的子查詢。優化器有時可以自動將子查詢“扁平化”,并且用常規或外連接代替。但那樣也不總是有效。明確的連接對選擇表的順序和找到最可能的計劃給出了更多的選項。當你優化一個特殊查詢時,了解一下是否去掉自查詢可產生很大的差異。

    ??????示例
    ??????下面查詢選擇了pubs數據庫中所有表的名字,以及每個表的聚集索引(如果存在)。如果沒有聚集索引,表名仍然顯示在列表中,在聚集索引列中顯示為虛線。兩個查詢返回同樣的結果集,但第一個使用了一個子查詢,而第二個使用一個外連接時。比較Microsoft SQL Server產生的查詢計劃

    ??????SUBQUERY SOLUTION

    ??????----------------------

    ??????SELECT st.stor_name AS 'Store',

    ??????(SELECT SUM(bs.qty)

    ??????FROM big_sales AS bs

    ??????WHERE bs.stor_id = st.stor_id), 0)

    ??????AS 'Books Sold'

    ??????FROM stores AS st

    ??????WHERE st.stor_id IN

    ??????(SELECT DISTINCT stor_id

    ??????FROM big_sales)

    JOIN SOLUTION

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

    SELECT st.stor_name AS 'Store',

    SUM(bs.qty) AS 'Books Sold'

    FROM stores AS st

    JOIN big_sales AS bs

    ON bs.stor_id = st.stor_id

    WHERE st.stor_id IN

    (SELECT DISTINCT stor_id

    FROM big_sales)

    GROUP BY st.stor_name

    ??????SUBQUERY SOLUTION

    ??????----------------------

    ??????SQL Server parse and compile time:

    ??????????CPU time = 28 ms

    ??????????elapsed time = 28 ms

    ??????SQL Server Execution Times:

    ??????????CPU time = 145 ms

    ??????????elapsed time = 145 ms

    ??????Table 'big_sales'. Scan count 14, logical reads

    ??????1884, physical reads 0, read-ahead reads 0.

    ??????Table 'stores'. Scan count 12, logical reads 24,
    ??????physical reads 0, read-ahead reads 0.

    JOIN SOLUTION

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

    SQL Server parse and compile time:

    ????CPU time = 50 ms

    ????elapsed time = 54 ms

    SQL Server Execution Times:

    ????CPU time = 109 ms

    ????elapsed time = 109 ms

    Table 'big_sales'. Scan count 14, logical reads

    966, physical reads 0, read-ahead reads 0.

    Table 'stores'. Scan count 12, logical reads 24,
    physical reads 0, read-ahead reads 0.

    ??????不必更深探索,我們可以看到在CPU和總的實耗時間方面連接更快,僅需要子查詢方案邏輯讀的一半。此外,這兩種情況伴隨著相同的結果集,雖然排序的順序不同,這是因為連接查詢(由于它的GROUP BY子句)有一個隱含的ORDER BY:

    ??????Store Books Sold

    ??????-------------------------------------------------

    ??????Barnum's 154125

    ??????Bookbeat 518080

    ??????Doc-U-Mat: Quality Laundry and Books 581130

    ??????Eric the Read Books 76931

    ??????Fricative Bookshop 259060

    ??????News & Brews 161090

    ??????(6 row(s) affected)

    ??????Store Books Sold

    ??????-------------------------------------------------

    ??????Eric the Read Books 76931

    ??????Barnum's 154125

    ??????News & Brews 161090

    ??????Doc-U-Mat: Quality Laundry and Books 581130

    ??????Fricative Bookshop 259060

    ??????Bookbeat 518080

    ??????(6 row(s) affected)

    ??????查看這個子查詢方法展示的查詢計劃:

    ??????|--Compute Scalar(DEFINE:([Expr1006]=isnull([Expr1004], 0)))

    ??????|--Nested Loops(Left Outer Join, OUTER REFERENCES:([st].[stor_id]))

    ??????|--Nested Loops(Inner Join, OUTER REFERENCES:([big_sales].[stor_id]))

    ?????? ??| |--Stream Aggregate(GROUP BY:([big_sales].[stor_id]))

    ????????????| | |--Clustered Index Scan(OBJECT:([pubs].[dbo].[big_sales].

    ????????????[UPKCL_big_sales]), ORDERED FORWARD)

    ?????? ??| |--Clustered Index Seek(OBJECT:([pubs].[dbo].[stores].[UPK_storeid]

    ??????AS [st]),

    ??????SEEK:([st].[stor_id]=[big_sales].[stor_id]) ORDERED FORWARD)

    ?????? |--Stream Aggregate(DEFINE:([Expr1004]=SUM([bs].[qty])))

    ??????|--Clustered Index Seek(OBJECT:([pubs].[dbo].[big_sales].

    ????????[UPKCL_big_sales] AS [bs]),

    ??????SEEK:([bs].[stor_id]=[st].[stor_id]) ORDERED FORWARD)

    ??????反之,求和查詢操作我們可以得到:

    ??????|--Stream Aggregate(GROUP BY:([st].[stor_name])

    ????????DEFINE:([Expr1004]=SUM([partialagg1005])))

    ??????|--Sort(ORDER BY:([st].[stor_name] ASC))

    ??????|--Nested Loops(Left Semi Join, OUTER REFERENCES:([st].[stor_id]))

    ??????|--Nested Loops(Inner Join, OUTER REFERENCES:([bs].[stor_id]))

    ????????| |--Stream Aggregate(GROUP BY:([bs].[stor_id])

    ??????????DEFINE:([partialagg1005]=SUM([bs].[qty])))

    ???????????? | | |--Clustered Index Scan(OBJECT:([pubs].[dbo].[big_sales].

    ????????????[UPKCL_big_sales] AS [bs]), ORDERED FORWARD)

    ????????| |--Clustered Index Seek(OBJECT:([pubs].[dbo].[stores].

    ????????????[UPK_storeid] AS [st]),

    ????????SEEK:([st].[stor_id]=[bs].[stor_id]) ORDERED FORWARD)

    ??????|--Clustered Index Seek(OBJECT:([pubs].[dbo].[big_sales].

    ??????????[UPKCL_big_sales]),

    ????????SEEK:([big_sales].[stor_id]=[st].[stor_id]) ORDERED FORWARD)


    ??????使用連接是更有效的方案。它不需要額外的流聚合(stream aggregate),即子查詢所需在big_sales.qty列的求和。



    ??????UNION vs UNION ALL


    ??????無論何時盡可能用UNION ALL 代替UNION。其中的差異是因為UNION有排除重復行并且對結果進行排序的副作用,而UNION ALL不會做這些工作。選擇無重復行的結果需要建立臨時工作表,用它排序所有行并且在輸出之前排序。(在一個select distinct 查詢中顯示查詢計劃將發現存在一個流聚合,消耗百分之三十多的資源處理查詢)。當你確切知道你得需要時,可以使用UNION。但如果你估計在結果集中沒有重復的行,就使用UNION ALL吧。它只是從一個表或一個連接中選擇,然后從另一個表中選擇,附加在第一條結果集的底部。UNION ALL不需要工作表和排序(除非其它條件引起的)。在大部分情況下UNION ALL更具效率。一個有潛在危險的問題是使用UNION會在數據庫中產生巨大的泛濫的臨時工作表。如果你期望從UNION查詢中獲得大量的結果集時,這就可能發生。

    ??????示例
    ??????下面的查詢是選擇pubs數據庫中的表sales的所有商店的ID,也選擇表big_sales中的所有商店的ID,這個表中我們加入了70,000多行數據。在這兩個方案間不同之處僅僅是UNION 與UNION ALL的使用比較。但在這個計劃中加入ALL關鍵字產生了三大不同。第一個方案中,在返回結果集給客戶端之前需要流聚合并且排序結果。第二個查詢更有效率,特別是對大表。在這個例子中兩個查詢返回同樣的結果集,雖然順序不同。在我們的測試中有兩個臨時表。你的結果可能會稍有差異。

    ??????UNION SOLUTION

    ??????-----------------------

    ??????UNION ALL SOLUTION

    ??????-----------------------

    ??????SELECT stor_id FROM big_sales

    ??????UNION

    ??????SELECT stor_id FROM sales

    ??????----------------------------

    ??????SELECT stor_id FROM big_sales

    ??????UNION ALL

    ??????SELECT stor_id FROM sales

    ??????----------------------------

    ??????|--Merge Join(Union)

    ?????? |--Stream Aggregate(GROUP BY:

    ??????([big_sales].[stor_id]))

    ??????| |--Clustered Index Scan

    ??????(OBJECT:([pubs].[dbo].

    ??????[big_sales].

    ??????[UPKCL_big_sales]),

    ??????ORDERED FORWARD)

    ??????|--Stream Aggregate(GROUP BY:

    ??????([sales].[stor_id]))

    ?????? |--Clustered Index Scan

    ?????? (OBJECT:([pubs].[dbo].

    ?????? [sales].[UPKCL_sales]),

    ?????? ORDERED FORWARD)

    ??????|--Concatenation

    ??????|--Index Scan

    ??????(OBJECT:([pubs].[dbo].

    ?????? [big_sales].[ndx_sales_ttlID]))

    ??????|--Index Scan

    ??????(OBJECT:([pubs].[dbo].

    ??????[sales].[titleidind]))

    ??????UNION SOLUTION

    ??????-----------------------

    ??????Table 'sales'. Scan count 1, logical

    ??????reads 2, physical reads 0,

    ??????read-ahead reads 0.

    ??????Table 'big_sales'. Scan count 1,

    ??????logical

    ??????reads 463, physical reads 0,

    ??????read-ahead reads 0.

    ??????UNION ALL SOLUTION

    ??????-----------------------

    ??????Table 'sales'. Scan count 1, logical

    ??????reads 1, physical reads 0,

    ??????read-ahead reads 0.

    ??????Table 'big_sales'. Scan count 1,

    ??????logical

    ??????reads 224, physical reads 0,

    ??????read-ahead reads 0.


    ??????雖然在這個例子的結果集是可互換的,你可以看到UNION ALL語句比UNION語句少消耗一半的資源。所以應當預料你的結果集并且確定已經沒有重復時,使用UNION ALL子句。



    ??????函數和表達式約束索引


    ??????當你在索引列上使用內置的函數或表達式時,優化器不能使用這些列的索引。盡量重寫這些條件,在表達式中不要包含索引列。

    ??????示例

    ??????你應該幫助SQL Server移除任何在索引數值列周圍的表達式。下面的查詢是從表jobs通過唯一的聚集索引的唯一鍵值選擇出的一行。如果你在這個列上使用表達式,這個索引就不起作用了。但一旦你將條件’job_id-2=0’ 該成‘job_id=2’,優化器將在聚集索引上執行seek操作。

    ??????QUERY WITH SUPPRESSED INDEX

    ??????-----------------------

    ??????OPTIMIZED QUERY USING INDEX

    ??????-----------------------

    ??????SELECT *

    ??????FROM jobs

    ??????WHERE (job_id-2) = 0

    ??????SELECT *

    ??????FROM jobs

    ??????WHERE job_id = 2

    ??????|--Clustered Index Scan(OBJECT:

    ??????([pubs].[dbo].[jobs].

    ??????[PK__jobs__117F9D94]),

    ??????WHERE:(Convert([jobs].[job_id])-

    ??????2=0))

    ??????|--Clustered Index Seek(OBJECT:

    ??????([pubs].[dbo].[jobs].

    ??????[PK__jobs__117F9D94]),

    ??????SEEK:([jobs].[job_id]=Convert([@1]))

    ??????ORDERED FORWARD)

    ??????Note that a SEEK is much better than a SCAN,

    ??????as in the previous query.


    ??????下面表中列出了多種不同類型查詢示例,其被禁止使用列索引,同時給出改寫的方法,以獲得更優的性能。

    ??????QUERY WITH SUPPRESSED INDEX

    ??????---------------------------------------

    ??????OPTIMIZED QUERY USING INDEX

    ??????--------------------------------------

    ??????DECLARE @job_id VARCHAR(5)

    ??????SELECT @job_id = ‘2’

    ??????SELECT *

    ??????FROM jobs

    ??????WHERE CONVERT( VARCHAR(5),

    ??????job_id ) = @job_id

    ??????-------------------------------

    ??????DECLARE @job_id VARCHAR(5)

    ??????SELECT @job_id = ‘2’

    ??????SELECT *

    ??????FROM jobs

    ??????WHERE job_id = CONVERT(

    ??????SMALLINT, @job_id )

    ??????-------------------------------

    ??????SELECT *

    ??????FROM authors

    ??????WHERE au_fname + ' ' + au_lname

    ??????= 'Johnson White'

    ??????-------------------------------

    ??????SELECT *

    ??????FROM authors

    ??????WHERE au_fname = 'Johnson'

    ??????AND au_lname = 'White'

    ??????-------------------------------

    ??????SELECT *

    ??????FROM authors

    ??????WHERE SUBSTRING( au_lname, 1, 2 ) = 'Wh'

    ??????-------------------------------

    ??????SELECT *

    ??????FROM authors

    ??????WHERE au_lname LIKE 'Wh%'

    ??????-------------------------------

    ??????CREATE INDEX employee_hire_date

    ??????ON employee ( hire_date )

    ??????GO

    ??????-- Get all employees hired

    ??????-- in the 1st quarter of 1990:

    ??????SELECT *

    ??????FROM employee

    ??????WHERE DATEPART( year, hire_date ) = 1990

    ??????AND DATEPART( quarter, hire_date ) = 1

    ??????-------------------------------

    ??????CREATE INDEX employee_hire_date

    ??????ON employee ( hire_date )

    ??????GO

    ??????-- Get all employees hired

    ??????-- in the 1st quarter of 1990:

    ??????SELECT *

    ??????FROM employee

    ??????WHERE hire_date >= ‘1/1/1990’

    ??????AND hire_date < ‘4/1/1990’

    ??????-------------------------------

    ??????-- Suppose that hire_date may

    ??????-- contain time other than 12AM

    ??????-- Who was hired on 2/21/1990?

    ??????SELECT *

    ??????FROM employee

    ??????WHERE CONVERT( CHAR(10),

    ??????hire_date, 101 ) = ‘2/21/1990’

    ??????-- Suppose that hire_date may

    ??????-- contain time other than 12AM

    ??????-- Who was hired on 2/21/1990?

    ??????SELECT *

    ??????FROM employee

    ??????WHERE hire_date >= ‘2/21/1990’

    ??????AND hire_date < ‘2/22/1990’




    ??????SET NOCOUNT ON


    ??????使用SET NOCOUNT ON 提高T-SQL代碼速度的現象使SQL Server開發者和數據庫系統管理者驚訝難解。你可能已經注意到成功的查詢返回了關于受影響的行數的系統信息。在很多情況下,你不需要這些信息。這個SET NOCOUNT ON命令允許你禁止所有在你的會話事務中的子查詢的信息,直到你發出SET NOCOUNT OFF。
    ??????這個選項不只在于其輸出的裝飾效果。它減少了從服務器端到客戶端傳遞的信息量。因此,它幫助降低了網絡通信量并提高了你的事務整體響應時間。傳遞單個信息的時間可以忽略,但考慮到這種情況,一個腳本在一個循環里執行一些查詢并且發送好幾千字節無用的信息給用戶。

    ??????為做個例子,一個文件含T-SQL批處理,其在big_sales表插入了9999行。

    ??????-- Assumes the existence of a table called BIG_SALES, a copy of pubs..sales

    ??????SET NOCOUNT ON

    ??????DECLARE @separator VARCHAR(25),

    ??????@message VARCHAR(25),

    ??????@counter INT,

    ??????@ord_nbr VARCHAR(20),

    ??????@order_date DATETIME,

    ??????@store_nbr INT,

    ??????@qty_sold INT,

    ??????@terms VARCHAR(12),

    ??????@title CHAR(6),

    ??????@starttime DATETIME

    ??????SET @STARTTIME = GETDATE()

    ??????SELECT @counter = 0,

    ??????@separator = REPLICATE( '-', 25 )

    ??????WHILE @counter < 9999

    ??????BEGIN

    ??????SET @counter = @counter + 1

    ??????SET @ord_nbr = 'Y' + CAST(@counter AS VARCHAR(5))

    ??????SET @order_date = DATEADD(hour, (@counter * 8), 'Jan 01 1999')

    ??????SET @store_nbr =

    ??????CASE WHEN @counter < 999 THEN '6380'

    ??????WHEN @counter BETWEEN 1000 AND 2999 THEN '7066'

    ??????WHEN @counter BETWEEN 3000 AND 3999 THEN '7067'

    ??????WHEN @counter BETWEEN 4000 AND 6999 THEN '7131'

    ??????WHEN @counter BETWEEN 7000 AND 7999 THEN '7896'

    ??????WHEN @counter BETWEEN 8000 AND 9999 THEN '8042'

    ??????ELSE '6380'

    ??????END

    ??????SET @qty_sold =

    ??????CASE WHEN @counter BETWEEN 0 AND 2999 THEN 11

    ??????WHEN @counter BETWEEN 3000 AND 5999 THEN 23

    ??????ELSE 37

    ??????END

    ??????SET @terms =

    ??????CASE WHEN @counter BETWEEN 0 AND 2999 THEN 'Net 30'

    ??????WHEN @counter BETWEEN 3000 AND 5999 THEN 'Net 60'

    ??????ELSE 'On Invoice'

    ??????END

    ??????-- SET @title = (SELECT title_id FROM big_sales WHERE qty = (SELECT MAX(qty)

    ??????FROM big_sales))

    ??????SET @title =

    ??????CASE WHEN @counter < 999 THEN 'MC2222'

    ??????WHEN @counter BETWEEN 1000 AND 1999 THEN 'MC2222'

    ??????WHEN @counter BETWEEN 2000 AND 3999 THEN 'MC3026'

    ??????WHEN @counter BETWEEN 4000 AND 5999 THEN 'PS2106'

    ??????WHEN @counter BETWEEN 6000 AND 6999 THEN 'PS7777'

    ??????WHEN @counter BETWEEN 7000 AND 7999 THEN 'TC3218'

    ??????ELSE 'PS1372'

    ??????END

    ??????-- PRINT @separator

    ??????-- SELECT @message = STR( @counter, 10 ) -- + STR( SQRT( CONVERT( FLOAT,

    ??????@counter ) ), 10, 4 )

    ??????-- PRINT @message

    ??????BEGIN TRAN

    ??????INSERT INTO [pubs].[dbo].[big_sales]([stor_id], [ord_num], [ord_date],

    ??????[qty], [payterms], [title_id])

    ??????VALUES(@store_nbr, CAST(@ord_nbr AS CHAR(5)), @order_date, @qty_sold,

    ??????@terms, @title)

    ??????COMMIT TRAN

    ??????END

    ??????SET @message = CAST(DATEDIFF(ms, @starttime, GETDATE()) AS VARCHAR(20))

    ??????PRINT @message

    ??????/*

    ??????TRUNCATE table big_sales

    ??????INSERT INTO big_sales

    ??????SELECT * FROM sales

    ??????SELECT title_id, sum(qty)

    ??????FROM big_sales

    ??????group by title_id

    ??????order by sum(qty)

    ??????SELECT * FROM big_sales

    ??????*/


    ??????當帶SET NOCOUNT OFF命令運行,實耗時間是5176毫秒。當帶SET NOCOUNT ON命令運行,實耗時間是1620毫秒。如果不需要輸出中的行數信息,考慮在每一個存儲過程和腳本開始時增加SET NOCOUNT ON 命令將。

    ??????TOP 和 SET ROWCOUNT


    ??????SELECT 語句中的TOP子句限制單個查詢返回的行數,而SET ROWCOUNT限制所有后續查詢影響的行數。在很多編程任務中這些命令提供了高效率。
    ??????SET ROWCOUNT在SELECT,INSERT,UPDATE OR DELETE語句中設置可以被影響的最大行數。這些設置在命令執行時馬上生效并且只影響當前的會話。為了移除這個限制執行SET ROWCOUNT 0。
    一些實際的任務用TOP or SET ROWCOUNT比用標準的SQL命令對編程是更有效率的。讓我們在幾個例子中證明:

    ??????TOP n

    ??????在幾乎所有的數據庫中最流行的一個查詢是請求一個列表中的前N項。在 pubs數據庫案例中,我們可以查找銷售最好CD的前五項。比較用TOP,SET ROWCOUNT和使用ANSI SQL的三種方案。

    ??????純 ANSI SQL:

    ??????Select title,ytd_sales

    ??????From titles a

    ??????Where (select count(*)

    ??????From titles b

    ??????Where b.ytd_sales>a.ytd_sales

    ??????)<5

    ??????Order by ytd_sales DESC

    ??????這個純ANSI SQL方案執行一個效率可能很低的關聯子查詢,特別的在這個例子中,在ytd_sales上沒有索引支持。另外,這個純的標準SQL命令沒有過濾掉在ytd_sales的空值,也沒有區別多個CD間有關聯的情況。


    ??????使用 SET ROWCOUNT:

    ??????SET ROWCOUNT 5

    ??????SELECT title, ytd_sales

    ??????FROM titles

    ??????ORDER BY ytd_sales DESC

    ??????SET ROWCOUNT 0

    ??????使用 TOP n:

    ??????SELECT TOP 5 title, ytd_sales

    ??????FROM titles

    ??????ORDER BY ytd_sales DESC

    ??????第二個方案使用SET ROWCOUNT來停止SELECT查詢,而第三個方案是當它找到前五行時用TOP n來停止。在這種情況下,在獲得結果之前我們也要有一個ORDER BY子句強制對整個表進行排序。兩個查詢的查詢計劃實際上是一樣的。然而,TOP優于SET ROWCOUNT的關鍵點是SET必須處理ORDER BY子句所需的工作表,而TOP 不用。

    ??????在一個大表上,我們可以在ytd_sales上創建一個索引以避免排序。查詢將使用該索引找到前5行并停止。與第一個方案相比較,其掃描了整個表,并對每一行執行了一個關聯子查詢。在小表上,性能的差異是很小的。但是在一個大表上,第一個方案的處理時間可能是數個小時,而后兩個方法是數秒。

    ??????當確定查詢需要時,請考慮是否只需要其中幾行,如果是,使用TOP子句將節約大量時間。

    ???? (北京鑄銳數碼科技有限公司 www.InnovateDigital.com)


    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!208.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(360) | 評論 (0)編輯 收藏

    Toad快速入門
    ??????????www.InnovateDigital.com 整理

    ??一、 Toad功能綜述

    ?????在Oracle 應用程序的開發過程中,訪問數據庫對象和編寫SQL程序是一件乏味且耗費時間的工作,對數據庫進行日常管理也是需要很多SQL腳本才能完成的。Quest Software為此提供了高效的Oracle應用開發工具-Toad(Tools of Oracle Application Developers)。在Toad的新版本中,還加入了DBA模塊,可以幫助DBA完成許多日常管理工作。它最大的特點就是簡單易用,訪問速度快。使用 Toad,我們可以通過一個圖形化的用戶界面快速訪問數據庫,完成復雜的SQL和PL/SQL代碼編輯和測試工作。Toad由Oracle開發專家專門為開發人員而設計,是一個功能強大、結構緊湊的專業化PL/SQL開發環境。

    ?????Toad 主要具有如下特點:

    ??模式瀏覽:

    ?????模式瀏覽功能可以讓我們快速訪問數據字典,瀏覽數據庫中的表、索引、存儲過程。Toad 提供對數據庫的快速訪問,使用極為方便,用戶界面簡潔,結構安排合理。當我們點擊一個單獨的數據庫對象,Toad立即顯示此對象的詳細信息。例如,當我們點一個數據庫的表,所有和此表相關的索引、約束、存儲過程、SQL語句以及和其他表的相互引用關系都在同一界面顯示出來。為了簡化操作,用戶可以在瀏覽窗口操作數據庫對象。

    ??SQL 編輯器:

    ?????SQL 編輯器的主要功能是編輯、運行和調整SQL語句。TOAD 的高級編輯窗口包括眾多的特性來提高開發人員編寫SQL語句的產品化程度。例如,簡單地生成代碼模板,在編寫SQL前自動發現包的內容和列的名字等等。

    ?????SQL 編輯器包括一個編輯窗口和運行結果窗口,允許開發人員在編輯的過程中測試運行結果。SQL編輯器中不僅包括標準的編輯命令,也包括一些增強的功能,如快速查詢表中的字段、將SQL語句的內容格式化等等。這個窗口可以處理大到4GB 的內容,對大的開發項目來說非常有用。便捷的書簽可以讓開發人員非常容易地找到相關位置。在運行結果窗口可提供用戶定義的配置功能,支持LONG 和LONG RAW列,可以將數據卸出到磁盤、打印數據、編輯數據等等。

    ??存儲過程編輯器:

    ?????存儲過程編輯器的主要功能是編輯、編譯、測試、調試存儲過程和觸發器。TOAD提供語法標識、錯誤標識和其他很多易于使用的功能,如在彈出窗口顯示表名、列名和Oracle函數。和其他的 PL/SQL 編輯工具不同,TOAD 允許在一個文件中操作多個數據庫對象,可以編譯一個對象、編譯多個對象、編譯到當前光標、從光標開始編譯。在運行出現錯誤時,存儲過程停止到有問題的語句。用戶可以使用快捷方式或模板來快速編寫PL/SQL,也可以根據需要生成自己的模板。使用Toad可以非常方便地進行編輯工作,可如設置書簽、取消注釋、格式化SQL語句等等。

    ??PL/SQL Debugger選項:

    ?????Toad 提供簡單易用的PL/SQL 調試功能,可以節省開發人員在大型項目中用于開發和測試的寶貴時間,提高應用開發的質量。在存儲過程開發的過程中,Toad可以逐行編輯、調試和運行代碼。運行時可以根據需要輸入參數,觀察相關參數的變化來檢查存儲過程的正確性。在調式過程中,Toad 可以通過窗口顯示所有的斷點、參數, 調用堆棧和輸出參數。使用Toad,非常容易檢測到存儲過程的錯誤,開發人員可以一步一步運行PL/SQL語句來識別問題。調試會話可以和其他程序會話同時進行。

    ??SQLab Xpert Option:

    ?????幫助開發人員優化SQL,為他們提供各種優化模式下SQL執行計劃,并且能夠給出優化的建議,能夠比較各種模式下實際的SQL運行結果,幫助開發人員真正高速地開發高效地代碼。

    ?????Toad 還可以外掛一些別的產品,比如PL/Formatter, RevealNet Knowledge Base , SQL Impact等,這些都能夠和Toad緊密集成,共同提供了一個完美的集成開發環境。新版本還新增加了DBA模塊,更加拓廣了Toad這個產品的適用范圍。

    ??二、系統要求:

    ?????客戶端:

    • Windows 95 / 98 / NT/2000中英文均可
    • 完整安裝的SQL*Net 2.0或者Net8
    • 磁盤:一般安裝需要20M左右的空間,根據所選擇模塊的不同和安裝方式的不同,最少也要5M的磁盤空間(從網絡服務器讀取)
    • 內存:Windows 9x/Me:16M 內存;Windows NT/2000: Min 32M]
    • Tuning模塊需要額外的25M空間

    ?????服務器端:

    • Oracle 7.3 或者更高,在任何硬件平臺上。
    • 需要一個DBA用戶帳號

    ??三.安裝:

    ?????1. 三種安裝方式的選擇:

    ?????a) TOAD and Personal Configuration Files to PC 默認安裝選擇,完成一個完整的Client端的安裝,把所有需要的文件拷貝到本地Toad目錄。絕大多數用戶應該選擇使用這個安裝方式。

    ?????b) Personal Config Files to PC, read TOAD from Network Server 從網絡服務器讀取Toad程序,在本地計算機安裝一些自定義的文件,并且創建到服務器文件的快捷方式,一般不推薦使用這個方式,而且要求網絡服務器已經配置。

    ?????c) TOAD to Network Server

    ?????把Toad安裝到網絡服務器上,以便這樣別的用戶能夠進行Personal Config Files to PC, read TOAD from Network Server這種方式的安裝。

    ?????2. 根據需要使用到的特性,需要運行一些腳本(都在Toad\temps目錄下)

    • 如果需要用Toad來查看執行計劃,必須運行腳本PrepToad.sql或者notoad.sql
    • 如果希望專門建立一個Toad 用戶來存放Toad需要使用的對象的話,就運行preptoad.sql。
    • 如果希望在當前連接用戶模式下建立toad需要使用的對象的話,就運行notoad.sql。
    • 注意,如果是選擇了專門建立toad這個用戶的話,需要先修改一下腳本,指定用戶的默認表空間和臨時表空間。
    • 需要使用Oracle8i 的Profile analyzer,必須運行ToadProfiler.sql
    • 需要加強Toad的安全性,必須運行ToadSecurity.sql

    ??四、Toad使用快速入門

    ??1. Schema Browser:

    ?????Schema browser是Toad的極為有特色的模塊。在schema browser的幫助下,可以方便的瀏覽數據庫內部的各類數據庫對象,比如表,索引,序列,存儲過程等,而且可以方便的倒出DDL語句和進行各種修改,重建工作。定位到某一類對象上,這列對象允許的操作都會自動列出來。

    ?????特色:

    • 支持Oracle數據庫里面所有對象的新建、查看、修改,集成了幾乎對所有數據庫對象的管理所需要的功能。
    • 按照 模式->對象類別 ->對象->對象可操作屬性 -> 對象本身的詳細信息和對象相關的信息 來組織,非常有條理,容易定位對象,也能夠看到所有你需要的對象的相關信息。
    • 對于表:

      • 完備的建表向導,不用輸入冗長的語法,更加全面地替你考慮。
      • 可以修改表的各種邏輯和物理屬性,修改列的屬性,增加列,刪除列(在Oracle8i里面),修改表的物理存儲屬性,Truncate,Drop等。
      • 可以生成建表的完整的DDl語句,包括存儲信息,權限信息,約束,索引和觸發器等,而這些手工很難做到。
      • 可以方便的對表進行分析,查看表地所有信息,可以有條件的倒出表里面的數據,并且保存為sql語句。
      • 可以方便的對表進行重組,可以完成exp/imp作不到的事情,而且更少地人工參與,更加安全。

    • 對于視圖,存儲過程:

      • 可以保存建立視圖、存儲過程的語句為文本,
      • 重新編譯失效的視圖,存儲過程,修改視圖的定義語句等。方便的查看存儲過程的代碼,相互依賴關系,權限信息等保存為文本等。

    • 回滾段

      • 簡潔明了的online,offline狀態,方便地online/offline操作
      • 詳細的回滾段物理信息和當前狀態。
      • 可以方便的修改物理存儲屬性

    • 表空間:

      • Tablespace Map;直觀的顯示數據物理的在表空間上的分布
      • 直觀的查看各個表空間的利用率、剩余空間、破碎情況等信息
      • 可以進行各種alter操作:online, offline, 增加數據文件,改變數據文件大小,改變物理存儲屬性等

    • 對其他數據庫對象也有完備的操作支持。

    ??2. SQL Editor:

    • a) 激活SQL Editor的三種方式:

      • 連接到數據庫之后,Toad自動打開SQL Editor這個窗口
      • 點擊總工具欄上最左邊的那個按鈕
      • 從菜單欄:Database -> SQL Editor

    • b) 特點:

      • 允許同時打開多個編輯窗口,同時編輯多個SQL語句
      • 支持同時連接到多個數據庫,同時對多個數據庫進行操作
      • 允許編輯SQL,PLSQL,JAVA,HTML和文本
      • 使用書簽功能,可以在大量SQL語句里,快速定位某個語句所在位置
      • SQL Editor本身具有強大的編輯功能,非常方便編輯SQL語句。
      • 強大的快捷鍵支持和工具欄快速按鈕的支持,更加高效編寫(很多快捷鍵可以自己定義,在View ->options ->SQL Editor里面)
      • 能夠根據前面的條件,智能推測需要輸入的代碼,可以做到某種程度的代碼智能填充
      • 把鼠標定位到表/視圖/存儲過程名稱之上,按F4,可以打開對象描述窗口,方便的查看表和視圖的定義,存儲過程的源代碼,
      • 非常容易對SQL語句的分析其執行計劃:單擊工具欄上的 按鈕就可以看到Explain Plan的結果
      • 支持部分SQL*Plus命令,可以方便的執行大量的為SQL*Plus編寫的數據庫腳本
      • 可以通過SQLab xpert來對當前SQL語句進行全面的分析,給出各種合理的調優意見,只需要單擊工具欄上的Tuning按鈕
      • 可以方便的保存,打開和運行SQL腳本
      • 支持對查詢結果進行修改
      • 可以把查詢結果以多種格式保存起來,可以保存為HTML,純文本,XLS等多種格式
      • 很容易的得到SQL函數的列表和用法描述(Show SQL help Window 按鈕)
      • 可以查看SQL語句的執行情況:通過下方的AutoTrace窗口 ,看到SQL語句的實際執行結果和執行效率。
      • 支持歷史SQL(F8) :可以方便的查詢以前執行過的SQL,不用反復重新輸入。
      • 可以執行匿名塊,存儲過程,從下方的窗口看到DBMS_OUTPUT的結果

    ??3. Stored Procedure Editor

    • a) 打開存儲過程編寫器的幾個途徑:

      • 單擊總菜單欄上的第三個按鈕
      • 點擊Database - > Procedure Editor
      • 可以通過Schema browser來調用

    • b) 一些特點和優點:

      • 強大的自定義設置:從保留字的顯示方式,到自動替換,到各種快捷鍵的定義等等,用得越熟越順手。
      • 自動用不同顏色顯示SQL和PL/SQL關鍵字,語法清晰明了,可根據自己的習慣來具體定制各類關鍵字的具體顯示方式。可以自定義存儲過程得模板,在新建存儲過程的時候,自動生成程序的框架可以方便的調用Schema Browser,把鼠標定位于某個對象上,F4,Schema Browser打開該對象的詳細描述,幫助順利快速開發程序。支持代碼自動更正,如輸入ndf,自動替換成NO_DATA_FOUND,輸入the自動替換成the,類似的自動替換還可以自己修改和添加。
      • 方便的左邊行號顯示,單擊左邊行號就可以實現調試斷點的增加/刪除
      • 對各種快捷鍵的支持,不但包括常見的編輯操作,還可以有自己定義的PLSQL塊的支持(自己定義快捷方式)。如可以定義CTRL+SHIFT+D:彈出所有PLSQL Block的類型,可以自己選擇。
      • 可以在一個集成開發環境里面,一邊編碼,一邊調試,不用多處切換
      • 方便的同時打開多個存儲過程,通過頁面快速切換
      • 快速編譯存儲過程,快速定位錯誤所在,自己選擇是否同時編譯依賴的存儲過程
      • 內置對PL/Formatter,可以用PL/Formatter對存儲過程進行格式化,并且可以提供存儲過程的概要分析和修改建議;PL/Formatter可以對現有的存儲過程進行高速的格式化,使所有的存儲過程都符合同樣的編寫標準,這樣既有利于提高程序的可讀性,避免不同人寫的模塊的風格上的很差異;PL/Formatter 還有助于提高程序的模塊化,增強程序的結構清晰度,增強SQL的共用性;PL/Formatter 還可以幫助完成PL/SQL和Oracle版本之間的管理。
      • 內置RevealNet Knowledge Base,單擊鼠標右鍵就可以打開,快速得到技術上的支持,解決技術難題

        • PL/SQL
        • 包含整個開發過程中可能遇到問題的答案
        • Code Library:大量的嚴謹的PL/SQL代碼例子和現成過程,完全源代碼提供
        • 各種錯誤處理模塊可供參考,各類字符日期函數
        • 包含1400多個主題
        • Admin
        • 解答DBA日常工作中80%的常見問題,覆蓋2400多個主題
        • 從網絡到性能優化,從備份恢復到Error message,一應俱全

    • 如何用SQLab Xpert對存儲過程進行調優?

      • 需要Toad單獨的Debug Option(Standard Version 沒有這個選項)
      • 要用Toad對存儲過程進行debug,必須安裝Oracle的系統包:dbms_debug,而且必須安裝Oracle Probe API v2.0 或者更高的版本。
      • 集成在Stored Precedure Editor里面,可以一邊編寫一邊調試,大大提高開發效率
      • 打開Procedure Editor后,Debug菜單激活,可以開始進行Debug工作。
      • 允許對存儲過程進行逐行調試、斷點調試,也支持對觸發器進行調試。
      • 可以有斷點支持,支持Watch變量,允許運行時改變變量的值
      • 允許對多層調用的Debug支持

    ?????調試步驟具體舉例:

    ?????1. 點擊菜單欄的第三個按鈕: 打開Procedure Editor

    ?????2. 點擊Procedure Editor的菜單欄的 按鈕,調出需要調試的存儲過程

    ?????3. 單擊工具欄上的按鈕 ,輸入需要傳入的參數,如果不需要傳入參數,可以直接單擊工具欄上的按鈕: ,直接開始調試,如下圖輸入傳入參數:

    ?????4. 單擊菜單欄的按鈕: ,可以單步跟蹤,也可以定義一個斷點,直接運行到斷點在單步執行,在存儲過程運行的過程中,當前語句會高亮度顯示,并且把鼠標指針定位到變量上,Toad自動顯示該變量的當前值。

    ?????5. 可以隨時中止程序的執行,只要點Debug ->Halt Execution,或者菜單欄上的按鈕 ,就可以中止程序的執行

    ?????6. 當碰到一個存儲過程調用另外一個存儲過程的時候,可以選擇跳過(Step Over) ,這樣就直接運行那個被調用的存儲過程,返回調用結果,繼續這個存儲過程的調試,也可以選擇Trace Into ,這樣就打開被調用的存儲過程,進一步深入調試那個被調用的子存儲過程。如果需要保持Debug信息,在編譯的時候應該選擇Compile Dependencies with Debug Information,就是Procedure Editor工具欄最右邊的那個按鈕 。

    ?????7. 支持對變量實時追蹤:使用Watch:可以在運行前,或者運行過程中對某個變量進行實時跟蹤:Add Watch,把鼠標定位到該變量上,然后點擊Debug ->Add Watch At Cursor,該變量就會出現在Debug狀態窗口上,而且實時反應該變量的當前值。如上圖中的變量v_empname。可以運行時刻修改

    ?????8. 斷點支持:單擊存儲過程需要加斷點的地方的行號,該行顏色變紅,輸入參數,單擊執行按鈕 ,可以直接運行到斷點處,可以不必逐行追蹤,更加高效率的進行調試。

    ?????Debug Option還支持條件斷點,只有當滿足條件的時候才會在那個地方停止,否則就好像不存在這個斷點一樣繼續運行。

    ?????注意DBMS_OUTPUT.PUT_LINE的結果只有當程序執行完成以后才會出現,在程序執行過程中是沒有結果的。

    ??4. SQLab Xpert

    ?????我們知道,Oralce數據庫的優化,最主要的步驟就在于SQL的優化。而在沒有專門的工具(如Toad)的幫助下,進行SQL優化是一件非常困難和乏味的事情,并且需要對Oracle的深入理解和高超的Oracle調優技巧。使用Toad的SQLab Xpert Tuning模塊,可以使我們普通開發人員也能夠非常快速,精確的對SQL進行專家級的分析

    ?????在SQL Editor和Procedure Editor里面,選中需要調試的SQL語句(SQLab Xpert只能調試Select,Insert, Update,Delete語句),復制到SQL Editor里面,然后點擊工具欄上的調優按鈕 ,Toad會自動打開SQLab xpert 窗口,捕獲當前的SQL語句,并且把它轉化為符合explain plan格式的語句。

    ?????第一次打開Xpert的時候,Toad會提示你,需要安裝一些Server端的表、視圖和包等對象,可以把表存儲到某個指定的表空間(如Tools)里面。可以簡單的按照提示一步一步做就可以了。如果系統設定不允許Job的話(Job_queue_process=0),Toad提示有些部件不會現在安裝,可以忽略。安裝完成以后,可以選擇讓某些非DBA用戶也可以使用Toad的SQLab Xpert調優功能。

    ?????安裝完成以后,Toad會提示你一些關于優化目標方面的問題,你可以選擇每次優化都可以重新設定,或者一次設定,以后一直使用這個設定。當然如果需要,還是可以更改的,在SQLab Option xpert的窗口的Administration和Preference下面重新設定。

    ?????例子:

    ?????下面這個SQL語句涉及到多表之間的關聯,有一定的復雜性,我們可以借助Toad的SQLab Xpert Option來幫助分析:

    ?????select a.name. b.name, c.emp_name from dep a, manager b,emp c where a.dep_no=c.DEP_NO and b.manag_id=c.manag_id and c.emp_no=3

    ?????我們把這個SQL復制到SQL Editor里面,單擊上面的調優按鈕,Toad打開SQLab Xpert Option窗口。

    ?????從上面的圖中我們可以方面的看到:在各種優化模式下,該SQL語句的執行計劃分別是什么樣的,Toad給出了每一種執行計劃的具體每一個步驟,每個步驟的成本,該表涉及的相關的數據等,如果SQL存取的表還沒有經過分析,Toad會以紅色警告顯示,并且很方便的幫助你對該表進行分析,收集統計數據,重建索引等,以有助于優化器作出最好的選擇。可以把當前的分析結果保存到它的資料庫里邊,以備以后再次調用之需。

    ?????我們還可以求助與SQLab 的自動優化功能:點擊Original SQL下面的auto tune按鈕,Toad會對執行結果按照tkprof進行分析(當然,這需要你在initsid.ora里面設置好utl_file_dir,如果服務器是在Unix機器上的話,還需要通過FTP方式得到Trace文件,有一些小小的設置)。

    ?????自動優化非常高效的對所有執行計劃進行實際運行比較,并且給出實際執行的時間的對比,如下圖:

    ????? 我們還可以讓Toad給出實際的優化建議:點擊Original SQL,單擊下面的Advice按鈕,Toad根據對SQL的分析和執行結果給出合理的建議:

    ?????1. 把表和索引分別放到兩個不同的表空間,因為我們在創建表,加上約束的時候沒有指定USING INDEX子句,所以表和索引都建立在了用戶的默認表空間上了。

    ?????2. 對表EMP,DEP和MANAGER進行分析,收集最新的統計數據,有利于CBO得到最優的執行計劃

    ?????3. 在合適的列上創建索引:EMP的manag_id和dep_no。當表中存在大量的數據的時候,這樣可以大大減少由于全表掃描帶來的成本。

    ??5. SQL Modeler:

    ?????SQL Modeler可以幫助開發人員很容易的寫出各種復雜的SQL語句,只需通過簡單的拖動鼠標,就能夠寫出復雜的SQL語句來。

    ?????打開SQL Modeler的幾個途徑:

    • a) 打開存儲過程編寫器的幾個途徑:

      • 菜單欄 Database -> SQL Modeler ,打開窗口
      • 單擊工具欄第四個按鈕 ,打開SQL Modeler窗口

      ?????窗口由三個主要部分組成:

      • a) 打開存儲過程編寫器的幾個途徑:

        • 表選擇區域:最右邊的那個部分,用來選擇From子句中用到的表。拖動到左邊的區域或者雙擊就選擇了該表。
        • 表模型區域:用來圖形化的顯示選擇的表和表之間的關聯關系。
        • 生成SQL區域:這里顯示用圖形化方式創建的查詢對應的SQL語句

        ?????在SQL Modeler里面,還支持對生成的SQL進行Explain Plan,調試SQL的性能,運行SQL,看是否得到了希望的結果,保存生成的語句,或者把語句粘貼到SQL Editor里面。

        ?????有了SQL Modeler的幫助,即使是初級的程序員也能編寫出復雜而又高效的SQL查詢來。比如下面的例子

        ?????生成步驟:

        ?????1. 選出表emp, dep, manager

        ?????2. 用鼠標拖住emp的emp_name和emp_no, dep的name,manager的name

        ?????3. 雙擊criteria窗口的emp_no condition列,彈出窗口,輸入查詢條件,比如emp_no=3

        ?????4. 由于結果里面不希望emp_no出現,雙擊emp_no列的visible,設置為false

        ?????5. 這樣就出來了需要的查詢,現在可以運行查詢得到結果,對查詢SQL進行分析,或者在SQL Editor里面打開這個SQL,或者保存為SQL Model文件,或者再進一步處理,比如加排序, 匯總等。

        ?????DBA方面的功能:

        ?????Toad在DBA日常管理方面的能力是非常強大的,可以幫助DBA安全快速地完成許多日常工作,還有Toad特有的一些小工具能完成一些普通方法很難做到的功能。下面大概講述了各個常用模塊的主要功能:

        ?????a) Database Monitor

        ?????提供直觀的Oracle數據庫運行狀況,包括下面這些詳細信息:可以看到邏輯IO,物理IO,各個狀態的session數目,SGA的利用率,共享池的使用狀況,各類事件的等待狀況,以及各類事件隨著時間的變化情況

        ?????b) Instance Monitor

        • 可以用來檢查本地tnsnames.ora文件里面定義的所有節點、Listener和數據庫的運行狀態和版本等相關信息。
        • 可以遠程啟動、關閉數據庫(如果設置了password驗證方式)

        ?????c) Unix Monitor:

      • 可以監控Unix機器的運行狀況比如詳細的機器啟動時間,CPU利用率,主要的進程以及這些進程占用的資源,主要的磁盤IO等。

        ?????d) Trace/Kill session

        • 方便的查看所有的連接用戶相關信息:比如終端,程序,連接時間等
        • 對某個用戶進行跟蹤,查看用戶執行的SQL語句,查看語句的執行計劃
        • 方便的查閱系統的Lock對象,有沒有什么等待別的事務釋放鎖的情況,并能夠輕易查出等待什么用戶的什么事件結束,那個用戶執行的是什么SQL。
        • 查看回滾段的使用狀態,什么用戶,什么語句,使用的什么回滾段,多少讀寫量等

        ?????e) Oracle Parameter

      • 可以方便的查看Oracle系統的參數:是否默認值,參數作用的簡要描述,是否可以用alter session/alter system來動態改變,對于那些可以動態改變的參數,可以雙擊鼠標來進行修改

        ?????f) NLS_PARAMETER:

        • 方便的查看session,instance,database一級的NLS參數值
        • 可以動態修改session的NLS參數值

        ?????g) Extents

        • 可以查看某個用戶下的表和索引的詳細的存儲情況
        • 發現那些占用大量空間的表和索引,可以考慮使用相應的對策,比如分區
        • 發現那些即將達到max_extents的表和索引并可以及時糾正
        • 發現那些索引和表處于同一個表空間的情況,并可以及時糾正。

        ?????h) Tablespace

        • 直觀的查看每個表空間的利用率,總空間,已使用空間,剩余可是用空間以及默認存儲參數,和表空間是否需要整理等信息
        • 查看每個表空間的狀態,組成的數據文件, 以及每個數據文件的詳細信息
        • 查看每個表空間里面存在的對象和這些對象的詳細存儲特性

        ?????i) Tablespace Map:

      • 圖形化的顯示表空間里面各個表/索引所占用的空間,各個segment的大小,segment是否連續等信息,非常直觀

        ?????j) Server Statistics:

        • 可以非常直觀的看到系統總體運行情況,迅速定位系統瓶頸所在
        • 可以查看系統范圍內各類等待事件的狀況,查看每個連接會話的狀況

        ?????k) Pinned Code:

        • 我們知道,頻繁執行的大的存儲過程最好Pin起來,這樣可以避免被Oracle在內存不足的情況下換出內存,避免動態加載,也避免flush shared pool的時候被清出內存。
        • 根據每個模塊的大小,執行次數,決定是否要把某個存儲過程PIN起來。一個按鈕就搞定了。

        ?????l) Control Files:

        ?????可以查看當前系統有哪幾個控制文件,以及控制文件內部記錄的詳細信息。(實際上就是V$CONTROLFILE, V$CONTROLFILE_RECORD_SECTION)

        ?????m) Redo Log Manager:

        • 可以方便的查看LOG的組,當前日志,每個組里面的成員名字,大小,方便的增加、刪除log組,切換當前日志,對日志歸檔進行具體的控制。
        • 可以在這個界面里完成幾乎所有的對redo log的操作。

        ?????n) Repair chained rows:

      • Chained rows影響系統性能,處于系統性能的考慮,需要把chained rows修復成普通的表的行。使用repaie chained rows,就可以比較容易的做到這一點。選擇需要分析的表,然后分析一下,看有沒有chained rows,如果有,點擊repair,Toad就幫你把那些chained rows給修復了。

        ?????o) Identify Space Deficits

        ?????如果系統出現1659,1653錯誤,就是一個不合格的DBA。但是要即時預見這些錯誤,還是有一定的難度的。有了Toad的這個小工具之后,一點某個表空間,就知道這個表空間里面的剩余自由空間是否允許任何表能夠擴展到下一個extent。并能夠在發現問題之后,直接改正問題。

        ?????p) Estimate Table/Index Size

        • 數據庫的物理規劃中,表/索引的存儲子句的定義是非常重要的,影響系統。但是沒有什么工具的話,要為表定義合理的存儲子句也不容易。
        • 在Toad里面,專門有工具幫助你合理定義表/索引的存儲情況:

          ?????1. 自己可以定義將來表中需要存儲的數據的數目

          ?????2. 多種估計方式:

          • 根據對已有的數據的分析來定義表的大小(最精確,但是比較慢)
          • 根據表定義數據類型來定義表的大小
          • 根據數據字典中以前分析過的數據來估計大小(需要近期分析過該表)

        ?????q) Analyze All Tables

        • 基于CBO的SQL需要CBO提供最優化的執行路徑來提高程序的執行效率,但是假如對表進行大量的DML操作之后,不及時更新表的統計數據,這時候CBO就不能選擇最為有效的執行路徑,導致程序執行效率低。
        • 手工分析表比較麻煩,一個一個做。
        • 用Toad的Analyze Alltables這個工具,可以一次分析整個模式下面的所有表,有豐富的控制選項,包括是采用估計還是完全,是否同時分析索引,估計的話,采用多大的百分比等。

        ?????r) Rebuild Table

        • 當表中的數據被反復大量的DML之后,而且PCTFREE和PCTUSED定義的不合理的情況下,表可能會變得非常破碎,占用大量的extent,索引也會相當破碎,導致效率相當低下。
        • 傳統的方式是通過exp/imp來解決這個問題,但是步驟實在比較麻煩,手工操作也有一定的危險性。
        • 使用Rebuild Table工具,輕松搞定,而且可以手工修改一些通過EXP/IMP無法修改的參數,比如freelists ,freelists group, tablespace,initial等,還能夠更改列的名字。

        ?????s) Relocate Index

        • 我們知道,表和索引一般都需要分開存放到不同的表空間,這樣比較便于管理,性能上也會有一定的提高,因為可以對表和索引同時存取。
        • 但是實際上很多時候,由于這樣那樣的原因,常常忽略了索引單獨存放這個基本概念,比如建立主鍵約束的時候沒有加USING INDEX子句,后來disable/enable了主鍵約束/唯一性約束等,都會導致把索引直接存放到和表同一個表空間里面。
        • 手工發現這些索引,再逐個移動非常麻煩,容易出錯,在Toad里面,就很容易根據用戶/表空間來發現那些不恰當存放的索引,可以批量移動這些索引,并且允許重新定義索引的存儲子句。

        ?????t) Generate Schema Scripts:

        • 可以用來生成整個用戶下所有/部分對象的DDL語句。可以把結果保存為sql語句或者保存為TOAD的自定義格式。
        • 可以用來復制表結構,(EXP/IMP有非常嚴重的缺陷,就是從一個大的數據庫倒出的表結構,無法導入到一個小的數據庫里面,因為里面包含了原來表的存儲信息,即使選擇rows=N,也要在導入數據庫里面占用相當大的空間)

        ?????u) Compare Schema:

        • 在開發的時候,有時候同時在幾個開發庫上開發,但是最后兩個庫的結構不完全一樣,很難比較
        • 用TOAD的這個功能,可以對兩個數據庫的模式(用戶)下面的所有對象(包括存儲過程)進行比較,可以選擇具體的比較內容。
        • 可以通過直接打開兩個到各自數據庫的連接,或者根據Toad generate schame scripts生成的文件進行對比。
        • 可以直接生成同步兩個數據庫的sql腳本,給出匯總的區別簡要和詳細報告等。



    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!210.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(993) | 評論 (0)編輯 收藏
    構建高性能的J2EE應用不但需要了解常用的實施技巧。下面介紹最常用的10種有效方法,可幫助架構設計師們快速成為這方面的專家。

    Java性能的基礎----內存管理

    ????????任何Java應用,單機的或J2EE的性能基礎都可歸結到你的應用是如何管理內存的問題。Java的內存管理包括兩個重要任務:內存的分配和內存的回收。在內存的分配中,目標是要減少需要創建的對象。 內存回收是導致性能下降的普遍原因。也就是說,內存中的對象越多,垃圾回收越困難。所以我們對創建對象的態度應該越保守越好。

    ????????在J2EE應用中常見的兩個內存有關的問題是:游離的對象(也被稱為內存泄露)和對象循環(指大量頻繁創建和刪除-在Java中體現為解除引用---對象)。

    ????????我們應注意確保所有可到達的對象實際是活的,即這些對象不但在內存中,而且也要在執行的代碼中是存在的。當對象在應用中已經沒有用了,而我們卻忘記了刪除對該對象的引用時,游離的對象就出現了。

    ????????我們知道垃圾回收會占用CPU時間。短期對象的大量創建增加了垃圾回收的頻率會造成性能下降。

    不要在Servlet中實現業務邏輯

    ????????在構建J2EE應用時,架構工程師通常會使用到J2EE的基本部分,Servlet。

    ????????如果架構師不使用Session Beans, Entity Beans, 或 Message Beans, 那么改進性能的方法就很少。只能采用增加CPU或更多的物理服務器等方法。EJB使用了緩存(cache)和資源池等方法可以提高性能和擴展性。

    盡可能使用本地接口訪問EJB

    ????????在早期的J2EE (遵循EJB1.X規范)應用中,訪問EJB是`通過RMI使用遠程接口實現的。隨著EJB2.0的出現,可以通過本地接口訪問EJB,不再使用RMI,在同一個JVM中使用遠程方法已經少多了。但是現在還是有一些使用EJB1.X實現的應用和不知道使用本地接口的一些EJB新手。為說明這點,我們作個比較:

    ????????1. 客戶端應用調用本地Stub

    ????????2. 該Stub裝配參數

    ????????3. 該Stub傳到skeleton

    ????????4. 該skeleton分解參數

    ????????5. 該skeleton調用EJB對象

    ????????6. EJB對象執行容器服務

    ????????7. EJB對象調用企業BEAN實例

    ????????8. 企業BEA執行操作

    ????????9. 執行組裝/分解步驟然后返回

    ????????與遠程接口處理相比較,本地接口的EJB方法是:

    ????????????????1. 客戶端調用本地對象

    ????????????????2. 本地對象執行容器服務

    ????????????????3. 本地對象調用企業Bean實例

    ????????????????4. 企業Bean實例執行操作

    ????????????????5. 沒有其他返回步驟

    ????????如果你不需要從遠程的客戶端訪問一個特殊EJB,就應該使用本地方法。

    在實現Session Bean的服務中封裝對實體EJB的訪問

    ????????從Servlet訪問實體EJB不但效率低而且難于維護。使用Session Fa?ade(會話外觀)模式可把對實體EJB的訪問封裝在會話EJB中,在該會話EJB中通過使用本地接口訪問實體EJB而避免過多的遠程調用。

    ????????這項技術會有額外的性能和擴展方面的好處,這是因為會話和實體EJB可以使用緩存和資源池技術來進行改進。另外,由于負載的需要,會話和實體EJB可被擴展部署到其他硬件設備上,這比將Servlet層復制擴展到其他硬件設備上要簡單的多。

    盡量粗粒度訪問遠程EJB

    ???????? 當訪問遠程EJB時,調用set/get方法將產生過多的網絡請求,同時也導致遠程接口處理的過載。為避免這種情況,可考慮將數據屬性集中在一個對象中,這樣通過一次對遠程EJB的調用就可以傳遞所有數據。這項技術就是數據傳輸對象(Data Transfer Object)模式。

    優化SQL

    ????????J2EE的架構設計工程師和開發人員通常不是SQL專家或經驗豐富的數據庫管理員。首先應該確保SQL使用了數據庫提供的索引支持。在某些情況下,將數據庫的索引和數據分開存放會提高性能。但要知道,增加額外的索引可以提高SELECT性能但也會降低INSERT的性能。對于某些數據庫,關聯表之間的排序會嚴重影響性能。可以多向數據庫管理員咨詢。

    避免在實體EJB中過多執行SQL

    ????????有時候,通過實體EJB訪問數據會執行多個SQL語句。根據J2EE 規范,第一步,將調用實體Bean的find(發現)方法;第二步,在第一次調用實體EJB的業務方法時,容器會調用ejbLoad()從數據庫中獲得信息。

    ????????很多CMP(容器管理持久性)在調用發現方法時就緩存了實體數據,所以在調用ejbLoad()時就不再訪問數據庫了。應該避免使用BMP(Bean管理的持久性)或者自己實現緩存算法避免二次訪問數據庫。

    使用Fast Lane Reader 模式訪問只讀數據

    ????????J2EE應用經常要以只讀方式訪問大量長時間不變的數據,而不是訪問單個實體,例如瀏覽在線產品目錄。在這種只讀情況下,使用實體EJB訪問數據會導致嚴重過載并且實現很麻煩。實體EJB 適合于對單個實體的粗粒度訪問,訪問大量的列表只讀數據時效率不高。不管是使用CMP還是BMP,一定需要編寫代碼操作多個實體EJB及其關聯。這將導致訪問多個數據庫并存在大量的也是不必要的事務開銷。

    利用Java Messaging Servce(消息服務)

    ????????J2EE規范在JMS中提供了內置的異步處理服務。當涉及到系統需求時,應該了解在什么情況下應該采用JMS進行異步處理的設計。一旦確定要執行一些異步處理,那么同步處理的任務就應該越少越好,將數據庫密集的操作安排在稍后的異步處理中完成。

    緩存JNDI Lookup查找

    ????????很多操作在進行JNDI查找時要消耗大量資源。通常應該緩存JNDI資源避免網絡調用和某些處理的過載。可以緩存的JNDI查找包括:

    ????????EJB Home Interfaces

    ????????Data Sources

    ????????JMS Connection Factories

    ????????JMS Destinations/Topics

    ????????一些JNDI包實現了緩存功能。但是調用對EJB主接口的narrow方法時,這種功能作用有限。

    ????????緩存查找的設計應該使用共享的IntialContext實例,盡管構建它很麻煩。這是因為需要訪問多種數據源,包括應用資源文件JNDI.properties,系統屬性的各項參數,傳入到構造函數的各項參數。

    (北京鑄銳數碼科技有限公司 www.InnovateDigital.com)


    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!211.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(203) | 評論 (0)編輯 收藏
    <SCRIPT LANGUAGE=javascript>
    function p_del() {
    var msg = "您真的確定要刪除嗎?\n\n請確認!";
    if (confirm(msg)==true){
    return true;
    }else{
    return false;
    }
    }
    </SCRIPT>
    調用方法:
    <a href="del.jsp?id=<%=id%>" onclick="javascript:return p_del()">刪 除</a>

    轉載:http://www.zhuoda.org/Jason/44762.html

    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!215.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(250) | 評論 (0)編輯 收藏
    現在要實現這樣一個功能,在一個頁面中有一個輸入文本框,有一個提交按鈕,如果文本框為空就點提
    交按鈕,則提示輸入。現在要使用下面一段javascript代碼:
    <script language="javascript">
    ?function check(){
    ??if(document.all.DETAIL_ID.value.length==0){
    ???alert('請輸入DETAIL_ID!');
    ???return false;
    ??}
    ???? else{
    ??document.all.sampleTestForm.submit();
    ?? }
    ?}
    ?
    </script>
    現在在提交按鈕<html:submit property="button" value="測試" onclick="check();"></html:submit>
    中加入了提交檢驗onclick="check();"? 但因為這是一個提交按鈕,所以檢驗是雖然彈出了對話框要求
    輸入ID,但點擊確定后還是接著往下執行了action,因為按鈕點擊完后就自動執行,所以這里要把
    <html:submit? 改為 <html:button 才行。
    ***************************:
    還有注意檢驗成功后要執行提交操作,就要將表單提交到ACTION中執行,這是就必須要在表單中加入一
    個表單名字才可以用上面語句進行提交,在struts的<html:form 中加上name屬性的同時也必須要加上
    type屬性才可以,這里就跟struts-config.xml配置文件中配置此頁面用到的formbean是一致的,name對
    應的type是formbean的完整路徑。
    *****************************代碼如下:*************************************
    <html:form? name="sampleTestForm"?
    type ="com.picclife.bi.test.finance.struts.form.SampleTestForm" action="sampleTest.do"
    method="post" focus="DETAIL_ID">

    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!216.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(859) | 評論 (2)編輯 收藏
    在b/s開發中經常用到的javaScript技術

    一、驗證類
    1、數字驗證內
    1.1 整數
    1.2 大于0的整數 (用于傳來的ID的驗證)
    1.3 負整數的驗證
    1.4 整數不能大于iMax
    1.5 整數不能小于iMin
    2、時間類
    2.1 短時間,形如 (13:04:06)
    2.2 短日期,形如 (2003-12-05)
    2.3 長時間,形如 (2003-12-05 13:04:06)
    2.4 只有年和月。形如(2003-05,或者2003-5)
    2.5 只有小時和分鐘,形如(12:03)
    3、表單類
    3.1 所有的表單的值都不能為空
    3.2 多行文本框的值不能為空。
    3.3 多行文本框的值不能超過sMaxStrleng
    3.4 多行文本框的值不能少于sMixStrleng
    3.5 判斷單選框是否選擇。
    3.6 判斷復選框是否選擇.
    3.7 復選框的全選,多選,全不選,反選
    3.8 文件上傳過程中判斷文件類型
    4、字符類
    4.1 判斷字符全部由a-Z或者是A-Z的字字母組成
    4.2 判斷字符由字母和數字組成。
    4.3 判斷字符由字母和數字,下劃線,點號組成.且開頭的只能是下劃線和字母
    4.4 字符串替換函數.Replace();
    5、瀏覽器類
    5.1 判斷瀏覽器的類型
    5.2 判斷ie的版本
    5.3 判斷客戶端的分辨率
    6、結合類
    6.1 email的判斷。
    6.2 手機號碼的驗證
    6.3 身份證的驗證
    二、功能類
    1、時間與相關控件類
    1.1 日歷
    1.2 時間控件
    1.3 萬年歷
    1.4 顯示動態顯示時鐘效果(文本,如OA中時間)
    1.5 顯示動態顯示時鐘效果 (圖像,像手表)
    2、表單類
    2.1 自動生成表單
    2.2 動態添加,修改,刪除下拉框中的元素
    2.3 可以輸入內容的下拉框
    2.4 多行文本框中只能輸入iMax文字。如果多輸入了,自動減少到iMax個文字(多用于短信發送)
    3、打印類
    3.1 打印控件
    4、事件類
    4.1 屏蔽右鍵
    4.2 屏蔽所有功能鍵
    4.3 --> 和<-- F5 F11,F9,F1
    4.4 屏蔽組合鍵ctrl+N
    5、網頁設計類
    5.1 連續滾動的文字,圖片(注意是連續的,兩段文字和圖片中沒有空白出現)
    5.2 html編輯控件類
    5.3 顏色選取框控件
    5.4 下拉菜單
    5.5 兩層或多層次的下拉菜單
    5.6 仿IE菜單的按鈕。(效果如rongshuxa.com的導航欄目)
    5.7 狀態欄,title欄的動態效果(例子很多,可以研究一下)
    5.8 雙擊后,網頁自動滾屏
    6、樹型結構。
    6.1 asp+SQL版
    6.2 asp+xml+sql版
    6.3 java+sql或者java+sql+xml
    7、無邊框效果的制作
    8、連動下拉框技術
    9、文本排序
    一、驗證類
    1、數字驗證內
    1.1 整數
    /^(-|+)?d+$/.test(str)
    1.2 大于0的整數 (用于傳來的ID的驗證)
    /^d+$/.test(str)
    1.3 負整數的驗證
    /^-d+$/.test(str)
    2、時間類
    2.1 短時間,形如 (13:04:06)
    function isTime(str)
    {
    var a = str.match(/^(d{1,2})(:)?(d{1,2})2(d{1,2})$/);
    if (a == null) {alert('輸入的參數不是時間格式'); return false;}
    if (a[1]>24 || a[3]>60 || a[4]>60)
    {
    alert("時間格式不對");
    return false
    }
    return true;
    }
    2.2 短日期,形如 (2003-12-05)
    function strDateTime(str)
    {
    var r = str.match(/^(d{1,4})(-|/)(d{1,2})2(d{1,2})$/);
    if(r==null)return false;
    var d= new Date(r[1], r[3]-1, r[4]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
    }
    2.3 長時間,形如 (2003-12-05 13:04:06)
    function strDateTime(str)
    {
    var reg = /^(d{1,4})(-|/)(d{1,2})2(d{1,2}) (d{1,2}):(d{1,2}):(d{1,2})$/;
    var r = str.match(reg);
    if(r==null)return false;
    var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
    }
    2.4 只有年和月。形如(2003-05,或者2003-5)
    2.5 只有小時和分鐘,形如(12:03)
    3、表單類
    3.1 所有的表單的值都不能為空
    <input onblur="if(this.value.replace(/^s+|s+$/g,'')=='')alert('不能為空!')">
    3.2 多行文本框的值不能為空。
    3.3 多行文本框的值不能超過sMaxStrleng
    3.4 多行文本框的值不能少于sMixStrleng
    3.5 判斷單選框是否選擇。
    3.6 判斷復選框是否選擇.
    3.7 復選框的全選,多選,全不選,反選
    3.8 文件上傳過程中判斷文件類型
    4、字符類
    4.1 判斷字符全部由a-Z或者是A-Z的字字母組成
    <input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有錯')">
    4.2 判斷字符由字母和數字組成。
    <input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有錯')">
    4.3 判斷字符由字母和數字,下劃線,點號組成.且開頭的只能是下劃線和字母
    /^([a-zA-z_]{1})([w]*)$/g.test(str)
    4.4 字符串替換函數.Replace();
    5、瀏覽器類
    5.1 判斷瀏覽器的類型
    window.navigator.appName
    5.2 判斷ie的版本
    window.navigator.appVersion
    5.3 判斷客戶端的分辨率
    window.screen.height; window.screen.width;
    6、結合類
    6.1 email的判斷。
    function ismail(mail)
    {
    return(new RegExp(/^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/).test(mail));
    }
    6.2 手機號碼的驗證
    6.3 身份證的驗證
    function isIdCardNo(num)
    {
    if (isNaN(num)) {alert("輸入的不是數字!"); return false;}
    var len = num.length, re;
    if (len == 15)
    re = new RegExp(/^(d{6})()?(d{2})(d{2})(d{2})(d{3})$/);
    else if (len == 18)
    re = new RegExp(/^(d{6})()?(d{4})(d{2})(d{2})(d{3})(d)$/);
    else {alert("輸入的數字位數不對!"); return false;}
    var a = num.match(re);
    if (a != null)
    {
    if (len==15)
    {
    var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
    var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    else
    {
    var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
    var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    if (!B) {alert("輸入的身份證號 "+ a[0] +" 里出生日期不對!"); return false;}
    }
    return true;
    }
    3.7 復選框的全選,多選,全不選,反選
    <form name=hrong>
    <input type=checkbox name=All onclick="checkAll('mm')">全選<br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/><br/>
    <input type=checkbox name=All2 onclick="checkAll('mm2')">全選<br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    </form>
    <SCRIPT LANGUAGE="JavaScript">
    function checkAll(str)
    {
    var a = document.getElementsByName(str);
    var n = a.length;
    for (var i=0; i<n; i++)
    a[i].checked = window.event.srcElement.checked;
    }
    function checkItem(str)
    {
    var e = window.event.srcElement;
    var all = eval("document.hrong."+ str);
    if (e.checked)
    {
    var a = document.getElementsByName(e.name);
    all.checked = true;
    for (var i=0; i<a.length; i++)
    {
    if (!a[i].checked){ all.checked = false; break;}
    }
    }
    else all.checked = false;
    }
    </SCRIPT>
    3.8 文件上傳過程中判斷文件類型
    <input type=file onchange="alert(this.value.match(/^(.*)(.)(.{1,8})$/)[3])">
    畫圖:
    <OBJECT
    id=S
    style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px"
    height=240
    width=392
    classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6">
    </OBJECT>
    <SCRIPT>
    S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);
    S.DrawingSurface.ArcRadians(30,0,0,30,50,60);
    S.DrawingSurface.Line(10,10,100,100);
    </SCRIPT>
    ?

    文章來源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!217.entry
    posted @ 2007-03-31 10:49 阿偉 閱讀(237) | 評論 (0)編輯 收藏
    僅列出標題
    共8頁: 上一頁 1 2 3 4 5 6 7 8 下一頁 
    主站蜘蛛池模板: 亚洲国产日产无码精品| 青草草色A免费观看在线| 亚洲午夜一区二区三区| 久久国产亚洲精品麻豆| 国产一卡二卡≡卡四卡免费乱码| 在线a免费观看最新网站| 免费萌白酱国产一区二区三区| 美美女高清毛片视频黄的一免费 | 国产亚洲成人久久| 日韩免费观看视频| 91香蕉视频免费| 亚洲黄色免费在线观看| 国产精品免费无遮挡无码永久视频 | 亚洲日韩精品无码专区| 久久精品亚洲中文字幕无码麻豆| 亚洲一区二区三区AV无码| 免费一级毛片免费播放| 全免费a级毛片免费**视频| 日本成年免费网站| a级片在线免费看| 三上悠亚电影全集免费| 亚洲第一se情网站| 亚洲 欧洲 自拍 另类 校园| 久久99国产亚洲精品观看| 亚洲国产精品无码久久一区二区 | 久久久久久AV无码免费网站下载 | 亚洲国产美女精品久久久久∴| 亚洲AV无码成人网站久久精品大| 亚洲人成亚洲精品| 亚洲一级免费毛片| 亚洲第一第二第三第四第五第六| 欧洲美女大片免费播放器视频| a毛片成人免费全部播放| 四虎影视成人永久免费观看视频| 成人福利免费视频| 黄a大片av永久免费| 亚洲国产午夜福利在线播放 | 成人au免费视频影院| 亚洲国产精品综合久久网络| 精品国产亚洲一区二区三区 | 情人伊人久久综合亚洲|