1. 程式人生 > >SQL Server 效能優化實戰系列(一) SQL Server擴充套件函式的基本概念 使用SQL Server 擴充套件函式進行效能優化 SQL Server Url正則表示式 記憶體常駐 完美解決方案

SQL Server 效能優化實戰系列(一) SQL Server擴充套件函式的基本概念 使用SQL Server 擴充套件函式進行效能優化 SQL Server Url正則表示式 記憶體常駐 完美解決方案

資料庫伺服器主要用於儲存、查詢、檢索企業內部的資訊,因此需要搭配專用的資料庫系統,對伺服器的相容性、可靠性和穩定性等方面都有很高的要求。

       下面是進行籠統的技術點說明,為的是讓大家有一個整體的概念,如果想深入可以逐個擊破;     

       希望大家能一起補充完善。 

 

一、伺服器規劃:

  1. 使用64位的作業系統,最好是2008的;(Windows Server 2008 64位)
  2. 使用64位的資料庫程式,最好是2008的;(SQL Server 2008 64位)
  3. 使用千兆網絡卡;
  4. 使用硬RAID5;
  5. 使用64K的簇大小;
  6. LUN0用作系統盤,LUN1用作程式(主要是資料庫程式)安裝盤,LUN2用作資料庫檔案盤,動態盤;

 

二、系統設定:

如果伺服器使用的配置是:Windows Server 2003 x86 + SQL Server 2005 x86 + 12G記憶體

  1. 使用Windows Server 2003 Enterprise Edition,如果有可能的話也可以使用Windows 2003 Datacenter Edition;
  2. 在boot.ini中啟用pae;
  3. 使用gpedit.msc設定【記憶體中鎖定頁】;
  4. 設定虛擬記憶體到系統盤之外的物理磁碟中,如果是同一塊物理磁碟,分到其它邏輯分割槽也可以;設定大小看情況而定;
  5. 去掉【最大化檔案共享資料吞吐量】,選擇【最大化網路應用程式資料吞吐量】

 

三、資料庫設定:

  1. 設定資料庫的AWE,如果是16G的記憶體,一般是分配80%記憶體給資料庫程式使用;
  2. 設定資料庫例項的增長為10%,具體需要設定多少需要看你的業務需要,其目的就是儘量減少磁碟空間的分配次數還有較少磁碟碎片的產生;
  3. 設定資料庫例項的恢復模式為簡單模式,如果在可以的情況下;
  4. 設定TempDB的大小,一般來說可以給到4G以上,看具體需要和環境;
  5. 把除了SQL Server和SQL Server Browser 的其它資料庫服務都停止掉,除非你有使用到這些服務的需要;

 

四、資料庫設計:

  1. 表分割槽;(單臺數據庫伺服器)
  2. 事件複製讀寫分離;(兩臺資料庫伺服器)
  3. 對等事務複製;(多臺資料庫伺服器)

 

五、SQL優化:

  1. 建立合適的索引;
  2. 減少遊標的使用;
  3. 可以考慮CLR程式設計,比如一些頻繁查詢並且變動很小的表;
  4. 使用批量操作,減少頻繁而小的操作;
  5. 這裡的調優細節很多,大家可以慢慢深入瞭解;

SQL Server擴充套件函式的基本概念

 

什麼是SQL Server擴充套件函式呢?它實際上就是把C#或VB.NET的程式碼拿到SQL Server上去執行。反過來思考,那就是當你想對錶資料進行比較複雜的邏輯處理時,寫SQL又太麻煩,那麼你就可以是否可以通過SQLCLR來解決這個問題了。下面是我摘自wikipedia對SQLCLR的解釋。

SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出現的新功能,它將.NET Framework中的CLR服務注入到 SQL Server 中,讓 SQL Server 的部份資料庫物件可以使用 .NET Framework 的程式語言開發(目前只支援VB.NETC#),包括預存程式使用者自定義函式觸發程式使用者自定義型別以及使用者自定義彙總函式等功能。

幾個定義

    1. Stored Procedures (SP:儲存過程)
    2. User Defined Function ( UDF:使用者自定義函式)
    3. User Definied Types (UDT:使用者定義型別)
    4. User Definied Aggregate(UDA:聚合函式)
    5. Triggers(觸發器)

 

(圖1:SQLCLR的架構圖) 

 

 

(圖2:SQLCLR的開發流程圖) 

 

 

(圖3:SQLCLR的除錯) 

 

參考文獻

SQL CLR(wikipedia)  

使用 SQL Server 2005中的 CLR 整合 

 

使用SQL Server 擴充套件函式進行效能優化

 

SQL Server2005擴充套件函式已經不是一件什麼新鮮的事了,但是我看網上的大部分都是說聚合函式,例子也比較淺,那麼這裡就講講我運用擴充套件函式來優化資料庫效能的例子,希望和大家一起分享這個經驗。如果你還不知道什麼是SQLCLR,那麼你可以參考:SQL Server擴充套件函式的基本概念

 

 

需求說明 

大家在使用SQL Server開發的時候一定會遇到這樣的需求,那就是通過Table_Name1表的兩個欄位Column1、Column2來查詢在Table_Name2表中符合這兩個條件的記錄,並返回Table_Name2中的欄位Column3,面對這樣的需求,你也許會說使用表連線就可以了,對的,沒錯,我也是這樣想的,但是有的時候往往要面對不同的突發情況,那就是並不是一定會Column1與Column2是全匹配的查詢,可能中間還需要一些邏輯的處理,比如字串的擷取後再匹配等等。

這個時候我們通常會在SQL Server中寫一個函式,這個函式接收兩個引數:Column1、Column2,函式體裡面做一些邏輯處理,在通過處理好的引數去查詢Table_Name2表,並返回相應的值。很好,那下面我們來計算下圖中資料的查詢情況。假設表1的資料有50W,表2的資料有4W,在表2沒有索引的條件下,查詢的複雜度就有50W*4W了,兩個表都需要做全表掃描,表2的全表掃描就會達到50W次。

 (圖1:需求說明)

優化1:這一個優化,每個開發人員都知道,那就是對錶2的兩個查詢欄位分別建立索引。這樣的優化和之前相比,效能將會提高N個等級。

優化2:這第二個優化方法是使用SQL Server的複合索引,在表2上建立一個複合索引,這個符合索引包括需要查詢的兩個欄位,其實就是把兩個欄位的內容生成一個索引,其中索引包含了兩個索引的排序。

優化3:這第三個優化方法是使用SQL Server2005之後版本才有的索引-包含性索引(Include),就是在優化2的基礎上,把需要返回的欄位也一起放入到索引中,這樣的查詢就只需要查詢索引就夠了,不需要再讀取資料頁了,減少磁碟的IO消耗。不過這個方法也不是萬能,因為有時可能返回的欄位會比較多,有時幾個欄位加起來的長度有可能超出了900個字元(索引大小範圍),如果想了解可以進入:SQL Server 索引中include的魅力(具有包含性列的索引)

優化4:在不考慮一些分割槽、分表、分到不同的磁碟等優化方式的情況下,我們是否還能進一步優化我們的查詢呢?這就是這篇文章想要告訴你的,因為我們的回答是:有的。那就是通過SQLCLR的UDT,把表2的資料一次性載入到記憶體,那麼在進行表1查詢的時候,我們不需要通過B+樹來查詢資料了,直接到記憶體中查詢,這樣之所以快是因為操作記憶體要比操作磁碟要快得多。這其中會有些侷限性和缺點,具體見下面的缺點描述。

 

設計思路

  1. 去資料庫中把表2讀取出來,並放到private static readonly IDictionary<string, string> resultCollectionDic的靜態變數中。在資料庫服務啟動的時候是會初始化SQLCLR函式的,所以在啟資料庫服務的時候,也一起把表2的資料儲存到了記憶體當中了。
  2. 上面的查詢中包括了兩個欄位Column1、Column2和一個返回欄位Column3,那麼我們如何把這些資料儲存到IDictionary字典當中呢?我的做法就是把Column1、Column2的中間加一個字元“+”,把這個字串作為Key值,把Column3這個返回值做為Value,這樣就解決了多個And的查詢的問題。這個會有些侷限性,具體可以見下面的缺點描述。
  3. 在函式FunctionImsi2HLR2中傳進的兩個字元後,就要進行上面的拼湊方式來拼湊Key值,再到IDictionary中查詢。

 

測試結果

測試資料:表2有4.6732萬條記錄,表1有54.2524萬條記錄。

經過測試: 

  1. 優化1方法(單獨索引)的時間是106秒
  2. 優化3方法(包含性索引)的時間是45秒
  3. 優化4方法(擴充套件函式)的時間是33秒 

 

程式碼

複製程式碼 using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Collections.Generic;

public partial class UserDefinedFunctions
{
    //經過測試發現:使用Hashtable和SortedList沒有使用IDictionary的效能好.
    //IDictionary<string, string>中使用string比SqlString的效能要高.
    private static readonly IDictionary<string, string> resultCollectionDic = new Dictionary<string, string>();

    static UserDefinedFunctions()
    {
        GetTableFromDB(resultCollectionDic);
    }

    /// <summary>
    /// 從資料庫中獲取某個表的資料.
    /// </summary>
    /// <param name="resultCollection"></param>
    private static void GetTableFromDB(IDictionary<string, string> resultCollectionDic)
    {
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();

            using (SqlCommand selectMGT = new SqlCommand("SELECT NS,NP,HLR FROM dbo.zh_mgt ORDER BY NS,NP", connection))
            {
                using (SqlDataReader zhmgtReader = selectMGT.ExecuteReader())
                {
                    while (zhmgtReader.Read())
                    {
                        string NS = zhmgtReader["NS"].ToString();
                        string NP = zhmgtReader["NP"].ToString();
                        string HLR = zhmgtReader["HLR"].ToString();
                        string key = NS + "+" + NP;
                        if (!resultCollectionDic.ContainsKey(key))
                        {
                            resultCollectionDic.Add(key, HLR);
                        }
                    }
                }
            }

            connection.Close();
        }
    }

    /// <summary>
    /// 暴露給SQL Server呼叫的函式.
    /// </summary>
    /// <param name="NS">引數1</param>
    /// <param name="NP">引數2</param>
    /// <returns></returns>
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlString FunctionImsi2HLR2(string NS, int NP)
    {
        string result = null;//這裡設定為null是為了在方法IMSI2HLR2中判斷繼續迴圈.
        string key = NS + "+" + NP.ToString();//使用特殊符號+連線兩個列作為key值.
        if (resultCollectionDic.ContainsKey(key))
            result = resultCollectionDic[key].ToString();    
        return new SqlString(result);
    }
};  複製程式碼

 

