志當存高遠,功到自然成!

          少年強則中國強,少年進步則中國進步!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

          #

          根 據(jù)網(wǎng)上搜索到的一些例子做的時候碰到了挺多的問題,經過不懈的努力終于完成了這個webservice的例子,實際上axis的文檔上也寫了一個例子,網(wǎng) 上的例子也大多都是照他上面所寫的那樣,只是有些講的不算很詳細,所以產生了不少錯誤,小弟知識淺薄,如有寫的不清楚地地方,還請見諒

          所需軟件
          tomcat        :http://tomcat.apache.org/index.html
          axis          :http://ws.apache.org/axis/
          jdk           :http://java.sun.com/javase/downloads/index.jsp
          jaf           :http://java.sun.com/products/javabeans/jaf/downloads/index.html
          xmlrpc        :http://ws.apache.org/xmlrpc

          XML解析器
          Xalan         :http://archive.apache.org/dist/xml/xalan-j/
          Xerces        :http://xml.apache.org/dist/xerces-j/

          本例講解axis定制發(fā)布

          本實例采用
          j2sdk1.4.2_05,tomcat5.0.28,axis1.4,jbuilder X / Eclipse3.2

          首先將axis解壓至相應目錄,如d:\下,安裝tomcat至c:\tomcat5,安裝jdk至c:\ j2sdk1.4.2_05
          然后將d:\axis\webapp目錄下的axis目錄copy至c:\tomcat5\webapps目錄下

          設置axis的環(huán)境變量

          AXIS_HOME=d:\axis

          AXIS_LIB=%AXIS_HOME%\lib

          AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\activation.jar;%AXIS_LIB%\xmlrpc-2.0.jar

           

          (xml-apis.jar, xercesImpl.jar屬于Xerces或Xalan, activation.jar屬于jaf, xmlrpc-2.0.jar屬于xmlrpc)

          1. 配置完成后啟動tomcat,在瀏覽器中鍵入http://localhost:8080/axis,將顯示如下畫面

          查看更多精彩圖片

          2.在C:\Tomcat5\webapps\axis\WEB-INF目錄下建立一個src目錄,用于存放源程序
          接著編寫服務端程序server.AxisReturn
          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName) {
                return "Axis Return: "+ servicesName;
              }
          }
          在 此我們利用了Jbuilder X作為我們java程序的開發(fā)工具,利用Jbuilder新建工程中的Project for Existing Code將C:\Tomcat5\webapps\axis\WEB-INF下的程序及目錄導入作為Jbuilder的一個工程來操作

          查看更多精彩圖片
          編譯AxisReturn程序,Jbuilder將會把編譯后的class文件自存放在C:\Tomcat5\webapps\axis\WEB-INF\classes\server目錄下

          3.編寫wsdd文件,此處命名為deploy.wsdd,其內容為

          <deployment xmlns=http://xml.apache.org/axis/wsdd/
                        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
          <service name="AxisReturn" provider="java:RPC">
              <parameter name="className" value="server.AxisReturn"/>
              <parameter name="allowedMethods" value="*"/>
          </service>
          </deployment>


          每個service就代表服務端的一個程序,如有多個可繼續(xù)添加service,相關參數(shù)請查閱axis文檔
          此處的deployment代表發(fā)布服務,如改為undeployment則為撤銷服務

          4.發(fā)布服務
          打開windows的命令窗口,轉到wsdd文件的存放目錄下,此處為C:\Tomcat5\webapps\axis\WEB-INF\src\server
          在命令窗口中鍵入
          java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd

          如果成功將顯示<Admin>Done processing</Admin>
          如失敗,則檢查AXISCLASSPATH是否設置正確,tomcat端口是否為默認的8080
          在這里有一個問題需注意,不管是在axis目錄下還是其他虛擬目錄下,如直接執(zhí)行這條命令,都將在axis的目錄下發(fā)布service,如果想發(fā)布在其他的目錄下,如pscsaxis,則應執(zhí)行
          java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/pscsaxis/services/AdminService deploy.wsdd

          -cp表示在AXISCLASSPATH環(huán)境變量中檢索org.apache.axis.client.AdminClient方法

          5.生成client stub文件
          在命令窗口中將目錄轉至C:\Tomcat5\webapps\axis\WEB-INF\classes
          然后執(zhí)行
          java -cp %AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -oAxisReturn.wsdl -lhttp://localhost:8080/axis/services/AxisReturn -nAxisReturn server.AxisReturn

          將會在C:\Tomcat5\webapps\pscsaxis\WEB-INF\classes下生成AxisReturn.wsdl文件
          接著在執(zhí)行
          java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java AxisReturn.wsdl -p client

          將會在C:\Tomcat5\webapps\axis\WEB-INF\classes\client目錄下生成四個java文件
          AxisReturn_PortType.java
          AxisReturnService.java
          AxisReturnServiceLocator.java
          AxisReturnSoapBindingStub.java
          將這四個文件剪切至C:\Tomcat5\webapps\pscsaxis\WEB-INF\src\client目錄下,并編譯

          6.編寫客戶端
          利用生成client stub文件編寫

          package client;
          public class ClientAxisReturn {
              public static void main(String args[]) {
                try {
                  AxisReturnService service = new client.AxisReturnServiceLocator();
                  client.AxisReturn_PortType client = service.getAxisReturn();
                  String retValue = client.returnMsg("BaoSteel");
                  System.out.println(retValue);
                }
                catch (Exception e) {
                  System.err.println("Execution failed. Exception: " + e);
                }
              }
          }

          編寫完后,編譯運行即可得到返回結果
          如需傳入多個參數(shù),需在String retValue = client.returnMsg("BaoSteel");這句中增加參數(shù),如
          String retValue = client.returnMsg("BaoSteel","PSCS_IMS");
          相應的服務端也要更改,如
          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName,String serviceID) {
                return "Axis Return: "+ servicesName+ serviceID;
              }
          }

          利用發(fā)布服務的wsdl的URL編寫
          package client;
          import org.apache.axis.AxisFault;
          import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;
          import javax.xml.rpc.ParameterMode;
          import javax.xml.rpc.encoding.XMLType;
          public class ClientAxisReturnWsdl {
              public static void main(String args[]) throws Exception{
                String endPoint =
                  
          http://190.2.63.239:8080/pscsaxis/services/AxisReturn?wsdl;
                Service service = new Service();
                Call call = (Call) service.createCall();
                Object result;
                try {
                  call.setTargetEndpointAddress(new java.net.URL(endPoint));
                  call.setOperationName("ReturnMsg");
                  call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
                  call.setReturnType(XMLType.XSD_STRING);
                  result = (Object) call.invoke(new Object[] {"BaoSteel"});
                }
                catch (AxisFault fault) {
                  result = "Error is: " + fault.toString();
                }
                System.out.println(result);
              }
          }

          編寫完后,編譯運行即可得到返回結果
          如許增加參數(shù),則需添加語句
          call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
          將參數(shù)名OP1改為其他,如OP2
          在result = (Object) call.invoke(new Object[] {" BaoSteel "});這句中增加參數(shù),如
          result = (Object) call.invoke(new Object[] {" BaoSteel "," PSCS_IMS "});
          相應的服務端也要更改,如
          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName,String serviceID) {
                return "Axis Return: "+ servicesName+ serviceID;
              }
          }

          ★在這里,我們的服務端只有一個方法供我們調用,如果我們需要調用多個服務端的方法,則可在服務端中加入其他方法,如我們在增加一個xxMsg

          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName,String systemID) {
                return "Axis Return: "+ str+servicesName+systemID;
              }
              public String xxMsg(String serviceName,String systemID) {
              return "XX Return: "+ str+serviceName+systemID;
          }
          }

          ★修改完后將其編譯,并將其注銷后重新發(fā)布,反之需要重起tomcat,否則服務將不被更新
          ★利用生成client stub文件編寫的客戶端程序,還需重新生成client stub文件,并將其編譯,在客戶端程序中調用其相應得方法即可

          SOAPMonitor的配置

          發(fā) 布了Web服務以后,如何觀察請求和響應數(shù)據(jù)呢?記錄運行日志是一種傳統(tǒng)且有效的方法,但對于調試程序來講還不夠方便和直觀。值得欣慰的是,Axis為我 們提供了在客戶端觀察SOAP請求和響應流數(shù)據(jù)的工具SoapMonitor,經過適當配置后,可以實時地觀察到Web服務的SOAP請求和響應數(shù)據(jù)。 SoapMonitor是一個Java Applet程序,通過瀏覽器下載到客戶端運行。下面就介紹SoapMonitor的配置和使用方法。

          在C:\Tomcat5\webapps\axis的目錄下有一個SOAPMonitorApplet.java的程序,axis默認沒有給我們編譯,我們需要自己進行編譯

          打開windows命令窗口,轉到C:\Tomcat5\webapps\axis目錄下,執(zhí)行
          javac -classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java

          編譯完成后需要發(fā)布服務,我們需要建立一個wsdd文件deploy-monitor.wsdd,內容如下

          <deployment xmlns=http://xml.apache.org/axis/wsdd/
                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
              <handler name="soapmonitor"
                  type="java:org.apache.axis.handlers.SOAPMonitorHandler">
                <parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
                <parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
                <parameter name="serviceName" value="SOAPMonitorService"/>
                <parameter name="portName" value="Demo"/>
              </handler>
              <service name="SOAPMonitorService" provider="java:RPC">
                <parameter name="allowedMethods" value="publishMessage"/>
                <parameter name="className" value="org.apache.axis.monitor.SOAPMonitorService"/>
                <parameter name="scope" value="Application"/>
              </service>
          </deployment>

          需要注意的是紅色的那句語句,如果是在我們自己的web應用目錄下的話需改成自己的目錄。
          建立完成后執(zhí)行命令進行發(fā)布
          java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy-monitor.wsdd

          發(fā)布SOAPMonitor服務后,還要對被監(jiān)測的Web服務進行配置。方法是先注銷該Web服務,然后修改該服務對應的WSDD文件,在其中增加請求流和響應流的配置,否則是觀測不到SOAP請求和響應流的。以我們上面的程序為例,將deploy.wsdd修改為

           

          <deployment xmlns=http://xml.apache.org/axis/wsdd/
                        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
          <service name="AxisReturn" provider="java:RPC">
                <requestFlow>
                  <handler type="soapmonitor"/>
                </requestFlow>
                <responseFlow>
                  <handler type="soapmonitor"/>
                </responseFlow>
              <parameter name="className" value="server.AxisReturn"/>
              <parameter name="allowedMethods" value="*"/>
          </service>
          </deployment>


          增加了
               <requestFlow>
                  <handler type="soapmonitor"/>
                </requestFlow>
                <responseFlow>
                  <handler type="soapmonitor"/>
                </responseFlow>
          這兩段

          然后我們通過點擊http://localhost:8080/axis/主頁上的SOAPMonitor或直接訪問http://localhost:8080/axis/SOAPMonitor,點擊start或stop啟動或停止監(jiān)控,然后我們運行客戶端程序,SOAPMonitor會監(jiān)控到請求和響應流,如下圖

          查看更多精彩圖片

          在 這里,我們需要注意一個配置問題,如果tomcat下有多個axis應用,設置了多個SOAPmonitor,我們則需要更改SOAPmonitor的端 口(axis默認配置的是5001),否則會產生沖突,運行SOAPmonitor時會無法啟動,提示the soap monitor is unable to communcate with the server,解決方法如下:

          打開C:\Tomcat5\webapps\axis\WEB-INF目錄下的web.xml,找到

          <servlet>
                <servlet-name>SOAPMonitorService</servlet-name>
                <display-name>SOAPMonitorService</display-name>
                <servlet-class>
                    org.apache.axis.monitor.SOAPMonitorService
                </servlet-class>
                <init-param>
                  <param-name>SOAPMonitorPort</param-name>
                  <param-value>5001</param-value>
                </init-param>
                <load-on-startup>100</load-on-startup>
          </servlet>

          這段,將其中的5001改成5002,依此類推

          總結:
          盡量將發(fā)布websrrvice的文件夾和axis分開放置
          建立多個axis應用時,應注意一些端口的設置,命令的參數(shù)設置以及一些命令執(zhí)行的路徑設置等,否則會產生一些錯誤,如ClassNotFound,service發(fā)布錯誤等的錯誤

           

          server-config.wsdd

          <?xml version="1.0" encoding="UTF-8"?>
          <deployment xmlns:java="      xmlns:handler="      xmlns="      xmlns:xsi="      name="defaultClientConfig" xsi:type="deployment">
               <globalConfiguration>
                   <parameter name="disablePrettyXML" value="true"/>
                   <parameter name="dotNetSoapEncFix" value="true"/>
                   <parameter name="enableNamespacePrefixOptimization" value="false"/>
                   <requestFlow>
                       <handler type="java:org.apache.axis.handlers.JWSHandler">
                           <parameter name="scope" value="session"/>
                       </handler>
                       <handler type="java:org.apache.axis.handlers.JWSHandler">
                           <parameter name="scope" value="request"/>
                           <parameter name="extension" value=".jwr"/>
                       </handler>
                   </requestFlow>
               </globalConfiguration>
               <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
               <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
               <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

              <service name="CallcenterWebServices" provider="java:RPC" style="rpc" use="encoded">
                   <parameter name="scope" value="Request"/>
                   <parameter name="className" value="com.isw2.ebay.callcenter.axis.CallcenterWebServices"/>
                   <parameter name="allowedMethods" value="getStatus,getCsrBean,setStatus,createCase,showContactRecord,getWorkload"/>
                   
              <beanMapping qname="myNS:CsrBean" xmlns:myNS="urn:CsrBean"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.CsrBean" />
             <beanMapping qname="myNS:ContactRecordBean" xmlns:myNS="urn:ContactRecordBean"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.ContactRecordBean" />  
             <beanMapping qname="myNS:DisputeContactRecord" xmlns:myNS="urn:DisputeContactRecord"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.DisputeContactRecord" />
             <beanMapping qname="myNS:WorkloadNumberBean" xmlns:myNS="urn:WorkloadNumberBean"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.WorkloadNumberBean" />  
            
               </service>
              
               <service name="AdminService" provider="java:MSG">
                   <parameter name="allowedMethods" value="AdminService"/>
                   <parameter name="enableRemoteAdmin" value="false"/>
                   <parameter name="className" value="org.apache.axis.utils.Admin"/>
                   <namespace>http://xml.apache.org/axis/wsdd/</namespace>
               </service>
               <service name="Version" provider="java:RPC">
                   <parameter name="allowedMethods" value="getVersion"/>
                   <parameter name="className" value="org.apache.axis.Version"/>
               </service>
               <transport name="http">
                   <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
                   <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
                   <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
                   <requestFlow>
                       <handler type="URLMapper"/>
                       <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
                   </requestFlow>
               </transport>
               <transport name="local">
                   <responseFlow>
                       <handler type="LocalResponder"/>
                   </responseFlow>
               </transport>
          </deployment>
          posted @ 2008-11-13 00:33 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(4974) | 評論 (0)編輯 收藏

          項目組反應數(shù)據(jù)庫有問題,
          檢查發(fā)現(xiàn)sga還用的默認參數(shù),緩沖區(qū)命中率很低。根據(jù)系統(tǒng)內存調整后,好像系統(tǒng)正常了。數(shù)據(jù)庫調整就算是結束了
          一天后,我再登這個數(shù)據(jù)庫的時候,發(fā)現(xiàn)一個提示說線程已經超過限制,不允許再登錄。然后我去修改了process到250,增加并發(fā)連接數(shù)。然后重啟了數(shù)據(jù)庫。當天沒發(fā)生什么事情,第二天,發(fā)現(xiàn)250又被撐滿了,這個時候,我就開始換衣中間件有問題,登入中間件那邊看了下日志,一直報錯,提示無法打開新的連接。一般來說,中間件連接數(shù)據(jù)庫能開10個都算可以了。至少websphere是這樣,weblogic應該差不多。然后修改了一下,調整了weblogic的連接池,修改最大連接到100.

          1、        報錯信息

          <2008-4-22 上午04時33分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '1' for queue: 'weblogic.kernel.Default' has been busy for "102" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          <2008-4-22 上午04時33分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '7' for queue: 'weblogic.kernel.Default' has been busy for "178" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          <2008-4-22 上午04時34分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '0' for queue: 'weblogic.kernel.Default' has been busy for "111" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          <2008-4-22 上午04時34分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '1' for queue: 'weblogic.kernel.Default' has been busy for "162" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          <2008-4-22 上午04時35分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '0' for queue: 'weblogic.kernel.Default' has been busy for "171" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          <2008-4-22 上午04時35分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '12' for queue: 'weblogic.kernel.Default' has been busy for "111" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          <2008-4-22 上午04時36分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
          hread: '12' for queue: 'weblogic.kernel.Default' has been busy for "171" seconds
          working on the request "Http Request: /guestAction.jsp", which is more than the
          configured time (StuckThreadMaxTime) of "60" seconds.>
          2、        判斷可能存在部分sql語句未優(yōu)化,造成執(zhí)行時間過長(request超時)造成掛死

          3、        解決
          開發(fā)模式和產品模式的一些參數(shù)的默認值不同,可能會對性能造成影響,下面是對性能有影響的參數(shù)列表:
          參數(shù)        開發(fā)模式默認值        產品模式默認值
          Execute Queue: Thread Count        15 threads        25 threads
          JDBC Connection Pool: MaxCapacity        15 connnections        25 connections
          通過啟動管理控制臺,在域(如:mydomain)> 配置 > 常規(guī)選擇產品模式。

          修改了server-myserver參數(shù)中的threadcount參數(shù),按照cpu數(shù)量,修改為100
          修改jdbc數(shù)據(jù)庫連接池,修改為初始15,最大100。

          晚間進行跟蹤,系統(tǒng)運行正常,高峰時段,尤其是早晨的高峰時段,系統(tǒng)沒有再出現(xiàn)掛死的問題。
          早晨點擊頁面查詢發(fā)現(xiàn)有時會出現(xiàn)頁面無法訪問的情況。
          跟蹤發(fā)現(xiàn)weblogic最高時有100多并發(fā),同時注意到內存占用比較高,檢查發(fā)現(xiàn),原來內存配置較低。

          檢查原配置文件:
          :bea
          if "%PRODUCTION_MODE%" == "true" goto
          bea_prod_mode
          set JAVA_VM=-jrockit
          set MEM_ARGS=-Xms96m -Xmx256m
          set
          JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
          goto
          continue
          :bea_prod_mode
          set JAVA_VM=-jrockit
          set MEM_ARGS=-Xms128m
          -Xmx256m
          goto continue


          :sun
          if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
          set
          JAVA_VM=-client
          set MEM_ARGS=-Xms32m -Xmx200m -XX:MaxPermSize=128m
          set
          JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
          goto
          continue
          :sun_prod_mode
          set JAVA_VM=-server
          set MEM_ARGS=-Xms32m
          -Xmx200m -XX:MaxPermSize=128m
          goto continue

          很明顯配置為96m,最高256m。修改后的參數(shù):
          修改后結果為
          :bea
          if "%PRODUCTION_MODE%" == "true" goto
          bea_prod_mode
          set JAVA_VM=-jrockit
          set MEM_ARGS=-Xms256m -Xmx768m
          set
          JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
          goto
          continue
          :bea_prod_mode
          set JAVA_VM=-jrockit
          set MEM_ARGS=-Xms256m
          -Xmx768m
          goto continue


          :sun
          if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
          set
          JAVA_VM=-client
          set MEM_ARGS=-Xms256m -Xmx768m -XX:MaxPermSize=128m
          set
          JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
          goto
          continue
          :sun_prod_mode
          set JAVA_VM=-server
          set MEM_ARGS=-Xms256m
          -Xmx768m -XX:MaxPermSize=128m
          goto continue

          :continue


          最低256,最高768.查看跟蹤信息比較調整前后性能:

          調整前內存


          調整后情況:


          現(xiàn)在垃圾回收不那么頻繁了,整體穩(wěn)定性應該有好處。再頻繁打開一個頁面的情況下,頁面仍然能正常顯示。
          posted @ 2008-09-04 13:30 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(3580) | 評論 (0)編輯 收藏

           

          前幾天用spring+hibernate+struts寫了個增/刪/改/查的例子。調試期間問題就來了,當查詢結果翻頁好幾次就沒N久沒有響應了。最后控制報錯。網(wǎng)上查了,它說數(shù)據(jù)庫連接(池)問題。

          出現(xiàn)錯誤如下:

          [2007-9-30 下午12時03分03秒 CST] [Error] [WebLogicServer] [BEA-000337] [ExecuteThread: '13' for queue: 'weblogic.kernel.Default' has been busy for "901" seconds working on the request "Http Request: /admin/school.do", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.]

          <轉為[,>轉為],才發(fā)得出以上面錯誤。可能是javaeye的bug。 

          先說下我配置

          1.環(huán)境:

          spring 2.0.6,hibernate 3.2.3,struts 1.2.9,oracle 10.2,weblogic 8.1.4

          jdbc是ojdbc14.jar

          2.連接池用DBCP

          xml 代碼
          1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
          2.     <property name="driverClassName" value="${jdbc.driverClassName}"/>  
          3.     <property name="url" value="${jdbc.url}"/>  
          4.     <property name="username" value="${jdbc.username}"/>  
          5.     <property name="password" value="${jdbc.password}"/>  
          6. bean>  

           3.分頁方法(參考springside的),此類繼承HibernateDaoSupport

          java 代碼
          1. public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {   
          2.     Criteria criteria = createCriteria(entityClass, criterions);   
          3.     CriteriaImpl impl = (CriteriaImpl) criteria;   
          4.   
          5.     // 先把Projection和OrderBy條件取出來,清空兩者來執(zhí)行Count操作   
          6.     Projection projection = impl.getProjection();   
          7.     //獲取總記錄數(shù)   
          8.     int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
          9.   
          10.        
          11.     if(totalCount < 1) {   
          12.         return new Page();   
          13.     }   
          14.        
          15.     //加排序   
          16.     if(orders != null) {   
          17.         for(int i=0; i
          18.             criteria.addOrder((Order) orders.get(i));   
          19.         }   
          20.     }   
          21.     //原來的投影   
          22.     criteria.setProjection(projection);   
          23.     int startIndex = Page.getStartOfPage(pageNo, pageSize);   
          24.     //取得結果   
          25.     List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
          26.        
          27.     return new Page(startIndex, totalCount, pageSize, list);   
          28. }   
          29.   
          30. public Criteria createCriteria(Class entityClass, List criterions) {   
          31.     Criteria criteria = getSession().createCriteria(entityClass);   
          32.     if(criterions != null) {   
          33.         for(int i=0; i
          34.             criteria.add((Criterion) criterions.get(i));   
          35.         }   
          36.     }   
          37.        
          38.     return criteria;   
          39. }  

          另外,沒有用OpenSessionInViewFilter,struts與spring的整合:DelegatingRequestProcessor、action path與bean name同名。

          翻頁不過10次,服務器就沒響應了,最后出現(xiàn)上面的錯誤的了。



          問題解決,問題的原因是數(shù)據(jù)庫連接耗盡,我用HiberanteDaoSupport的getSession()方法取得Session后沒有釋放Session。

          出問題的代碼處:

          java 代碼
          1. public Criteria createCriteria(Class entityClass, List criterions) {       
          2.     Criteria criteria = getSession().createCriteria(entityClass);       
          3.     if(criterions != null) {       
          4.         for(int i=0; i    
          5.             criteria.add((Criterion) criterions.get(i));       
          6.         }       
          7.     }       
          8.            
          9.     return criteria;       
          10. }  

           

          用完Session釋放后就沒事了,調用HiberanteDaoSupport的releaseSession(session);方法后即可解決。

          現(xiàn)在正確的代碼:

          java 代碼
          1. public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {   
          2.     Session session = getSession();   
          3.     //創(chuàng)建criteria   
          4.     Criteria criteria = session.createCriteria(entityClass);   
          5.     //為criteria添加criterions   
          6.     createCriteria(entityClass, criteria, criterions);   
          7.     CriteriaImpl impl = (CriteriaImpl) criteria;   
          8.   
          9.     // 先把Projection和OrderBy條件取出來,清空兩者來執(zhí)行Count操作   
          10.     Projection projection = impl.getProjection();   
          11.     //獲取總記錄數(shù)   
          12.     int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
          13.   
          14.        
          15.     if(totalCount < 1) {   
          16.         return new Page();   
          17.     }   
          18.        
          19.     //加排序   
          20.     if(orders != null) {   
          21.         for(int i=0; i<orders.size(); i++) {   
          22.             criteria.addOrder((Order) orders.get(i));   
          23.         }   
          24.     }   
          25.     //原來的投影   
          26.     criteria.setProjection(projection);   
          27.     int startIndex = Page.getStartOfPage(pageNo, pageSize);   
          28.     //取得結果   
          29.     List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
          30.     //釋放hiberante資源,一定要釋放,要不然就數(shù)據(jù)庫連接耗盡.   
          31.     releaseSession(session);   
          32.     return new Page(startIndex, totalCount, pageSize, list);   
          33. }   
          34.   
          35. public Criteria createCriteria(Class entityClass, Criteria criteria, List criterions) {   
          36.     if(criterions != null) {   
          37.         for(int i=0; i<criterions.size(); i++) {   
          38.             criteria.add((Criterion) criterions.get(i));   
          39.         }   
          40.     }   
          41.        
          42.     return criteria;   
          43. }  
          posted @ 2008-09-04 13:02 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(1066) | 評論 (0)編輯 收藏

          最近想對一個表進行分區(qū),在sybase版轉了半天,沒找著詳細介紹表分區(qū)有關的帖子. 終於找著一篇比較詳細的,故貼之:

          Sybase ASE表分區(qū)的使用

          表分區(qū)是目前各主流數(shù)據(jù)庫都提供的常用技術,各大數(shù)據(jù)庫基於不同的體系結構提供了各具特色的實現(xiàn),如果能合理使用這種技術,將為系統(tǒng)性能的提升帶來意想不到的效果,本文以Sybase ASE數(shù)據(jù)庫為例來說明這種技術的使用方法。


          在Sybase ASE中,未分區(qū)的不帶聚簇索引的表有一個雙向的數(shù)據(jù)庫頁鏈鏈接。在插入數(shù)據(jù)行時,將查找並鎖定頁鏈的最後一頁,如果最後一頁空間用盡,Sybase ASE將分配新的一頁,如果對表進行大量頻繁的數(shù)據(jù)插入,將引起對最後一頁鎖資源的競爭,如果一個事務(Transaction)正在使用最後一頁的排它鎖,那麼其他向同一張表插入數(shù)據(jù)的事務必須等待,直到該事務結束釋放資源,解除排它鎖。


          Sybase ASE從11.5開始提供新的特性表分區(qū)。表分區(qū)將產生附加的頁鏈,每個頁鏈有自己的最後一頁,這樣插入操作可以獲得多個最後一頁,實現(xiàn)並發(fā)操作,從而提高數(shù)據(jù)庫插入性能。若包含表的段分佈在多個物理設備上,表分區(qū)通過降低服務器從高速緩存向磁盤進行數(shù)據(jù)刷新的I/O衝突而提高數(shù)據(jù)插入性能。對頻繁地追加數(shù)據(jù)到表中或進行大塊數(shù)據(jù)的拷入、拷出操作,採用表分區(qū)技術,將能極大地提升系統(tǒng)性能。


          劃分表分區(qū)的操作步驟如下:


          1. 在同一數(shù)據(jù)庫設備上劃分表分區(qū)時,先創(chuàng)建表,再用alter table 的 partition 語句劃分表分區(qū)。


          create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... )


          alter table opt_plnexrcd partition 5


          2. 在多個數(shù)據(jù)庫設備上劃分表分區(qū)時,先建一個數(shù)據(jù)庫段在多個數(shù)據(jù)庫上,然後再將表建在該段上,最後對表分區(qū)。


          sp_addsegment seg1, oil, oil_data1


          sp_extendsement seg1, oil, oil_data2


          ...


          sp_extendsement seg1, oil, oil_data5


          create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... ) on seg1


          或建完表後執(zhí)行sp_placeobject:


          sp_placeobject seg1, opt_plnexrcd


          最後對表分區(qū):


          alter table opt_plnexrcd partition 5


          如果表分為5個分區(qū),表所在的段又分跨5個數(shù)據(jù)庫設備,那麼每個分區(qū)將分別映射到該段所在的5個數(shù)據(jù)庫設備上。一般劃分表分區(qū)的原則是:表分區(qū)數(shù)等於或大於表所在段分跨的數(shù)據(jù)庫設備數(shù)。但要注意有些表不能分區(qū),它們是系統(tǒng)表、正在使用的表、臨時表和有聚簇索引的表。


          Sybase ASE使用保存在分區(qū)控制頁上的統(tǒng)計數(shù)據(jù),來評測基於分區(qū)的並行掃瞄方式,以挑選最優(yōu)執(zhí)行計劃。如果表中數(shù)據(jù)在多個分區(qū)上是分佈均衡的,表分區(qū)統(tǒng)計數(shù)據(jù)是精確的,那麼掃瞄效率就比較高,並行處理就有很好的性能,所以表分區(qū)的維護對於並行查詢處理十分重要。Sybase ASE的異常停止和某些情況下的事務回退都可能造成分區(qū)統(tǒng)計數(shù)據(jù)不精確,Sybase ASE提供了兩個系統(tǒng)函數(shù)data_pgs和ptn_data_pgs,用它們可分別計算數(shù)據(jù)頁面數(shù)量。如果兩者不相同,說明分區(qū)統(tǒng)計不精確,需要維護,Sybase ASE 提供如下命令來更新分區(qū)和頁面統(tǒng)計數(shù)據(jù):


          1.更新每個分區(qū)的頁面統(tǒng)計數(shù)據(jù):


          update partition statistics


          2.更新表上索引的分佈頁面,同時更新各個表分區(qū)的控制頁面的統(tǒng)計數(shù)據(jù):


          update all statistics table_name


          3.顯示表分區(qū)的當前信息:


          sp_helpartition


          如果對分區(qū)的表進行了大量的插入、更新和刪除後,數(shù)據(jù)有可能分佈不均勻,使用BCP加載大量數(shù)據(jù)後,也可能會出現(xiàn)數(shù)據(jù)分佈不均勻,此外一些其他原因也可能導致數(shù)據(jù)分佈不均勻。平衡分區(qū)數(shù)據(jù)有兩種方法:一是對有數(shù)據(jù)的表建聚簇索引,二是使用並行塊拷貝,指定數(shù)據(jù)加載到某個分區(qū)的方法,Sybase ASE 新的BCP允許用戶指定分區(qū),把數(shù)據(jù)加載到指定的分區(qū)中。
          posted @ 2008-09-04 10:52 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(920) | 評論 (0)編輯 收藏

          為了使用戶的大量的數(shù)據(jù)在讀寫操作和查詢中速度更快,DM提供了對表和索引進行分區(qū)的技術,以改善超大規(guī)模應用的性能并方便數(shù)據(jù)管理。

            實現(xiàn)水平分區(qū)以后,可以達到以下目的:

            1. 增強可用性:如果表的某個分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;

            2. 維護方便:如果表的某個分區(qū)出現(xiàn)故障,需要修復數(shù)據(jù),只修復該分區(qū)即可;

            3. 均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個系統(tǒng)性能;

            4. 改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關心的分區(qū),提高檢索速度。

            DM數(shù)據(jù)庫提供對表的分區(qū)方法有兩種:

            1、范圍分區(qū):范圍分區(qū)就是對表中的某個值的范圍進行分區(qū),根據(jù)某個值的范圍,決定將該數(shù)據(jù)存儲在哪個分區(qū)上。

            2、HASH分區(qū):HASH分區(qū)是通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因為通過在I/O設備上進行散列分區(qū),使得這些分區(qū)大小一致。

            除了對表進行分區(qū),還可以對索引進行分區(qū)。DM支持下面三種類型的分區(qū)索引:

            1、本地索引:其分區(qū)方式與其所在基礎表的分區(qū)方式一模一樣的索引。本地索引的每個分區(qū)僅對應于其所在基礎表的一個分區(qū)。

            2、全局分區(qū)索引:使用不同于其所在表的分區(qū)鍵進行分區(qū)的索引,其所在表可以是分區(qū)表或非分區(qū)表。

            3、全局非分區(qū)索引:全局非分區(qū)索引基本上和非分區(qū)表的索引一樣。索引結構是不分區(qū)的。

            1.1 水平分區(qū)表的創(chuàng)建

            在介紹水平分區(qū)表的創(chuàng)建之前。先要了解分區(qū)鍵的概念。

            分區(qū)鍵:分區(qū)鍵是分區(qū)表的某一列,它決定了分區(qū)表中每一行數(shù)據(jù)劃分到哪個分區(qū)。該列的數(shù)據(jù)類型為DM常用數(shù)據(jù)類型,不支持BLOB、TEXT、ROWID、BIT、BINARY、VARBINARY、時間間隔等類型和用戶自定義類型。分區(qū)鍵不可以刪除或修改。

            范圍分區(qū)通過LEFT或RIGHT關鍵字來指定每個值是第一個分區(qū)的上邊界 (LEFT) 還是第二個分區(qū)的下邊界 (RIGHT)。邊界值不要求是遞增的序列,但是不能重復,邊界值不可以為NULL,支持使用常量表達式或返回常量值的函數(shù)來指定分區(qū)的邊界值。

            如:建立范圍分區(qū)表CREATE TABLE TAB1(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY RANGE (C1) LEFT FOR VALUES (1, 100, 10000);

            PARTITION NO1234

            VALUESVAL<=11

            建立HASH分區(qū)表CREATE TABLE TAB2(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY HASH(C1) PARTITIONS 3; TAB2以C1為分區(qū)鍵,且分區(qū)數(shù)為3。

            范圍區(qū)間或HASH分區(qū)數(shù)目不能超過64個。不同的分區(qū)可以指定到不同的文件組。。

            1.2 分區(qū)索引的創(chuàng)建

            本地索引、全局非分區(qū)索引、全局分區(qū)索引可以建立在范圍分區(qū)表或HASH分區(qū)表上,普通表上可以建立全局分區(qū)索引。

            如:CREATE TABLE T(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY RANGE(C1) LEFT FOR VALUES(1, 100);

            CREATE INDEX T_IND1 ON T (C2); -- 本地索引,系統(tǒng)將自動創(chuàng)建3個分區(qū)子索引,這些分區(qū)子索引按照C1進行分區(qū)。

            CREATE NOT PARTIAL INDEX T_IND2 ON T (C2); -- 全局非分區(qū)索引,索引不分區(qū)。

            CREATE INDEX T_IND3 ON T (C2) PARTITION BY RANGE(C2) LEFT FOR VALUES(5, 55); -- 全局分區(qū)索引,索引按照C2列分區(qū)

            1.3 水平分區(qū)表和分區(qū)索引的維護

            DM支持對范圍分區(qū)表和范圍分區(qū)表上的索引進行合并和拆分。HASH分區(qū)表和HASH分區(qū)表上的索引不支持合并和拆分,本地分區(qū)索引不允許合并和拆分。

            分區(qū)合并通過指定分區(qū)號將相鄰的兩個分區(qū)合并成一個分區(qū)。MERGE分區(qū)時,相鄰的兩個分區(qū)可以是相同的文件組,也可以是不同的文件組。

            分區(qū)拆分通過指定常量表達式值將某一個分區(qū)拆分成兩個分區(qū),指定的常量表達式值不能是原有的分區(qū)范圍值。SPLIT分區(qū)時,可以指定新的文件組,或者不指定文件組。

            1.4 水平分區(qū)的使用

            水平分區(qū)表、分區(qū)索引的使用和普通表、普通索引的使用一樣。用戶通過SQL語句建立范圍分區(qū)和HASH分區(qū)表,以及水平分區(qū)索引以后,普通的INSERT、DELETE、UPDATE、SELECT語句的使用不受任何影響。

            分區(qū)拆分或合并以后,普通的INSERT、DELETE、UPDATE、SELECT語句的使用不受任何影響。

          posted @ 2008-09-02 17:38 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(385) | 評論 (0)編輯 收藏

          一、前言:在經過一段時間的存儲過程開發(fā)之后,寫下了一些開發(fā)時候的小結和經驗與大家共享,希望對大家有益,主要是針對Sybase和SQL Server數(shù)據(jù)庫,但其它數(shù)據(jù)庫應該有一些共性。

          二、適合讀者對象:數(shù)據(jù)庫開發(fā)程序員,數(shù)據(jù)庫的數(shù)據(jù)量很多,涉及到對SP(存儲過程)的優(yōu)化的項目開發(fā)人員,對數(shù)據(jù)庫有濃厚興趣的人。

          三、介紹:在數(shù)據(jù)庫的開發(fā)過程中,經常會遇到復雜的業(yè)務邏輯和對數(shù)據(jù)庫的操作,這個時候就會用SP來封裝數(shù)據(jù)庫操作。如果項目的SP較多,書寫又沒有一定的規(guī)范,將會影響以后的系統(tǒng)維護困難和大SP邏輯的難以理解,另外如果數(shù)據(jù)庫的數(shù)據(jù)量大或者項目對SP的性能要求很,就會遇到優(yōu)化的問題,否則速度有可能很慢,經過親身經驗,一個經過優(yōu)化過的SP要比一個性能差的SP的效率甚至高幾百倍。

          四、內容

          1、開發(fā)人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現(xiàn)跨庫操作,最好不要直接使用“databse.dbo.table_name”,因為sp_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗。

          2、開發(fā)人員在提交SP前,必須已經使用set showplan on分析過查詢計劃,做過自身的查詢優(yōu)化檢查。

          3、高程序運行效率,優(yōu)化應用程序,在SP編寫過程中應該注意以下幾點:

          a)SQL的使用規(guī)范:

          i.盡量避免大事務操作,慎用holdlock子句,提高系統(tǒng)并發(fā)能力。

          ii.盡量避免反復訪問同一張或幾張表,尤其是數(shù)據(jù)量較大的表,可以考慮先根據(jù)條件提取數(shù)據(jù)到臨時表中,然后再做連接。

          iii.盡量避免使用游標,因為游標的效率較差,如果游標操作的數(shù)據(jù)超過1萬行,那么就應該改寫;如果使用了游標,就要盡量避免在游標循環(huán)中再進行表連接的操作。

          iv.注意where字句寫法,必須考慮語句順序,應該根據(jù)索引順序、范圍大小來確定條件子句的前后順序,盡可能的讓字段順序與索引順序相一致,范圍從大到小。

          v.不要在where子句中的“=”左邊進行函數(shù)、算術運算或其他表達式運算,否則系統(tǒng)將可能無法正確使用索引。 vi.盡量使用exists代替select count(1)來判斷是否存在記錄,count函數(shù)只有在統(tǒng)計表中所有行數(shù)時使用,而且count(1)比count(*)更有效率。

          vii.盡量使用“>=”,不要使用“>”。

          viii.注意一些or子句和union子句之間的替換

          ix.注意表之間連接的數(shù)據(jù)類型,避免不同類型數(shù)據(jù)之間的連接。

          x.注意存儲過程中參數(shù)和數(shù)據(jù)類型的關系。

          xi.注意insert、update操作的數(shù)據(jù)量,防止與其他應用沖突。如果數(shù)據(jù)量超過200個數(shù)據(jù)頁面(400k),那么系統(tǒng)將會進行鎖升級,頁級鎖會升級成表級鎖。

          b)索引的使用規(guī)范:

          i.索引的創(chuàng)建要與應用結合考慮,建議大的OLTP表不要超過6個索引。

          ii.盡可能的使用索引字段作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引

          iii.避免對大表查詢時進行table scan,必要時考慮新建索引。 iv.在使用索引字段作為條件時,如果該索引是聯(lián)合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統(tǒng)使用該索引,否則該索引將不會被使用。 v.要注意索引的維護,周期性重建索引,重新編譯存儲過程。

          c)tempdb的使用規(guī)范:

          i.盡量避免使用distinct、order by、group by、having、join、cumpute,因為這些語句會加重tempdb的負擔。

          ii.避免頻繁創(chuàng)建和刪除臨時表,減少系統(tǒng)表資源的消耗。

          iii.在新建臨時表時,如果一次性插入數(shù)據(jù)量很大,那么可以使用select into代替create table,避免log,提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,建議先create table,然后insert。

          iv.如果臨時表的數(shù)據(jù)量較大,需要建立索引,那么應該將創(chuàng)建臨時表和建立索引的過程放在單獨一個子存儲過程中,這樣才能保證系統(tǒng)能夠很好的使用到該臨時表的索引。

          v.如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先truncate table,然后drop table,這樣可以避免系統(tǒng)表的較長時間鎖定。

          vi.慎用大的臨時表與其他大表的連接查詢和修改,減低系統(tǒng)表負擔,因為這種操作會在一條語句中多次使用tempdb的系統(tǒng)表。

          d)合理的算法使用:

          根據(jù)上面已提到的SQL優(yōu)化技術和ASE Tuning手冊中的SQL優(yōu)化內容,結合實際應用,采用多種算法進行比較,以獲得消耗資源最少、效率最高的方法。

          具體可用ASE調優(yōu)命令:set statistics io on, set statistics time on , set showplan on 等。

          posted @ 2008-09-02 15:35 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(591) | 評論 (0)編輯 收藏

          1.1 性能指標
                  數(shù)據(jù)庫性能一般用兩個方面的指標來衡量:響應時間和吞吐量。響應越快,吞吐量越大,數(shù)據(jù)庫性能越好。響應時間和吞吐量有些情況下不能一起得到改善。

          1.2 調優(yōu)級別
          對Sybase數(shù)據(jù)庫性能調優(yōu),可以從四個方面進行:
          一)        操作系統(tǒng)級:對網(wǎng)絡性能、操作系統(tǒng)參數(shù)、硬件性能等作改進。
          二)        SQL Server級:調整存取方法,改善內存管理和鎖管理等。
          三)        數(shù)據(jù)庫設計級:採用降範式設計,合理設計索引,分佈存放數(shù)據(jù)等。
          四)        應用程序級:採用高效SQL語句,合理安排事務,應用游標,處理鎖。
          本文對第一、第三、第四方面的內容不做討論,第二方面提到的概念只適用於Sybase數(shù)據(jù)庫。

          1.3 調優(yōu)工具
                  在分析Sybase數(shù)據(jù)庫的性能時,要用到一些數(shù)據(jù)庫系統(tǒng)本身提供的性能調優(yōu)工具,包括幾個系統(tǒng)存儲過程:
          名稱        功能簡要介紹
          sp_sysmon        企業(yè)級系統(tǒng)性能報告工具
          sp_lock        查看鎖的情況
          sp_who        查看線程的活動情況
          sp_procqmode        存儲過程的查詢處理模式
          sp_configure        配置SQL Server系統(tǒng)級參數(shù)
          sp_estspace        估計創(chuàng)建一個表需要的空間和時間
          sp_spaceused        估計表的總行數(shù)及表和索引佔用的空間
          sp_monitor        監(jiān)視CPU、I/O的統(tǒng)計活動情況

          在利用isql等一些工具時,還可以設置查詢會話中的幾個選項,來顯示SQL語句執(zhí)行時的各種統(tǒng)計分析結果:
          指令        On 的含義
          set noexec on/off                        分析SQL語句後,還要執(zhí)行
          set statistics io on/off        統(tǒng)計SQL執(zhí)行所需I/O
          set statistics time on/off        統(tǒng)計SQL語句執(zhí)行耗時
          set showplan on/off                        顯示查詢計劃

          1.4 sp_sysmon 的使用
          企業(yè)級性能報告工具、系統(tǒng)存儲過程 sp_sysmon 的使用方法:
          在isql 下,首先輸入          sp_sysmon 'begin_sample'          啟動一個報告採樣過一段時間後,再輸入          sp_sysmon 'end_sample'                結束上次報告採樣
          或者緊跟一參數(shù)                        sp_sysmon 'end_sample', "dcache" 結束上次報告採樣, 但只顯示數(shù)據(jù)緩衝(Data Cache Management)這一部分的情況。
          能替換dcache的可選參數(shù)如下表所示:
          參數(shù)        參數(shù)全稱,內容範圍解釋
          Dcache        Data Cache Management,數(shù)據(jù)緩衝
          Kernel        Kernel Utilization,有關引擎、網(wǎng)絡和I/O等情況
          Wpm        Worker Process Management
          Parallel        Parallel Query Management
          Taskmgmt        Task Management
          Appmgmt        Application Management
          Esp        ESP Management
          Housekeeper        Housekeeper Task Activity
          Monaccess        Monitor Access to Executing SQL
          Xactsum        Transaction Profile
          Xactmgmt        Transaction Management
          Indexmgmt        Index Management,索引管理
          Mdcache        Metadata Cache Management
          Locks        Lock Management,鎖管理
          Pcache        Procedure Cache Management
          Memory        Memory Management
          Recovery        Recovery Management
          Diskio        Disk I/O Management,磁盤I/O管理
          Netio        Network I/O Management

          1.5
          用sp_sysmon可以得到數(shù)據(jù)庫系統(tǒng)的性能基準報告,但要在比較穩(wěn)定的狀態(tài)下產生,方可作為參考和對照的依據(jù)。

          1.6 理解存儲方法
          只有清楚數(shù)據(jù)庫存儲數(shù)據(jù)的底層細節(jié),如數(shù)據(jù)頁、索引頁的物理結構,每一行的大小計算,不同類型列佔用的寬度等等問題,才能對各種調優(yōu)措施有個深入領會。關於這個問題,比較複雜和細緻,請自行參閱有關書籍。
          一般地,對於更改數(shù)據(jù)的操作,要盡量促進數(shù)據(jù)庫進行直接更新( Direct Updates ),所以要遵守以下幾條原則:
          1)除非必要,避免使用允許null值的列和可變長度的列。
          2)如果varchar 和 varbinary 列填充得比較滿,毫不猶豫轉成 char 和 binary 列。對於建表時指定的頁填充率(page fillfactor)參數(shù),要權衡確定數(shù)值大小。一般:小值,適合於有許多隨機插入的表,該表的數(shù)據(jù)經常被刪除,又經常被增加;大值,適合於大多數(shù)的數(shù)據(jù)被增加到表末尾,如客票系統(tǒng)的售票存根和退票存根表。

          2 SQL Server級的調優(yōu)
          2.1 管理共享內存
                  數(shù)據(jù)庫性能優(yōu)化的首要方面是最優(yōu)管理內存。數(shù)據(jù)庫佔用的共享內存分成數(shù)據(jù)緩衝(data cache)、存儲過程緩衝(Procedure cache)等幾塊。在isql 下使用 sp_configure 'cache' 可以看到存儲過程緩衝所佔百分比(procedure cache percent),整個數(shù)據(jù)緩衝大?。╰otal data cache size) 等參數(shù)。

          2.1.1 存儲過程緩衝(Procedure cache)
          存儲過程緩衝保持以下對象的查詢計劃:
          Procedures                        :存儲過程
          Triggers                                :觸發(fā)器
          Views                        :視圖
          Rules                        :規(guī)則
          Defaults                                :缺省
          Cursors                                :游標
          存儲過程不可重入,意即每個並發(fā)用戶調用都會在內存中產生一個拷貝。
          Procedure, triggers, and views 當它們被裝載到procedure cache中時,被查詢優(yōu)化器優(yōu)化,建立查詢計劃。如果存儲過程在緩衝中,被調用時就不需要重新編譯。如果procedure cache太小,存儲過程就會經常被其他調入內存的存儲過程沖洗掉,當再次被調用時,存儲過程又被調入內存,再重新編譯,用戶請求因此不得不等待。最嚴重的情況,如果procedure cache不夠,存儲過程甚至都不能運行。所以在內存足夠的情況下,procedure cache percent 參數(shù)盡可能大一些。

          2.1.2 數(shù)據(jù)緩衝(Data Cache)
                  數(shù)據(jù)緩衝用來緩存數(shù)據(jù)頁和索引頁,是除去存儲過程緩衝,系統(tǒng)其他佔用的緩衝外的剩餘內存空間。通過給服務器增加物理內存擴大數(shù)據(jù)緩衝,是最有效的方法。當然,如果不能加內存,就只能通過減少存儲過程緩衝的比例等方法來擴大數(shù)據(jù)緩衝了。通過 sp_configure "extent I/O buffers", 20(可調) 命令,在Data Cache中保留一些頁專用於創(chuàng)建索引時使用,可以顯著提高創(chuàng)建索引的性能。但要注意每開闢一個緩衝佔用16K 字節(jié)的系統(tǒng)內存。

          2.1.3 命名緩衝
                  通過如下的命令:
          1>; sp_helpcache
          2>; go
          查看某客票數(shù)據(jù)庫中命名緩衝,得到的結果如下:
          Cache Name                Config Size     Run Size       Overhead

          ------------------------ -------------   ----------     ----------
          DS30_Tran_Log              20.00 Mb       20.00 Mb        2.05 Mb
          Systemtable                    20.00 Mb       20.00 Mb        2.05 Mb
          default data cache          0.00 Mb     4462.86 Mb      464.97 Mb
          left_base_center            16.00 Mb       16.00 Mb        1.57 Mb
          price_cache                     8.00 Mb        8.00 Mb        0.85 Mb
          可以看出有4個命名緩衝,分別綁定客票系統(tǒng)的應用日誌表、一些重要且常用的系統(tǒng)表、余票表、票價系列表,另外1個是缺省數(shù)據(jù)緩衝。這種配置還不是最合理,應該進一步把Systemtable這個命名緩衝細分成很多個,每一個單獨存放一張系統(tǒng)表。

          2.1.4 緩衝策略
          緩衝策略是指把數(shù)據(jù)提前讀入內存的機制,分預取策略(Prefetch rategy,即大I/O策略)和取後馬上丟棄策略(Fetch-and-Discard)、提示策(Hints)等幾種??梢栽谌齻€級別上設置表數(shù)據(jù)的預取策略(Prefetch Strategy,即大I/O策略)於:對像級,會話級,查詢級。如果三個級別上都有設置,它們發(fā)生作用的優(yōu)先順序是:對像級 >; 會話級 >; 查詢級。對於如何在查詢級利用指定的緩衝池,可以查看下面例子(使用4K緩衝池):
          select au_fname, au_lname
            from authers (prefetch 4)
          where au_id in ( A372020631, ..., A1887081515 )
          go
          DSS應用往往得益於大的I/O,應該放開large I/O strategy預取策略。
          如果一個應用傾向於OLTP特徵,用戶能在會話級關掉Prefetch來提高性能。對於OLTP應用,關閉large I/O strategy預取策略。對於所取到的頁不會有重用的情況,放開fetch-and-discard策略??推毕到y(tǒng)對存根數(shù)據(jù)進行統(tǒng)計的應用,如財收日結賬,營銷分析數(shù)據(jù)整理模塊和綜合查詢等,都可以利用這一結論。查看幾個操作頻繁且較大的表上的緩衝策略,用如下命令:
          sp_cachestrategy center,seat_area
          sp_cachestrategy center,sale_record0505

          2.2 管理鎖
          2.2.1 頁鎖升級閥限
          優(yōu)化鎖的重要考慮是設置頁級鎖升級升級成表級鎖的閥限。要盡量避免頁鎖很快升級成表級鎖。在某客票數(shù)據(jù)庫中,用sp_configure 『lock』可以看到如下結果:
          deadlock checking period           500           0        1000      1000
          number of locks                  5000       46875      200000  200000
          page lock promotion HWM      200           0       10000       10000
          page lock promotion LWM       200           0         200         200
          page lock promotion PCT         100           0          90          90
          可以看到頁鎖升級的閥限有三個:HWM(最高點) 為10000,LWM(最低點)為200,PCT為90。Sybase數(shù)據(jù)庫內部根據(jù)PCT值按公式PCT*TAB_SZ/100得出計算閥限,如果計算閥限 < LWM, 鎖升級發(fā)生在LWM值;如果計算閥限 < HWM,鎖升級發(fā)生在HWM值。如果 LWM < 計算閥限 < HWM ,鎖升級發(fā)生在PCT*TAB_SZ/100值。
          鎖升級閥限設置分對像級和服務器級兩種。
          針對對像級設置(數(shù)據(jù)庫上的表或表上的索引),配置命令是:
          sp_setpglockpromote {"database" | "table"}, objname, new_lwm,new_hwm, new_pct
          針對服務器級設置,配置命令是:
          sp_setpglockpromote server, NULL, new_lwm, new_hwm, new_pct。
          如果要刪除掉對像級上的頁鎖升級閥限,用:
          sp_dropglockpromote {"database" | "table"}, objname

          2.2.2 減少鎖爭奪的方法:
          1)降範式設計數(shù)據(jù)庫,創(chuàng)建冗余表。
          2)把堆表(沒有聚族索引的表)分區(qū)。
          3)對於小表,使用fillfactor和max_rows_per_page來減少行密度,從而使各行數(shù)據(jù)分佈到許多頁(此方法適用於SQL Server 11版,對於11.9.2版以後的Sybase數(shù)據(jù),有了行級鎖,此方法必要性不大)。

          2.3 管理臨時庫(tempdb)
          管理臨時庫一個重要原則是要避免臨時表跨多個設備,可以把tempdb從master設備中分離出來,放到一個單獨的設備上去。這樣可以減少存取系統(tǒng)表時對I/O資源的爭奪。用sp_dropsegment 存儲過程從master設備中移除tempdb的default段和system段。為了進一步提高tempdb的I/O速度,可以考慮把tempdb整個放在RAM 驅動器或固態(tài)存儲設備上,存取速度是一般磁盤的1000倍。一般情況下,tempdb會非常頻繁地爭奪和佔用缺省數(shù)據(jù)緩衝,因為查詢會話中有許多臨時表要創(chuàng)建、計算和刪除。所以推薦把tempdb綁定到它自己的命名緩衝,這樣可以防止臨時對像在內存中的活動沖洗掉缺省數(shù)據(jù)緩衝中的其他對象,利於在多個緩衝間展開I/O。在使用臨時表的時候,還有一個原則:盡量縮小表規(guī)模和行的寬度,每一行只包括必要的列。例如在用select * into生成臨時表時,如果只需要幾個列的數(shù)值,就不要用這樣的語句,而直接選取需要的列。

          2.4 使用多引擎(Multiple Network Engines)
          如果操作系統(tǒng)使用了多個CPU,那麼用sp_configure 配置數(shù)據(jù)庫的參數(shù):在線引擎數(shù)(max online engines),可以擴展系統(tǒng)的網(wǎng)絡I/O容量,分佈網(wǎng)絡I/O到各個引擎,從而提高性能,允許更多的用戶連接。
          在用戶登錄數(shù)據(jù)庫時,總是先登錄到引擎0,由引擎0在可用引擎隊列中選擇一個掛最少連接的引擎來傳遞socket描述符,從而重定向連接到那個引擎,由該引擎去處理跟此用戶連接相關的所有網(wǎng)絡活動。
          對於多引擎SMP結構,SQL Server引入了自旋鎖(spinlock)的一種數(shù)據(jù)結構,在多個引擎間共享。對於不同類型的任務,在哈希表上分配不同的自旋鎖,有頁鎖自旋鎖、表鎖自旋鎖和地址自旋鎖。
          自旋鎖的配置:
          sp_configure "page lock spinlock ratio", newval
          sp_configure "table lock spinlock ratio", newval
          sp_configure "address lock spinlock ratio", newval
          增大數(shù)值,可以減少碰撞,提高並發(fā)操作度。但是每一個自旋鎖結構要佔用256字節(jié)的內存。
          如果數(shù)據(jù)庫發(fā)生1279錯,可能原因:
          1)不允許足夠的鎖,解決辦法是用sp_configure 調大 number of locks 數(shù)值
          2)在engine freelock 緩衝中沒有足夠的鎖,解決辦法是用sp_configure調大 max engine freelocks 數(shù)值。
          如果數(shù)據(jù)庫系統(tǒng)使用了4個引擎,那麼每個引擎的自由鎖緩衝中包含:each engine-specific freelock cache 包含 5000 * .20 /4 = 250 個鎖。
          在平時,經常用sp_monitor和sp_sysmon監(jiān)視CPU使用率,如果所有CPU的利用率高於85%,增加CPU,然後增大數(shù)據(jù)庫的引擎數(shù),可以改善性能。

          2.5 設備使用的優(yōu)化
          把最常插入的表分區(qū),放在多個設備上,這樣可以創(chuàng)建多個頁鏈,從而改善多個並發(fā)插入時的性能,因為每一個插入都要找到頁鏈,頁鏈有多個,就允許多個插入同時進行。這一點,尤其適用於客票系統(tǒng)的存根表和訂票存根表(CG30_RRT),所帶來的性能改善會非常明顯。
          物理I/O的代價遠大於邏輯I/O,所以要盡量減少磁盤進行物理I/O的次數(shù),盡量多進行內存中的邏輯I/O。使用statistics io工具和sp_sysmon,來觀察磁盤I/O。可以配置使用大的I/O來減少物理I/O的次數(shù),方法有三個:
          1)用更多的磁盤;
          2)表和索引分開到不同的磁盤;
          3)增加一次I/O系統(tǒng)參數(shù)值的大小。
          SQL Server總是為I/O請求建立一個磁盤檢查的調度環(huán),用sp_configure "I/O polling process count"來提高數(shù)值,加長環(huán),可以降低引擎的檢查次數(shù),提高吞吐量。但較小的值一般有助於減少響應時間。
          對於可用的磁盤I/O控制塊,要查看操作系統(tǒng)文檔,用sp_configure "disk i/o structures"配置,這個數(shù)值要盡可能高。
          分離日誌和數(shù)據(jù),到不同的設備;給tempdb自己的設備;分離表和索引到不同的設備。這些方法都可以減少I/O。

          2.6 對事務處理的調優(yōu)
          2.6.1 事務類型
          事務處理無外乎三種:1,OLTP; 2, DSS; 3, OLTP + DSS 的混合負載
          OLTP(聯(lián)機事務處理)的特點:
          ?        數(shù)據(jù)插入、修改和刪除頻繁。
          ?        經常操作的是單個記錄。
          ?        當不適當設計時,傾向於碰撞和衝突。
          DSS(決策支持系統(tǒng))的特點:
          ?        數(shù)據(jù)修改不太頻繁。
          ?        如果有插入和刪除,是大批量的。
          ?        平時一般是只讀操作。
          ?        表連接很常見。
          ?        有比較特別的查詢。
          OLTP + DSS 混合負載的特點權衡:
          ?        在性能方面要比較,是要吞吐量還是響應時間。
          ?        在鎖方面要比較,是要並發(fā)性強呢還是要數(shù)據(jù)一致性強。

          2.6.2 事務管理原則
          一般的事務管理原則有:
          1)        分解大的事務成多個小的事務。如客票數(shù)據(jù)的備份操作中,要刪除過期數(shù)據(jù),如果設計小事務做循環(huán),便不會影響應用,完全可以做到任何時候備份和刪除,不一定非得等服務器閒的時候做。
          2)        避免在單個事務中更新或刪除大量的數(shù)據(jù)行。比如客票系統(tǒng)的席位庫數(shù)據(jù)清理,即使在服務器閒的時候做這種操作,也會鎖定整個表,影響售票。
          3)        盡量用可以接受的最低孤立級(isolation level),來提高並發(fā)度。如在余票查詢等功能的應用中,使用這種孤立級,便可以最大程度地降低對售票的影響。
          4)        提高事務吞吐量的措施包括:避免延遲更新;盡可能使用存儲過程等等。

          2.6.3 跟事務特徵相關的數(shù)據(jù)庫可調參數(shù)或特性
          相對於OLTP應用,SQL Server有一些特性來滿足要求。
          1)        命名緩衝(Named cache)
          對於命名緩衝,可以配置多個不同大小的內存池,來滿足不同的應用需求。對於多個引擎的情況,命名緩衝還有一項重要的功能是降低自旋鎖的內部爭奪。
          2)        日誌I/O緩衝大小可配置
          sp_logiosize ["default" | "size" | "all" ]
          缺省值是4K,但如果4K內存池沒有配置,SQL Server會使用2K大小的內存池
          3)        堆表可分區(qū),分佈插入操作到各個設備
          適用於頻繁插入的表和有並發(fā)BCP倒入數(shù)據(jù)的表,如客票系統(tǒng)的售票存根和退票存根表。
          4)        鎖升級閥限可配置。

          相對於DSS應用,SQL Server也有一些特性來滿足要求
          1)        應用大的 I/O 緩衝池
          用sp_poolconfig來配置。
          2)        綁定熱表到命名緩衝
          如 sysindexes, syslogs, 注意如果把 syslogs 放到單獨的緩衝中,可以減少在缺省或其他命名緩衝上的自旋鎖爭奪。對於客票系統(tǒng)的train_dir, stop_time, 票價表, 取票存儲過程相關的表都可以放在單獨的命名緩衝上。
          3)        取後丟棄緩衝策略 (Fetch-and-discard cache strategy)
          不會沖洗掉緩衝中的常用對象,可以減少MRU鏈的爭奪,較少對OLTP事務的干擾。
          對於收入統(tǒng)計應用,統(tǒng)計過往存根表中的數(shù)據(jù),可以應用這一策略。

          2.7 網(wǎng)絡方面的調優(yōu)
          Sybase客戶和服務器之建傳遞的是TDS包,缺省大小是512字節(jié)。對於要傳輸大批量數(shù)據(jù)的應用,如BCP、 文本/圖像的取用、大結果集SQL語句,要用下面的配置命令配置大的TDS包大小。
          sp_configure "default network packet size", nnn
          sp_configure "maximum network packet size", nnn
                  對於isql 和bcp,可以在應用級指定TDS包的大?。篿sql -Usa -P –Annn,bcp -Usa -P –Annn。
          注意在調大maximum network packet size的參數(shù)後,要增大 additional network memory 參數(shù),來適應 maximum network packet size 的要求。
          posted @ 2008-09-02 15:29 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(1440) | 評論 (0)編輯 收藏

          最初發(fā)現(xiàn)遇到“IE7下拉框顯示不全”這個問題時,一直以為是由于IE7的瀏覽器的兼容問題,并未找到這個問題的解決方案。但是開發(fā)應用系統(tǒng)過程中,不少用戶都反應使用IE7瀏覽器時,出現(xiàn)下拉框顯示不完整的情況。隨著IE7不斷的普及,會有更多的用戶遇到同樣的問題,所以這個問題必須解決,問題是怎么解決,問題出在哪里?
          查找了幾天,查看jsp是否哪里寫錯了,但是并未找到結果。后來安裝了IE7瀏覽器后,在本地重現(xiàn)了一下,部分下拉框還是出現(xiàn)缺失的現(xiàn)象,我突然發(fā)現(xiàn)有的頁面下拉框是完整的,而有的頁面是缺失的,難道頁面有什么區(qū)別?我仔細比較了一下完整顯示下拉框和缺失顯示下拉框的頁面,發(fā)現(xiàn)它們的區(qū)別在于頁面聲明的部分"<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">",難道是IE7不支持該標簽,或者說該標簽在IE7瀏覽器已經過時了?我刪除該標簽后,驗證了一下,確實問題是出在這里。

          在網(wǎng)上收集整理了一些IE6和IE7關于CSS兼容表現(xiàn)的資料
          JSP的DOCTYPE聲明說明:
          html
          PUBLIC
          "-// W3C// DTD
          HTML 4.01 Transitional// EN" "http://www.w3.org/TR/html4/loose.dtd">
          (1) (2) (3) (4) (5) (6) (7) (8)

          [Top Element] [Availability] "[Registration]// [Organization]// [Type] [Label]// [Language]" "[URL]">
          (1) (2) (3) (4) (5) (6) (7) (8)

          (1) Top Element: DTD中聲明的最頂層元素,例如html。
          (2) Availability: 指示標識符是公共標識符號(PUBLIC)還是系統(tǒng)資源(SYSTEM),例如本地文件、url等。
          (3) Registration: 指示組織是否注冊為ISO成員,+表示已經注冊為ISO成員,-表示沒有注冊。W3C沒有注冊,所以使用-。
          (4) organization: 對于HTML、XHTML而言指維護DTD的組織標識符,W3C。
          (5) Type: Public Text Class,引用對象的類型,對于HTML、XHTML而言為DTD。
          (6) Label: Public Text Description,引用內容的唯一名稱描述,Label里面可以包含一個版本號(4.01),可以包含一個Defintion(有三種Definition: Frameset, Strict, Transitional,下面會描述)。
          (7) Language: 語言代碼。
          (8) URL: 引用DTD的url。
          各個瀏覽器對HTML、CSS的處理,在細節(jié)上存在很多差異,為了向W3C標準靠近,并且HTML、CSS的標準也在不斷的發(fā)展,因此同一個瀏覽器的不同版本之間,也會存在細節(jié)處理上的不一致性。現(xiàn)在瀏覽器使用DOCTYPE聲明來決定該使用那種模式處理HTML、CSS,通常提到的有standards mode(標準模式,strict Mode)和quirks mode(兼容模式compliant mode)。標準模式指瀏覽器采用盡量靠近目前W3C規(guī)范的方式,支持目前版本的HTML、XHTML、CSS規(guī)范;兼容模式指瀏覽器按照以前的老版本的方式處理,以兼容那些舊版本的web應用。另外需要注意的是,雖然目前主要的瀏覽器都支持這兩種模式,但都有差別,例如Firefox除了上面兩種模式外,還有一個almost standards mode。
          下面是HTML 4.01的DTD,分別為Strict, Transitional, Frameset

          IE 6 CSS增強、IE 7 CSS兼容性
          References: Cascading Style Sheet Compatibility in Internet Explorer 7、 CSS Enhancements in Internet Explorer 6
          Label中的Definition三種類型:Frameset,支持FRAMESET文檔;Transitional,支持除了FRAMESET以外其它所有元素;Strict,不支持W3C準備淘汰的元素、屬性。這種描述有點讓人糊涂,也無法跟標準standards mode、quirks mode對應上,至于具體的定義可以參考W3C標準。

          下面這個表格是比較有用的:
          Label Definition URL present URL not present
          No !DOCTYPE present Off Off
          HTML (No Version Present) Off Off
          HTML 2.0 Off Off
          HTML 3.0 Off Off
          HTML 3.2 Off Off
          HTML 4.0 No Definition Present On On
          HTML 4.0 Frameset On Off
          HTML 4.0 Transitional On Off
          HTML 4.0 Strict On On
          XHTML On On
          XML On On
          Unrecognized !DOCTYPE On On


          其中On表示使用strict mode(standards mode),Off表示使用compliant mode(quirks mode)。URL present/URL not present表示DTD文檔的url是否有在DOCTYPE中聲明;Definition為空或者No Definition Present表示Definition沒有定義。從IE 6開始支持這兩種模式的切換,在strict mode下,IE盡量保持與W3C標準一致,而compliant mode下,IE將保持與以前的IE版本兼容。用這個表格,對照1中幾種DOCTYPE可以知道,只有在strict mode下,IE 7才支持filter:progid:DXImageTransform.Microsoft.Alpha這個濾鏡。讓人奇怪的是,也只有在strict mode下,IE 7才支持filter: alpha(opacity=60),compliant mode下是不支持的,而這個寫法是針對IE 5.5之前版本的。
          在strict mode下面,兩個比較重要的差異點:
          a) Box的height、width計算問題



          CSS標準中,width、height指圖中Content的寬度、高度,而IE在計算寬度、高度時,將包括padding、border
          posted @ 2008-08-23 11:15 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(2761) | 評論 (0)編輯 收藏

          文章描述了通過sp_sysmon對Adaptive Server系統(tǒng)運行情況有一個全面系統(tǒng)了解,有利于更好地熟悉系統(tǒng)性能,更為有效地進行系統(tǒng)管理,合理地利用和配置系統(tǒng)資源,達到系統(tǒng)性能調優(yōu)的目的。
          從18個方面了解在用系統(tǒng)性能狀況,并在適當?shù)臅r候利用環(huán)境參數(shù)進行性能調優(yōu):

          1、內核管理(kernal)
          2、應用管理(appmgmt)
          3、數(shù)據(jù)緩存管理(dcache)
          4、ESP管理(esp)
          5、索引管理(indexmgmt)
          6、鎖管理(locks)
          7、內存管理(memory)
          8、元數(shù)據(jù)高速緩存管理(mdcache)
          9、任務管理(taskmgmt)
          10、監(jiān)視器訪問SQL的執(zhí)行(monaccess)
          11、網(wǎng)絡I/O管理(netio)
          12、并行查詢管理(parallel)
          13、過程緩存管理(pcache)
          14、恢復管理(recovery)
          15、事務管理(xactmgmt)
          16、事務概要(xactsum)
          17、磁盤I/O管理(diskio)
          18、工作進程管理(wpm)

          括號后英文短詞是該模塊參數(shù)。
          步驟:執(zhí)行sp_sysmon “00:10:00”(server級系統(tǒng)存貯過程,不需要打開某個數(shù)據(jù)庫),或者執(zhí)行如下格式的過程,查看具體操作批命令對應系統(tǒng)性能情況:(10分鐘系統(tǒng)查看)
          sp_sysmon begin_sample
          SQL語句或者存貯過程
          sp_sysmon commit_sample
          本實驗采用 sp_sysmon “hh:mm:ss”,性能模塊名。
          可了解當前系統(tǒng)在各方面的系統(tǒng)運行狀況,性能出現(xiàn)什么問題和不平衡不協(xié)調之處,學會使用相應的參數(shù)和措施進行解決和調優(yōu),不斷比較對照調整前后的性能狀況,最終改善系統(tǒng)性能。
          說明:1、該命令執(zhí)行結果集的開頭相同如下:


          ======================================================================
          Sybase Adaptive Server Enterprise System Performance Report
          ======================================================================
          Server Version: Adaptive Server Enterprise/11.9.2/1031/P/NT (IX86)/OS 3.
          Server Name: Server is Unnamed
          Run Date: May 28, 2001
          Statistics Cleared at: 15:57:27
          Statistics Sampled at: 16:07:28
          Sample Interval: 00:10:00


          2、執(zhí)行結果集的每列信息提示:

          per sec : 采樣期間每秒的平均值
          per xact: 采樣期間每提交一個事務的平均值
          count : 采樣期間每秒的總計值
          % of total: 占總數(shù)的百分比,根據(jù)不同情況各有不同

          3、結果集對應給出性能情況描述、分析以及可調性說明
          4、只給出部分模塊的監(jiān)視結果(可能有刪節(jié)),用sp_sysmon “hh:mm:ss”可看全部詳細情況。
          單元一:監(jiān)視內核利用情況
          命令行:sp_sysmon “00:10:00”,kernal
          結果:

          Kernel Utilization (內核利用)

          ------------------
          Engine Busy Utilization
          Engine 0 1.8 %
          引擎繁忙程度應在80%-90%之間,如果長期在90%以上,應考慮增加引擎數(shù)來改善性能。因為此時內部管理進程無法向磁盤寫入,則檢查點需要將許多頁寫回磁盤,而檢查點進程很可能將CPU的利用率提高到100%,導致響應時間明顯增加。
          CPU Yields by Engine per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Engine 0 6.6 0.6 3949 100.0 %
          引擎放棄CPU次數(shù):% of total=1個引擎放棄次數(shù)/所有引擎放棄次數(shù),如果顯示引擎利用率較低,可通過放棄數(shù)判斷是否真實反映引擎的停止情況。增加“runnable process search count”(引擎放棄CPU給OS之前一個引擎循環(huán)查找可執(zhí)行任務的次數(shù))參數(shù)可增加CPU的駐留時間,而如果想減少引擎在空閑時檢查I/O的時間,可減少該參數(shù)的值。
          Network Checks
          Total Network I/O Checks 0.0 0.0 0 n/a
          引擎發(fā)送或接收網(wǎng)絡包的次數(shù)。引擎空閑時頻繁檢查網(wǎng)絡包,如果該值很低而“CPU Yields by Engine”的值高,表明引擎可能被頻繁放棄。
          可能包括阻塞和非阻塞兩種檢查方式。非阻塞方式不管有無I/O等待都對網(wǎng)絡進行I/O檢查。如果引擎已被放棄并正執(zhí)行阻塞網(wǎng)絡檢查,則在網(wǎng)絡包到達以后仍保持一段睡眠時間(潛伏期)。此時增加“runnable process search count”(缺省2000)參數(shù)可減少潛伏期,保持引擎有較長的循環(huán)檢查時間,而不是過早被放棄。
          Disk I/O Checks磁盤I/O檢查情況:
          Total Disk I/O Checks 693.2 58.8 415939 n/a
          Checks Returning I/O 469.9 39.9 281921 67.8 %
          引擎對I/O情況的有效檢查(I/O完成次數(shù)),如過高或過低,用“i/o polling process count”(Server的調度程序在檢查磁盤I/O或網(wǎng)絡I/O之前可執(zhí)行的最大進程數(shù))參數(shù)增加或減少檢查頻率。通常說增加該值可增加有大量磁盤或網(wǎng)絡I/O的應用的吞吐量,反之,減少該值有可改善其響應時間。
          Avg Disk I/Os Returned n/a n/a 0.03020 n/a


          增加引擎在檢查期間的等待時間可改善吞吐量,因為減少引擎檢查I/O時間相應增加執(zhí)行進程的時間。

          單元二:監(jiān)視并行查詢管理
          命令行:sp_sysmon “00:10:00”,parallel
          結果: 報告并行查詢次數(shù)、執(zhí)行期間調整了多少工作進程,以及在merge和sort操作時加鎖情況。

          Parallel Query Management
          -------------------------
          Parallel Query Usage per sec per xact count % of total
          ------------------------- --------- --------- ------- ----------
          Total Parallel Queries 0.1 8.0 16 n/a
          優(yōu)化器自動確定是否并行操作,以及為此使用多少工作進程。
          WP Adjustments Made
          Due to WP Limit 0.0 0.0 0 0.0 %
          會話級的限制受“set parallel_degree” or “set scan_parallel_degree”參數(shù)控制。
          Due to No WPs 0.0 0.0 0 0.0 %
          缺乏可用的工作進程導致申請工作進程數(shù)減少。可適當增加“number of worker processes”
          Merge Lock Requests per sec per xact count % of total
          報告并行merge操作的鎖請求數(shù),很快授予鎖的數(shù)目,下面3種類型鎖的等待情況:
          ------------------------- --------- --------- ------- ----------
          Network Buffer Merge Locks
          Granted with no wait 4.9 438.5 877 56.2 %
          Granted after wait 3.7 334.5 669 42.9 %
          Result Buffer Merge Locks
          Granted with no wait 0.0 0.0 0 0.0 %
          Granted after wait 0.0 0.0 0 0.0 %
          Work Table Merge Locks
          Granted with no wait 0.1 7.0 14 0.9 %
          Granted after wait 0.0 0.0 0 0.0 %
          ------------------------- --------- --------- -------
          Total # of Requests 8.7 780.0 1560
          Sort Buffer Waits per sec per xact count % of total
          ------------------------- --------- --------- ------- ----------
          Total # of Waits 0.00.0 0 n/a
          并行排序所用“排序緩沖區(qū)等待”鎖。如果等待數(shù)較高,可考慮加大“number of sort buffers”的值。
          ======================================================================

          單元三:監(jiān)視執(zhí)行SQL的訪問情況
          命令行:sp_sysmon “00:10:00”,monaccess
          結果:

          Monitor Access to Executing SQL(監(jiān)視執(zhí)行SQL的訪問情況)

          -------------------------------
          per sec per xact count % of total
          ------------ ------------ ---------- ----------
          Waits on Execution Plans 0.0 0.00 n/a
          每個試圖使用sp_showplan但必須等待獲得訪問查詢計劃的讀資格,報告等待次數(shù)。
          Number of SQL Text Overflows 0.0 0.0 0 n/a
          SQL批文本超過文本緩沖區(qū)大小的溢出次數(shù)。
          Maximum SQL Text Requested n/a n/a 0 n/a
          (since beginning of sample)
          “max SQL text monitored”(缺省為0)參數(shù)指定分配給每個連接用戶的內存量,用以保存SQL文本到內存,供sever監(jiān)視器共享。推薦值為1024。
          ======================================================================
          單元四:事務概要
          命令行:sp_sysmon “00:10:00”,xactsum
          結果:

          Transaction Profile(事務概要)

          報告提交的事務數(shù),要盡量減少多數(shù)據(jù)庫事務的提交(一個事務對多數(shù)據(jù)庫的訪問)
          Transaction Summary per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Committed Xacts 11.8 n/a 7073 n/a
          Transaction Detailper sec per xactcount% of total
          ------------------------- ------------ ------------ ---------- ----------
          Inserts
          APL Heap Table 13.6 1.2 8189 100.0 %
          如果大量堆表數(shù)據(jù)插入,結合查看鎖的堆表最后一頁鎖情況,是否引起嚴重的鎖爭奪,隨之調整相應的數(shù)據(jù)表,避免因為鎖資源爭奪引起性能降低。
          APL Clustered Table 0.0 0.0 0 0.0 %
          對全頁鎖的表插入數(shù)據(jù)行,注意可能引起的頁分裂。
          Data Only Lock Table 0.0 0.0 0 0.0 %
          ------------------------- ------------ ------------ ---------- ----------
          Total Rows Inserted 13.6 1.2 8189 100.0 %

          單元五:事務管理
          命令行:sp_sysmon “00:10:00”,xactmgmt
          結果:

          Transaction Management(事務管理)

          ----------------------
            用戶日志cache(每個用戶對應一個)降低了寫入事務日志的次數(shù),如果是多處理器系統(tǒng)還減少了事務日志當前頁的爭奪,因而提高了性能??膳渲铆h(huán)境參數(shù)“user log cache size”(缺省最低2048字節(jié)),太小導致用戶日志常滿并頻繁寫入事務日志,太大則每個連接用戶都擴大,又造成內存浪費。原則是配置不超過事務完成寫入事務日志的長度。
          ULC Flushes to Xact Log per sec per xact count % of total
          各種類型導致寫入事務日志的次數(shù)
          ------------------------- ------------ ------------ ---------- ----------
          by Full ULC 0.0 0.0 0 0.0 %
          如果% of total的值超過20%,考慮增加環(huán)境參數(shù)“user log cache size”的值。
          by End Transaction 11.8 1.0 7095 95.5 %
          以顯式或隱式的rollback或commit標志事務結束。值大表示有很多短小事務。
          by Change of Database 0.0 0.0 12 0.2 %
          如果值大,考慮減低ULC中大于2K的緩沖池,降低或去除大塊I/O池。
          by System Log Record 0.5 0.0 321 4.3 %
          其% of total值大于20%并且ULC長度大于2048,考慮降低ULC的長度。
          by Other 0.0 0.0 0 0.0 %
          ------------------------- ------------ ------------ ----------


          Total ULC Flushes 12.4 1.1 7428

          單元六:索引管理
          命令行:sp_sysmon “00:10:00”,indexmgmt
          結果:

          Index Management(索引管理)
          索引可以加速數(shù)據(jù)檢索,但同時又降低了更新的性能。

          ----------------
          Nonclustered Maintenance per sec per xact count % of total
          非聚簇索引維護情況:報告因為插入、刪除、修改、頁分裂等造成的索引維護次數(shù)。
          ------------------------- ------------ ------------ ---------- ----------
          Ins/Upd Requiring Maint 0.0 0.0 0 n/a
          影響索引的插入和修改的操作數(shù),需要維護非聚簇索引。對于插入,有多少非聚簇索引,就需要增加多少索引維護的開銷;對于修改,則只對相關的索引進行維護。
          # of NC Ndx Maint 0.0 0.0 0 n/a
          因為插入和修改需要對多少非聚簇索引進行維護。
          Deletes Requiring Maint 0.0 0.0 0 n/a
          # of NC Ndx Maint 0.0 0.0 0 n/a
          影響索引的刪除操作次數(shù),以及需要維護的非聚簇索引數(shù)。
          RID Upd from Clust Split 0.0 0.0 0 n/a
          在APL(全頁鎖)的聚簇索引表發(fā)生頁分裂次數(shù),相應需要進行索引維護。
          # of NC Ndx Maint 0.0 0.0 0 n/a
          頁分裂后對應的索引維護次數(shù)。
          Upd/Del DOL Req Maint0.0 0.0 0 n/a
          DOL表發(fā)生影響索引的修改刪除操作次數(shù)。
          # of DOL Ndx Maint 0.0 0.0 0 n/a
          對應索引維護次數(shù)。
          Page Splits 0.0 0.0 0 n/a
          包括數(shù)據(jù)頁、聚簇索引頁和非聚簇索引頁因為插入新行沒有足夠空間單元導致頁分裂。頁分裂造成修改索引頁、修改頁指針、增加鎖資源爭奪等從而降低性能。
          如果頁分裂度高(次數(shù)多),而又是對全頁加鎖表進行插入操作,并且表有組合鍵的聚簇索引,這時可通過改變那些索引的頁分裂點來減少頁分裂,即是說組合鍵的第一個鍵表中在用,第二個鍵列值按升序排列;也可考慮用fillfactor的合適配置來降低在聚簇索引的APL表的數(shù)據(jù)頁以及非聚簇索引的葉子數(shù)據(jù)頁上的頁分裂。
          建議對表插入行按照升序插入方式,這樣發(fā)生頁分裂點也是在插入行點而不是在頁中間,這樣能夠提高性能。通過dbcc tune (ascinserts, 1, "表名")設置插入方式,0反之。
          如果索引維護量大,會因為維護需要額外的進程、額外的I/O、額外的索引頁鎖從而影響性能??梢酝ㄟ^對比不同操作次數(shù)與導致的維護次數(shù),如果維護次數(shù)很多,還發(fā)生頁分裂、retries等現(xiàn)象,嚴重時可考慮不用索引。
          單元七:鎖管理
          命令行:sp_sysmon “00:10:00”,locks
          結果:

          Lock Management(鎖管理)
          報告鎖、死鎖、鎖提升和鎖爭奪的情況

          ---------------
          Lock Summary(鎖概述) per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Total Lock Requests 26.1 2.2 15676 n/a
          總共的鎖請求
          Avg Lock Contention 0.0 0.0 0 0.0 %
          平均鎖爭奪
          Deadlock Percentage 0.0 0.0 0 0.0 %
          死鎖出現(xiàn)的比例
          Lock Hashtable Lookups 26.1 2.2 15677 n/a
          對hash表的表、頁、行鎖的查詢次數(shù)。
          Avg Hash Chain Length n/a n/a 0.00038 n/a
          Hash鏈平均長度:采樣期間每個hash桶的平均加鎖數(shù)目。如果每個hash鏈超過4個鎖,可用參數(shù)“lock hashtable size”調整擴大加鎖hash表的大小,尤其是大型bcp可配置更大。
          Lock Detail per sec per xactcount % of total
          ------------------------- ------------ ------------ ---------- ----------
          對于各種類型的鎖細節(jié),重點查看其立即授予和等待情況。
          Last Page Locks on Heaps 堆表最后頁鎖
          Granted 13.6 1.2 8189 100.0 %
          Waited 0.0 0.0 0 0.0 %
          ------------------------- ------------ ------------ ---------- ----------
          Total Last Pg Locks 13.6 1.2 8189 100.0 %
          如果堆表最后一頁鎖的爭奪激烈(尤其是熱對象的等待時間過長),考慮建立聚簇索引,或者表分區(qū)來解決鎖資源爭奪問題。
          Deadlocks by Lock Type per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Total Deadlocks 0.0 0.00 n/a
          死鎖出現(xiàn)次數(shù)。當很多事務同時訪問同一個數(shù)據(jù)庫時,會加劇鎖資源爭奪,嚴重時事務之間會發(fā)生死鎖??捎胹p_object_stats查明死鎖位置。該過程報告資源爭奪最激烈的10張表、一個數(shù)據(jù)庫中資源爭奪的表和單個表的爭奪情況。語法為sp_object_stats interval [, top_n
          [, dbname [, objname [, rpt_option ]]]],查看鎖爭奪情況只需設置interval為“hh:mm:ss”。如果顯示每種鎖的爭奪程度超過15%,應該改變加鎖方式,比如表的全頁鎖改成數(shù)據(jù)頁鎖,數(shù)據(jù)頁鎖改成數(shù)據(jù)行鎖等。
          Deadlock Detection 死鎖檢測
          Deadlock Searches 0.0 0.0 0 n/a
          死鎖檢測次數(shù)。死鎖檢測將特花費時間,如果檢測次數(shù)過多,用參數(shù)“deadlock checking period”(缺省500ms)調節(jié)死鎖檢測周期。
          Lock Promotions 鎖提升
          Total Lock Promotions 0.0 0.0 0 n/a
          鎖提升指排它頁鎖到排它表鎖、共享頁鎖到共享表鎖、排它行鎖到排它表鎖、共享行鎖到共享表鎖、共享next_key鎖到共享表鎖。查看鎖提升是否加劇了鎖爭奪或死鎖發(fā)生,如果鎖爭奪激烈并且鎖提升頻繁,考慮調整鎖的隔離級別,對全頁鎖表,需要2級也可強制為3級。
          Lock Timeouts by Lock Type per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Total Timeouts 0.0 0.0 0 n/a

          單元八:數(shù)據(jù)cache管理
          命令行:sp_sysmon “00:10:00”,dcache
          結果:

          Data Cache Management(數(shù)據(jù)cache管理)

          ---------------------
            報告數(shù)據(jù)cache的自旋鎖爭奪、cache應用、cache擊中錯失、配置緩沖池的翻轉、清洗緩存(包括臟頁)、預取的請求與拒絕、讀臟頁請求等情況。
          Cache Statistics Summary (All Caches)
          -------------------------------------
          per sec per xactcount % of total
          ------------ ------------ ---------- ----------
          Cache Search Summary cache的擊中和錯失次數(shù)
          Total Cache Hits 18.6 1.6 11171 89.9 %
          Total Cache Misses2.1 0.2 1251 10.1 %
          ------------------------- ------------ ------------ ----------
          Total Cache Searches 20.7 1.8 12422
          Cache Turnover
          Buffers Grabbed 0.2 0.0 102 n/a
          緩存掠奪。Count表示cache緩存塊鏈中從LRU末端取走的緩存塊次數(shù)。
          Buffers Grabbed Dirty 0.0 0.0 0 0.0 %
          臟頁掠奪。在從LRU末端取走臟頁時必須等待將臟頁寫回磁盤。如果其值非零,可找出是什么cache受到影響,這事關cache的擊中性能問題。
          Cache Strategy Summary cache策略(對所有的cache)
          Cached (LRU) Buffers 19.8 1.7 11880 100.0 %
          報告有多少cache中的緩存塊放置到MRU/LRU鏈的頭部。
          Discarded (MRU) Buffers 0.0 0.0 0 0.0 %
          報告多少緩存塊采用了獲取-丟棄策略,緩存塊用過以后被放到緩存塊鏈的刷洗標記處。
          Large I/O Usage
          0.0 0.0 0 n/a
          大塊I/O請求使用次數(shù),這里沒有設置大塊I/O,故均為0值,也沒有其授權或拒絕使用情況。
          Large I/O Effectiveness
          大塊I/O的使用效果,百分比值低表示很少的頁被帶入cache供查詢使用,可進一步查看單個cache的使用情況。
          Pages by Lrg I/O Cached 0.0 0.0 0 n/a
          通過涉及的頁數(shù)衡量性能是否有益。低的百分比值意味著表的存貯結構很碎,或是不恰當?shù)腸ache配置策略。
          Asynchronous Prefetch Activity
          0.0 0.0 0 n/a
          異步預取情況可結合磁盤I/O管理查看??煽磪?shù)“global async prefetch limit”。
          Other Asynchronous Prefetch Statistics
          APFs Used 0.0 0.0 0 n/a
          異步預取合格的頁數(shù)。
          APF Waits for I/O 0.0 0.0 0 n/a
          進程等待異步預取完成的次數(shù)。表示查詢需要的頁沒有盡早地完成異步預取,這樣進程處于等待狀態(tài)。出現(xiàn)一定的百分比是合理的:查詢的首次異步預取請求通常需要等待;每次的順序掃描移動到新的分配單元時發(fā)出預取請求,查詢必須等待第一次的I/O結束;每次非聚簇索引掃描找到合適的行集,也會發(fā)出對頁的預取請求,也要等待第一次的頁返回。
          APF Discards 0.0 0.0 0 n/a
          報告已經被異步預取讀入但在使用之前就被放棄的頁數(shù)。如果其值高,建議增加緩沖池的尺寸單位(比如從2K增加4K、8K、16K的緩沖池)以改善性能,或者表示預取進入cache的很多頁并不為查詢所需要。
          Dirty Read Behavior
          Page Requests 0.0 0.0 0 n/a
          隔離級為0的臟讀請求的頁數(shù)。
          -------------------------------------------------------------------------------
          Cache: default data cache 缺省數(shù)據(jù)cache的情況:
          per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Spinlock Contentionn/a n/a n/a 0.0 %
          自旋鎖只對SMP環(huán)境有用。當一個用戶任務對cache的修改完成之前,其它任務將不能訪問該cache而只有等待。雖然自旋鎖駐留時間短,但對于高事務率的多處理器系統(tǒng)的性能依然有不好影響,如果自旋鎖比例超過10%,應考慮建立命名cache或者是增加cache分片。
          Utilization n/a n/a n/a 100.0 %
          下面是cache檢查的具體情況:
          Cache Searches
          Cache Hits 18.6 1.6 11171 89.9 %
          Found in Wash 1.1 0.1 677 6.1 %
          Cache Misses 2.1 0.2 1251 10.1 %
          ------------------------- ------------ ------------ ----------
          Total Cache Searches 20.7 1.8 12422
          Pool Turnover
          2 Kb Pool
          LRU Buffer Grab 0.2 0.0 102 100.0 %
          Grabbed Dirty 0.0 0.0 0 0.0 %
          ------------------------- ------------ ------------ ----------
          Total Cache Turnover 0.2 0.0 102
          Buffer Wash Behavior
          Statistics Not Available - No Buffers Entered Wash Section Yet
          Cache Strategy
          Cached (LRU) Buffers 19.8 1.7 11880 100.0 %
          Discarded (MRU) Buffers 0.0 0.0 0 0.0 %
          Large I/O Usage
          Total Large I/O Requests 0.0 0.0 0 n/a
          Large I/O Detail
          No Large Pool(s) In This Cache
          Dirty Read Behavior
          Page Requests 0.0 0.0 0 n/a


          單元九:內存管理
          命令行:sp_sysmon “00:10:00”,memory
          結果:
          Memory Management(內存管理)
          per secper xactcount % of total
          --------------------------- ------------ ------------ ---------- ----------
          Pages Allocated 0.0 0.0 13 n/a
          Pages Released 0.0 0.0 13 n/a

          內存中分配一個新頁的次數(shù)(相當于分配新頁數(shù)),以及釋放內存的頁數(shù)。

          單元十:磁盤I/O管理
          命令行:sp_sysmon “00:10:00”,diskio
          結果:

          Disk I/O Management(磁盤I/O管理)

          -------------------報告server總體磁盤I/O行為,包括讀、寫和邏輯設備上的semaphore爭奪。
          Max Outstanding I/Os per sec per xact count % of total
          最大顯著I/O數(shù):server總體開銷的最大I/O數(shù),分別通過server和引擎表示。
          ------------------------- ------------ ------------ ---------- ----------
          Server n/a n/a 10 n/a
          Engine 0 n/a n/a 10 n/a
          I/Os Delayed by
          系統(tǒng)遇到I/O延遲問題,類似于I/O被server或操作系統(tǒng)限制阻塞一樣。多數(shù)操作系統(tǒng)都有一個參數(shù)限制異步I/O數(shù)??捎胹p_configure查看參數(shù)“allow sql server async i/o”。
          Disk I/O Structures n/a n/a 0 n/a
          達到磁盤I/O結構極限從而被延遲的I/O數(shù)。當server超過了可用磁盤I/O的控制塊數(shù),I/O就會被延遲,因為server在開始一個I/O請求時需要通過任務來得到一個磁盤I/O控制塊。如果其值非零,通過設置增加參數(shù)值“disk i/o structures”(缺省256)來增加磁盤I/O控制塊數(shù),如果操作系統(tǒng)允許盡可能設置大一些,以使用光磁盤I/O結構的機會降到最小。
          Server Config Limit n/a n/a 0 n/a
          用參數(shù)“max async i/os per server”(缺省2147483647)進行調整server一次所用異步磁盤I/O請求數(shù)。
          Engine Config Limit n/a n/a 0 n/a
          引擎配置最大異步磁盤I/O請求數(shù)限制,用參數(shù)“max async i/os per engine”查看和調整。
          Operating System Limit n/a n/a 0 n/a
          操作系統(tǒng)的限制數(shù)查看操作系統(tǒng)文檔。
          Device Activity Detail
          ----------------------
          Device:
          master.dat
          master per sec per xact count % of total
          ------------------------- ------------ ------------ ---------- ----------
          Reads
          APF 0.0 0.0 0 0.0 %
          Non-APF 0.2 0.0 102 78.5 %
          Writes 0.0 0.0 28 21.5 %
          ------------------------- ------------ ------------ ---------- ----------
          Total I/Os 0.2 0.0 130 1.5 %
          Device Semaphore Granted 0.2 0.0 130 100.0 %
          Device Semaphore Waited 0.0 0.0 0 0.0 %
          -----------------------------------------------------------------------------

          posted @ 2008-07-20 10:56 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(1246) | 評論 (0)編輯 收藏

          以前的文檔,整理時發(fā)現(xiàn),貼出
          常用的命令集合
          一、配置命令
             1、檢查CPU使用情況:
                sp_sysmon "internal","model"
                internal是監(jiān)視時間。例如:"00:01:00"
                model是模塊的名稱。包括'kernel','wpm','parallel','taskmgmt','appmgmt','esp','housekeeper','monaccess','xactsum','xactmgmt','indexmgmt','mdcache','locks','dcache','pcache','memory','recovery','diskio','netio'

             2、檢查使用的最大的引擎數(shù)(CPU)
                sp_configure "max online engines"
                此命令還可以改變sybase系統(tǒng)使用CPU的數(shù)量。
                注意:改變后需要重新啟動sybase才可以使培植生效。引擎的數(shù)量是總的CPU數(shù)量減一

             3、顯示引擎號、狀態(tài)、相關任務數(shù)以及引擎啟動的時間:
                select engine, status, affinitied, starttime from sysengines

             4、顯示每個用戶的繁忙程度
                sp_reportstats

             5、監(jiān)視配置參數(shù)的運行情況
                sp_monitorconfig "open objects"
                參數(shù)見sp_monitorconfig中的值

          二、權限命令
             1、給一個用戶授所有的權限
                grant all to user_name

             2、給一個用戶授對某張表的所有權限
                grant all on table_name to user_name

             3、添加一個登錄(login)
                sp_addlogin

          三、TSQL使用
             1、統(tǒng)計信息更新
                select "print '"+name+"'"+char(10)+"update statistics "+name+ char(10) + "go"
                  from sysobjects
                 where (type='U' or type='S')
                 order by name

             2、顯示所有觸發(fā)器的名稱、建立時間
                SELECT USER_NAME(A.uid) 'Table Owner',
                       B.name 'Table Name',
                       A.name 'Trigger Name',
                       CONVERT(char(10),A.crdate,101)+SUBSTRING(CONVERT(char(20),A.crdate,0),13,7) 'Create Date'
                FROM sysobjects A,
                     sysobjects B
                WHERE A.type='TR'
                  AND (A.id=B.instrig OR A.id=B.updtrig OR A.id=B.deltrig)

             3、關于參照
                --生成建立已有參照的SQL語句
                select distinct result_sql='alter table '+rtrim(object_name(tableid))+' add constraint '
                +rtrim(object_name(constrid))+' foreign key('+
                +col_name(sysreferences.tableid,sysreferences.fokey1)+substring(',',1,sysreferences.fokey2)
                +col_name(sysreferences.tableid,sysreferences.fokey2)+substring(',',1,sysreferences.fokey3)
                +col_name(sysreferences.tableid,sysreferences.fokey3)+substring(',',1,sysreferences.fokey4)
                +col_name(sysreferences.tableid,sysreferences.fokey4)+substring(',',1,sysreferences.fokey5)
                +col_name(sysreferences.tableid,sysreferences.fokey5)+substring(',',1,sysreferences.fokey6)
                +col_name(sysreferences.tableid,sysreferences.fokey6)+substring(',',1,sysreferences.fokey7)
                +col_name(sysreferences.tableid,sysreferences.fokey7)+') '
                +'references '+rtrim(object_name(reftabid))+'('
                +col_name(sysreferences.reftabid,sysreferences.refkey1)+substring(',',1,sysreferences.refkey2)
                +col_name(sysreferences.reftabid,sysreferences.refkey2)+substring(',',1,sysreferences.refkey3)
                +col_name(sysreferences.reftabid,sysreferences.refkey3)+substring(',',1,sysreferences.refkey4)
                +col_name(sysreferences.reftabid,sysreferences.refkey4)+substring(',',1,sysreferences.refkey5)
                +col_name(sysreferences.reftabid,sysreferences.refkey5)+substring(',',1,sysreferences.refkey6)
                +col_name(sysreferences.reftabid,sysreferences.refkey6)+substring(',',1,sysreferences.refkey7)
                +col_name(sysreferences.reftabid,sysreferences.refkey7)+')'
                +char(10)+"go"
                 from sysreferences,syscolumns,sysobjects
                where sysreferences.tableid=sysobjects.id
                  and sysobjects.id=syscolumns.id
                  and sysobjects.type='U'
                order by sysobjects.name
                go
                --生成刪除參照的SQL語句
                select distinct result_sql='alter table '+rtrim(object_name(sysreferences.tableid))+' drop constraint '+rtrim(object_name(sysreferences.constrid))+char(10)+"go"
                  from sysreferences,syscolumns,sysobjects
                 where sysreferences.tableid=sysobjects.id
                   and sysobjects.id=syscolumns.id
                   and sysobjects.type='U'
                 order by object_name(sysreferences.tableid)
                go

             4、關于表級鎖
                --列出所有鎖類型為行鎖的表
                select name
                  from sysobjects
                 where type='U'
                   and sysstat2 & 57344 = 32768
                   and name not like "XT%"
                 order by name

                --調優(yōu)的方法有:調整鎖類型,調整表的聚簇索引
                --調整表鎖類型為行鎖,可以提高對表的并發(fā)訪問性能,但是同時也會占用更多的系統(tǒng)資源
                --修改行鎖的SQL語句:alter table [table_name] lock [datarows|allpages]
                --
                --調整表的聚簇索引在數(shù)據(jù)插入時,降低對表的最后一頁的爭用
                --Sybase規(guī)定一張表只能有一個聚簇索引,所以在調整聚簇索引時,要先刪除原有的聚簇索引,然后再建立新的
                --例如將SB_ZSXX表的在ZSXH上聚簇索引修改為在NSRSBH上的聚簇索引.
                --刪除原聚簇索引PK_SB_ZSXX
                drop index SB_ZSXX.PK_SB_ZSXX
                go
                create  nonclustered index PK_SB_ZSXX on SB_ZSXX(ZSXH)
                go
                -- 建立IDX_SB_ZSXX_NSRSBH的聚簇索引
                drop index SB_ZSXX.IDX_SB_ZSXX_NSRSBH
                go
                create  clustered index IDX_SB_ZSXX_NSRSBH on SB_ZSXX(NSRSBH)
                go
                --以上的索引信息可以用sp_help命令列出

             5、求出指定字段等于指定值的記錄數(shù)
                declare @lc_colname varchar(30)
                --declare @lc_colvalue /*定義欲求值的變量,隨著變量的類型定義不同的值*/
                --取包含指定列名的表
                select distinct name=object_name(id) into #AA from syscolumns where name = @lc_colname
                --生成SQL,求出指定字段等于指定值的記錄數(shù)
                select "insert into #BB select tname='"+name+"',cnt=count(*) from "+name+" where " + @lc_colname + "='" + @lc_colvalue + "'"+char(10)+"go"
                  from #AA
                --運行SQL
                --檢查記錄不為零的表,既為求出的表
                select * from #BB where cnt>0

             6、列出所有無主鍵的表
                select name from sysobjects
                 where name not in (
                                     SELECT object_name(id)
                                     FROM   sysindexes
                                     WHERE  indid > 0
                                            AND status2 & 2 = 2
                                            and status & 2048 = 2048
                                   )
                 and type="U"
               order by name

             7、關于用戶登錄
                --鎖定用戶
                select "sp_locklogin "+name+",'lock'"+char(10)+"go"
                  from syslogins
                 where name not like "%prim%"
                   and name not like "%maint%"
                   and name not like "sa"
                 order by name

                 --解除鎖定的用戶
                 select "sp_locklogin "+name+",'unlock'"+char(10)+"go"
                  from syslogins
                 where name not like "%prim%"
                   and name not like "%maint%"
                   and name not like "sa"
                 order by name
             8、為ctais_maint授權
                select "grant all on "+name+" to ctais_maint"+char(10)+"go" from sysobjects where type="U"

             9、整理出字段類型有text和image的表
                --text類型
                select distinct name=object_name(id)
                  from syscolumns
                 where type=35
                   and id in (select id from sysobjects where type="U")
                 order by object_name(id)

                --image類型
                select distinct name=object_name(id)
                  from syscolumns
                 where type=34
                   and id in (select id from sysobjects where type="U")
                 order by object_name(id)

             10、修改identity列的最大值
                --設置包含identity列的表為可直接插入記錄
                set identity_insert [table] [on|off]
                --插入一個比較大的值
                insert into [table] values([value])
          posted @ 2008-07-19 12:40 存鷹之心于高遠,取鷹之志而凌云,習鷹之性以涉險,融鷹之神在山巔. 閱讀(1315) | 評論 (0)編輯 收藏

          僅列出標題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          主站蜘蛛池模板: 通辽市| 历史| 通州市| 香格里拉县| 行唐县| 临泽县| 沭阳县| 泰和县| 城市| 西充县| 翼城县| 阳东县| 阜康市| 永嘉县| 瑞昌市| 湛江市| 景谷| 武清区| 邢台市| 准格尔旗| 勃利县| 象山县| 深州市| 丹阳市| 久治县| 甘德县| 柳江县| 霸州市| 会理县| 吉水县| 蓬溪县| 常州市| 隆子县| 铜山县| 衡山县| 天水市| 伊吾县| 望奎县| 浦城县| 泗水县| 昭平县|