數據庫服務器主要用於存儲、查詢、檢索企業內部的信息,所以須要搭配專用的數據庫系統,對服務器的兼容性、可靠性和穩定性等方面都有很高的要求。php
下面是進行籠統的技術點說明,爲的是讓你們有一個總體的概念,若是想深刻能夠逐個擊破; html
但願你們能一塊兒補充完善。 java
1、服務器規劃:正則表達式
- 使用64位的操做系統,最好是2008的;(Windows Server 2008 64位)
- 使用64位的數據庫程序,最好是2008的;(SQL Server 2008 64位)
- 使用千兆網卡;
- 使用硬RAID5;
- 使用64K的簇大小;
- LUN0用做系統盤,LUN1用做程序(主要是數據庫程序)安裝盤,LUN2用做數據庫文件盤,動態盤;
2、系統設置:sql
若是服務器使用的配置是:Windows Server 2003 x86 + SQL Server 2005 x86 + 12G內存數據庫
- 使用Windows Server 2003 Enterprise Edition,若是有可能的話也可使用Windows 2003 Datacenter Edition;
- 在boot.ini中啓用pae;
- 使用gpedit.msc設置【內存中鎖定頁】;
- 設置虛擬內存到系統盤以外的物理磁盤中,若是是同一塊物理磁盤,分到其它邏輯分區也能夠;設置大小看狀況而定;
- 去掉【最大化文件共享數據吞吐量】,選擇【最大化網絡應用程序數據吞吐量】
3、數據庫設置:編程
- 設置數據庫的AWE,若是是16G的內存,通常是分配80%內存給數據庫程序使用;
- 設置數據庫實例的增加爲10%,具體須要設置多少須要看你的業務須要,其目的就是儘可能減小磁盤空間的分配次數還有較少磁盤碎片的產生;
- 設置數據庫實例的恢復模式爲簡單模式,若是在能夠的狀況下;
- 設置TempDB的大小,通常來講能夠給到4G以上,看具體須要和環境;
- 把除了SQL Server和SQL Server Browser 的其它數據庫服務都中止掉,除非你有使用到這些服務的須要;
4、數據庫設計:安全
- 表分區;(單臺數據庫服務器)
- 事件複製讀寫分離;(兩臺數據庫服務器)
- 對等事務複製;(多臺數據庫服務器)
5、SQL優化:性能優化
- 建立合適的索引;
- 減小遊標的使用;
- 能夠考慮CLR編程,好比一些頻繁查詢而且變更很小的表;
- 使用批量操做,減小頻繁而小的操做;
- 這裏的調優細節不少,你們能夠慢慢深刻了解;
什麼是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.NET和C#),包括預存程序、用戶自定義函數、觸發程序、用戶自定義型別以及用戶自定義彙總函數等功能。
幾個定義
- Stored Procedures (SP:存儲過程)
- User Defined Function ( UDF:用戶自定義函數)
- User Definied Types (UDT:用戶定義類型)
- User Definied Aggregate(UDA:聚合函數)
- Triggers(觸發器)
(圖1:SQLCLR的架構圖)
(圖2:SQLCLR的開發流程圖)
(圖3:SQLCLR的調試)
參考文獻
SQL CLR(wikipedia)
使用 SQL Server 2005中的 CLR 集成
SQL Server2005擴展函數已經不是一件什麼新鮮的事了,可是我看網上的大部分都是說聚合函數,例子也比較淺,那麼這裏就講講我運用擴展函數來優化數據庫性能的例子,但願和你們一塊兒分享這個經驗。若是你還不知道什麼是SQLCLR,那麼你能夠參考:SQL Server擴展函數的基本概念。
需求說明
你們在使用SQL Server開發的時候必定會遇到這樣的需求,那就是經過Table_Name1表的兩個字段Column一、Column2來查詢在Table_Name2表中符合這兩個條件的記錄,並返回Table_Name2中的字段Column3,面對這樣的需求,你也許會說使用錶鏈接就能夠了,對的,沒錯,我也是這樣想的,可是有的時候每每要面對不一樣的突發狀況,那就是並非必定會Column1與Column2是全匹配的查詢,可能中間還須要一些邏輯的處理,好比字符串的截取後再匹配等等。
這個時候咱們一般會在SQL Server中寫一個函數,這個函數接收兩個參數:Column一、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+樹來查詢數據了,直接到內存中查詢,這樣之因此快是由於操做內存要比操做磁盤要快得多。這其中會有些侷限性和缺點,具體見下面的缺點描述。
設計思路
- 去數據庫中把表2讀取出來,並放到private static readonly IDictionary<string, string> resultCollectionDic的靜態變量中。在數據庫服務啓動的時候是會初始化SQLCLR函數的,因此在啓數據庫服務的時候,也一塊兒把表2的數據保存到了內存當中了。
- 上面的查詢中包括了兩個字段Column一、Column2和一個返回字段Column3,那麼咱們如何把這些數據保存到IDictionary字典當中呢?個人作法就是把Column一、Column2的中間加一個字符「+」,把這個字符串做爲Key值,把Column3這個返回值作爲Value,這樣就解決了多個And的查詢的問題。這個會有些侷限性,具體能夠見下面的缺點描述。
- 在函數FunctionImsi2HLR2中傳進的兩個字符後,就要進行上面的拼湊方式來拼湊Key值,再到IDictionary中查詢。
測試結果
測試數據:表2有4.6732萬條記錄,表1有54.2524萬條記錄。
通過測試:
- 優化1方法(單獨索引)的時間是106秒
- 優化3方法(包含性索引)的時間是45秒
- 優化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 NS=@mgt
--2:這個是在NP、NS、HLR字段中創建了一個包含性索引(Include)
SELECT @rc=HLR FROM zh_mgt WHERE NS=@mgt and NP=7
--3:這是使用SQLCLR擴展函數的調用方法
SELECT @rc= dbo.FunctionImsi2HLR2(@mgt,7)
優勢
- 性能上的比較(這裏的>是表示時間的長短,時間越小,性能越優):每一個列有單獨的索引>使用Include的包含索引>擴展函數
- 把表裏面的記錄放到內存上,直接去內存上查詢,不須要使用到B+樹來查詢數據。當你的內存足夠大或者空閒,而且使用到這個表的次數不少,並且更新不頻繁,那就能夠考慮這樣的優化方案。
- 若是須要面對一些比較複雜的邏輯處理,也許SQL是沒有辦法作到,即便作到了,那麼SQL代碼的閱讀和維護會比較困難,其實這個既是優勢又是缺點,下面的缺點中有提到。
- 封裝代碼,增強代碼安全。
缺點
- 有必定的侷限性,當有多個AND條件一塊兒查詢或者幾個鍵經過上面的方法加起來的字符串不惟一,那麼就沒有辦法像上面IDictionary<string, string>的方法來使用key了,可是也不是沒有辦法的,其實辦法就是IList,把惟一的值做爲key,再構造一個實體做爲key的value。
- 若是表更新了,須要從新註冊函數,由於程序已經把整個表加載到內存了;若是不從新註冊函數,那麼就須要數據庫重啓服務了,由於那個程序集是在服務啓動的時候就初始化了。
- 針對上面第二個缺點,也是有辦法解決的,那就是在表中作一個觸發器,當有Insert、Update、Delete等操做就調用一個從新註冊的存儲過程就能夠了。
- 若是裏面的邏輯處理比較複雜,那麼更新邏輯所帶來的部署、維護成本比較大,由於若是是寫成函數或者是創建包含性索引可能會更好維護。
疑問
- 在SQL Server中,對一個包含性索引的疑問:好比有一個int類型的字段和一個nvarchar的字段,int字段的重複率比較大,而nvarchar的重複率比較少,我以前是根據重複率來確認誰放前面的,可是int與nvarchar的匹配效率是不同的,int只要匹配一次,而nvarchar須要匹配跟字符串長度同樣多的次數,那麼應該如何把誰放到前面呢?
- 數據庫中能夠把90%的查詢都歸結爲1:徹底匹配,2:前綴匹配。對應解決方案是:1:可採用bloom-filter擴展函數進行高速匹配,2:可採用改進的哈夫曼樹。如何作這方面的方案呢?
總結
雖然這樣的方式比較難在現實的運用中被使用,由於有不少侷限性和缺點,可是我寫這篇文章的初衷就是想讓你們知道在特殊的狀況下,還有這樣一種優化的方法可使用。
在使用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. 調用方法和效果圖