呼叫方式對比

複製程式碼 --1:這個是在NP和NS欄位中分別建立索引
SELECT @rc=HLR FROM zh_mgt WHERE NP=7 and [email protected]

--2:這個是在NP、NS、HLR欄位中建立了一個包含性索引(Include)
SELECT @rc=HLR FROM zh_mgt WHERE [email protected] and NP=7  

--3:這是使用SQLCLR擴充套件函式的呼叫方法
SELECT @rc= dbo.FunctionImsi2HLR2(@mgt,7) 複製程式碼

 

優點 

  1. 效能上的比較(這裡的>是表示時間的長短,時間越小,效能越優):每個列有單獨的索引>使用Include的包含索引>擴充套件函式 
  2. 把表裡面的記錄放到記憶體上,直接去記憶體上查詢,不需要使用到B+樹來查詢資料。當你的記憶體足夠大或者空閒,並且使用到這個表的次數很多,而且更新不頻繁,那就可以考慮這樣的優化方案。
  3. 如果需要面對一些比較複雜的邏輯處理,也許SQL是沒有辦法做到,即使做到了,那麼SQL程式碼的閱讀和維護會比較困難,其實這個既是優點又是缺點,下面的缺點中有提到。
  4. 封裝程式碼,加強程式碼安全。

 

缺點 

  1. 有一定的侷限性,當有多個AND條件一起查詢或者幾個鍵通過上面的方法加起來的字串不唯一,那麼就沒有辦法像上面IDictionary<string, string>的方法來使用key了,但是也不是沒有辦法的,其實辦法就是IList,把唯一的值作為key,再構造一個實體作為key的value。
  2. 如果表更新了,需要重新註冊函式,因為程式已經把整個表載入到記憶體了;如果不重新註冊函式,那麼就需要資料庫重啟服務了,因為那個程式集是在服務啟動的時候就初始化了。
  3. 針對上面第二個缺點,也是有辦法解決的,那就是在表中做一個觸發器,當有Insert、Update、Delete等操作就呼叫一個重新註冊的儲存過程就可以了。
  4. 如果裡面的邏輯處理比較複雜,那麼更新邏輯所帶來的部署、維護成本比較大,因為如果是寫成函式或者是建立包含性索引可能會更好維護。

 

疑問 

  1. 在SQL Server中,對一個包含性索引的疑問:比如有一個int型別的欄位和一個nvarchar的欄位,int欄位的重複率比較大,而nvarchar的重複率比較少,我之前是根據重複率來確認誰放前面的,但是int與nvarchar的匹配效率是不一樣的,int只要匹配一次,而nvarchar需要匹配跟字串長度一樣多的次數,那麼應該如何把誰放到前面呢?
  2. 資料庫中可以把90%的查詢都歸結為1:完全匹配,2:字首匹配。對應解決方案是:1:可採用bloom-filter擴充套件函式進行高速匹配,2:可採用改進的哈夫曼樹。如何做這方面的方案呢?

 

總結 

雖然這樣的方式比較難在現實的運用中被使用,因為有很多侷限性和缺點,但是我寫這篇文章的初衷就是想讓大家知道在特殊的情況下,還有這樣一種優化的方法可以使用。 

 

SQL Server Url正則表示式 記憶體常駐 完美解決方案

 

   在使用SQL Server2005擴充套件函式進行效能優化已經提到過把SQL Server中的表裝載到記憶體中,通常這樣做的目的是讓頻繁的表查詢能通過在記憶體中查詢來優化資料庫效能,從而減少表的查詢,減少IO方面的消耗。

       這篇文章的目的就是為了解決使用SQL Server2005擴充套件函式進行效能優化中表記錄更新導致函式返回結果有誤的問題。產生這個問題的原因是:如果表更新了,而程式已經把整個表載入到記憶體了,所以會導致呼叫函式時返回的結果有誤。我們需要重新註冊函式,如果不重新註冊函式,那麼就需要資料庫重啟服務了,因為那個程式集是在服務啟動的時候就初始化了。

       上面這個問題的解決方案就是: 在表中建立一個觸發器,當有Insert、Update、Delete等操作就呼叫一個重新註冊的儲存過程重新註冊程式集(注意,Truncate、Drop是無法激發觸發器的)。看樣子,這個方案很簡單,而我寫這篇文章的目的是想把其中遇到的問題告訴大家。我想說的是,不要小看一個看似很解決的問題,只要你細心挖掘,你也可以學到很多東西的。

 

下面我就先來列列這些問題:

1.    這個註冊函式(更確切的說是註冊程式集)的儲存過程該如何寫?

2.    這個觸發器中你是否漏了Truncate這個操作的考慮?它是不會激發觸發器的,如何解決?

3.    當批量插入到這個表的時候發現插入的速度奇慢(插入的資料為幾百條),這個時候才發現原來這個註冊會給插入帶來災難性的效能問題。唯一辦法就是先禁用這個觸發器,等插入完成後再啟動觸發器。

4.    在開發環境中的註冊可以使用VS的部署來完成,再通過SQL Server的生成指令碼來匯出程式集做為註冊,但是註冊程式碼比較亂,有沒更好的辦法?

5.    解決了在註冊的時候需要讀取DLL程式集檔案的問題,通過生成十六進位制的程式碼來註冊程式集,這樣就不用依賴於DLL了,非常適合在生產環境中使用,也適合快速部署,達到儘量解耦的目的。

6.    一個動態擴充套件函式和一個靜態擴充套件函式(類似於上面的載入表到記憶體),這兩個函式最好不要寫在一個類裡面,最後是分開到不同的專案中,這樣是為了避免重新註冊程式集的時候不必要的資源浪費,更重要的是為了一個錯誤,一個需要初始化Static變數的問題。

7.    預設情況下資料庫的CLR是沒有開啟的,需要手動設定或者使用命令開啟。

8.    在為URL設定正則表示式的時候,應該注意需要在URL的前後加限定符(^ 行的開頭 $ 行的結尾 

 

總結出的一個開發CLR擴充套件函式的流程、步驟:

1.    在開發階段,使用VS編寫程式碼並部署測試;

2.    完成測試後,使用Release模式生成DLL,拷貝DLL到相應的伺服器,呼叫模板儲存過程,通過讀取DLL的方式先註冊一遍程式集,這是為了生成的程式碼比較明朗,不會亂;

3.    使用SQL Server的生成指令碼的功能來匯出程式集,再把生成的程式碼拷貝到註冊的儲存過程中,使之脫離讀取DLL的註冊方式,這樣就可以快速遷移CLR擴充套件函數了。

 

下面就介紹一下這個解決方案的內容:

1.    最主要的註冊函式

  SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Deploy_ETplugin_SQLRegexUrlImage]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
-- =============================================
-- Author:        <Viajar>
-- Create date: <2010.06.19>
-- Description:    <部署擴充套件函式>
-- 程式集在:C:\SQLRegexUrlImage.dll
-- =============================================
CREATE PROCEDURE [dbo].[Deploy_ETplugin_SQLRegexUrlImage]
AS
BEGIN
    --判斷是否存在名為SQLRegexUrlImage的函式
    IF EXISTS (SELECT name FROM sys.sysobjects WHERE name = ''SQLRegexUrlImage'')
       DROP FUNCTION SQLRegexUrlImage

    --判斷是否存在名為SQLRegexUrlImage的程式集
    IF EXISTS (SELECT name FROM sys.assemblies WHERE name = ''SQLRegexUrlImage'')
       DROP ASSEMBLY SQLRegexUrlImage

    --建立註冊程式集
    CREATE ASSEMBLY SQLRegexUrlImage FROM ''C:\SQLRegexUrlImage.dll''
    WITH PERMISSION_SET = SAFE -- EXTERNAL_ACCESS

    --建立函式與程式集的對應
    execute dbo.sp_executesql @statement = N''
    CREATE FUNCTION [dbo].[SQLRegexUrlImage](@urlString [nvarchar](500))
    RETURNS [nvarchar](50)
    AS EXTERNAL NAME [SQLRegexUrlImage].[UserDefinedFunctions].[SQLRegexUrlImage]''

END
SET ANSI_NULLS OFF

END
GO  

 

 

2.    使用資料庫的生成指令碼功能,可以匯出程式集的程式碼,把下面的程式碼替換上面儲存過程中使用路徑註冊的方法,這樣就避免了部署的時候需要拷貝DLL的問題。

  CREATE ASSEMBLY [SQLRegexUrlImage]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300F90D1E4C0000000000000000E0000E210B010800000E000000060000000000001E2C0000002000000040000000004000002000000002000004000000000000000400000000000000008000000002000000000000030040050000100000100000000010000010000000000000100000000000000000000000D02B00004B00000000400000C803000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000240C000000200000000E000000020000000000000000000000000000200000602E72737263000000C8030000004000000004000000100000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001400000000000000000000000000004000004200000000000000000000000000000000002C0000000000004800000002000500A8210000280A0000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056730D00000A80010000047E0100000428020000062A00001B3003008F000000010000117201000070730E00000A0A066F0F00000A723100007006731000000A0B076F1100000A0C2B360872C20000706F1200000A6F1300000A0D0872D60000706F1200000A6F1300000A13040211046F1400000A2D09021104096F1500000A086F1600000A2DC2DE0A082C06086F1700000ADCDE0A072C06076F1700000ADC066F1800000ADE0A062C06066F1700000ADC2A0001280000020024004266000A0000000002001D005572000A0000000002000B007984000A000000001B3002005800000002000011140A7E010000046F1A00000A13042B2A11046F1B00000A0B1201281C00000A0C08731D00000A0D09026F1E00000A2C0A1201281F00000A0A2B0911046F2000000A2DCDDE0C11042C0711046F1700000ADC06732100000A2A0110000002000E003745000C000000001E02282200000A2A42534A4201000100000000000C00000076322E302E35303732370000000005006C000000D0020000237E00003C0300002404000023537472696E67730000000060070000E8000000235553004808000010000000234755494400000058080000D001000023426C6F620000000000000002000001571502080900000000FA013300160000010000001C00000002000000010000000400000002000000220000000B0000000200000005000000010000000300000000000A00010000000000060044003D00060066004B000A00BF00AA000600FC00EA0006001301EA0006003001EA0006004F01EA0006006801EA0006008101EA0006009C01EA000600B701EA000600EF01D00106000302EA0006003C021C0206005C021C0206007A024B000A009D0287020A00BE02AB020A00D00287020A00DB0287020A00F702AB0206002B033D000A0060034503060075034B00060083034B00060092034B000E00E103C20306000C04F9030000000001000000000001000100010000001F000000050001000100310074000A00502000000000911888001200010068200000000091008F00160001002C21000000009600C90020000200A021000000008618DA002600030000000100740000000100E0002100DA002A002900DA002A003100DA002A003900DA002A004100DA002A004900DA002A005100DA002A005900DA002A006100DA002F006900DA002A007100DA0034007900DA0026000C00DA0026008900DA002A009100CB0226009900DA0040009900E9024700A90004034C0009000D035100140016035C00140022036200A90026036A00B1003703260091003F032600B900DA0026001C00A00315012400AE0329012C00BA032901D900DA002A00D900E70335012C00EF033A01E10018046A001900DA002A000900DA0026002E002B0056012E006300AF012E0013006C012E001B006C012E00230072012E000B0056012E00330083012E003B006C012E004B006C012E005B00A6016000CB0079006E003F01390055000A011E012E010480000001000000EF0E3C92000000000000C9000000020000000000000000000000010034000000000002000000000000000000000001009E000000000002000000000000000000000001003D00000000000000003C4D6F64756C653E0053514C526567657855726C496D6167652E646C6C0055736572446566696E656446756E6374696F6E73006D73636F726C69620053797374656D004F626A6563740053797374656D2E436F6C6C656374696F6E732E47656E65726963004944696374696F6E617279603200726573756C74436F6C6C656374696F6E446963002E6363746F72004765745461626C6546726F6D44420053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C537472696E670053514C526567657855726C496D616765002E63746F720075726C537472696E670053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650044696374696F6E61727960320053797374656D2E446174612E53716C436C69656E740053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E0053716C436F6D6D616E640053716C44617461526561646572004578656375746552656164657200446244617461526561646572006765745F4974656D00546F537472696E6700436F6E7461696E734B65790041646400526561640049446973706F7361626C6500446973706F736500436C6F7365004D6963726F736F66742E53716C5365727665722E5365727665720053716C46756E6374696F6E4174747269627574650049456E756D657261626C656031004B657956616C75655061697260320049456E756D657261746F72603100476574456E756D657261746F72006765745F43757272656E74006765745F4B65790053797374656D2E546578742E526567756C617245787072657373696F6E730052656765780049734D61746368006765745F56616C75650053797374656D2E436F6C6C656374696F6E730049456E756D657261746F72004D6F76654E65787400000000002F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D00740072007500650000808F730065006C0065006300740020005B0049006D006100670065004E0061006D0065005D002C005B00550052004C0052006500670078005D002000660072006F006D0020005B00550072006C0049006D0061006700650053006100760065005D0020007700680065007200650020005B00550052004C0052006500670078005D00200021003D002000270027002000011349006D006100670065004E0061006D006500000F550052004C00520065006700780000000024C3137D6DEAE841B1EAE8AD5A5ABA3D0008B77A5C561934E0890706151209020E0E0300000109000101151209020E0E050001110D0E03200001042001010E0420010102042001010806151241020E0E062002010E124504200012510420011C0E0320000E06151209020E0E0520010213000720020113001301032000020A07051245124D12510E0E808F010001005455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A44617461416363657373010000000A15126101151165020E0E0820001512690113000A15126901151165020E0E042000130006151165020E0E042001020E04200013011607050E151165020E0E0E126D15126901151165020E0E1501001053514C526567657855726C496D61676500000501000000001001000B626F74776176652E636F6D00002201001D436F7079726967687420C2A920626F74776176652E636F6D203230313000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000F82B000000000000000000000E2C0000002000000000000000000000000000000000000000000000002C00000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000700300000000000000000000700334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001003C92EF0E000001003C92EF0E3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004D0020000010053007400720069006E006700460069006C00650049006E0066006F000000AC020000010030003000300030003000340062003000000038000C00010043006F006D00700061006E0079004E0061006D0065000000000062006F00740077006100760065002E0063006F006D0000004C0011000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0052006500670065007800550072006C0049006D006100670065000000000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003800320033002E0033003700340033003600000000004C001500010049006E007400650072006E0061006C004E0061006D0065000000530051004C0052006500670065007800550072006C0049006D006100670065002E0064006C006C000000000060001D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200062006F00740077006100760065002E0063006F006D0020003200300031003000000000005400150001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0052006500670065007800550072006C0049006D006100670065002E0064006C006C0000000000440011000100500072006F0064007500630074004E0061006D00650000000000530051004C0052006500670065007800550072006C0049006D006100670065000000000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003800320033002E00330037003400330036000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003800320033002E0033003700340033003600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000203C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  

 

 

3.     呼叫方法和效果圖