利用DB2 pureXML管理XML數(shù)據(jù)實(shí)踐
XML 數(shù)據(jù)用于提高性能和存儲(chǔ)有效性的存儲(chǔ)選項(xiàng)
◆對(duì) DB2 DMS 表空間啟用自動(dòng)存儲(chǔ)。
◆為 XML 數(shù)據(jù)使用更大的頁(yè)大小,比如 16KB 或 32KB 。
◆如果性能分析需要,就為 XML 數(shù)據(jù)選擇一個(gè)不同的表空間頁(yè)大小。
◆很多 XML 文檔足夠小并且能和其它 non-XML 數(shù)據(jù)存在數(shù)據(jù)頁(yè)上,就為 XML 文檔使用內(nèi) 嵌存儲(chǔ)。否則文檔存放在表之外,類似于 LOBs,并且通過(guò)區(qū)域索引來(lái)訪問(wèn)。
◆使用壓縮來(lái)減少 XML 文檔以 inline 方式存放時(shí)的空間大小。
在 DB2 數(shù)據(jù)庫(kù)中添加 XML 數(shù)據(jù)的技術(shù):
◆為了提高你在使用 insert、import 或 load 添加數(shù)據(jù)時(shí)的性能,
◆使用使用較大頁(yè)大小的 DMS 表空間,比如 16KB 或 32KB 。
◆提供足夠的緩沖池空間以支持 XML 區(qū)域索引和路徑索引的讀取。
◆如果你有多個(gè)用戶定義的 XML 索引,通常最好在添加數(shù)據(jù)之前定義它們。
◆如果有必要,把行抽取選中的 XML 元素值放入到和 XML 文檔相同的關(guān)系列中。關(guān)系列 中存放的數(shù)據(jù)允許簡(jiǎn)單、SQL-only 的形式來(lái)訪問(wèn)重要的數(shù)據(jù)或經(jīng)常訪問(wèn)數(shù)據(jù)條目、可以定義 主鍵、外鍵或其它約束、以及可以定義多列(組合鍵)關(guān)系索引。
◆如果更小的片段更適合數(shù)據(jù)訪問(wèn)的粒度,就把大型 XML 文檔分割成更小的片段。
◆定義觸發(fā)器來(lái)對(duì)插入和更新 XML 數(shù)據(jù)進(jìn)行自動(dòng)驗(yàn)證
有效查詢并更新 XML 文檔的技術(shù):
◆使用 SQL/XML 函數(shù) XMLTABLE 或 XMLQUERY 來(lái)從 XML 文檔中抽取數(shù)據(jù)。
◆在SQL WHERE 子句中使用 XMLEXISTE 謂詞來(lái)指定對(duì) XML 數(shù)據(jù)的謂詞 ,通過(guò)檢查更少的行來(lái)提高查詢性能。
◆使用一個(gè)完全指定的 XML 路徑,而不要使用通配符 * 或 // 來(lái)定位到期望的 XML 元素 。這樣做可以提供更好的性能,因?yàn)?DB2 可以跳過(guò) XML 文檔中不相關(guān)的部分直接找到期望的 XML 元素。
◆出于增加商業(yè)洞察力和最大化一個(gè)混合數(shù)據(jù)庫(kù)服務(wù)器的價(jià)值的需要,你在查詢中需要要 對(duì) XML 和關(guān)系數(shù)據(jù)進(jìn)行連接。
◆當(dāng)在一個(gè) XML 文檔中更新多個(gè)元素時(shí),把更新合并到一個(gè)轉(zhuǎn)換描述中以獲得最佳的更新 性能
◆在查詢中聲明名稱空間,更新 XML 索引以匹配你的 XML 商業(yè)數(shù)據(jù)。這個(gè)讓你能從多個(gè) 或復(fù)雜的域中處理 XML 文檔。
為什么使用 XML
XML 提供了一個(gè)普通而具有彈性的方法來(lái)在不同的系統(tǒng)、應(yīng)用程序和組織之間交換數(shù)據(jù)。 使用 XML,數(shù)據(jù)是在一個(gè)可擴(kuò)展自描述格式下進(jìn)行維護(hù),以提供給所有涉及的商業(yè)需求。 XML 文檔是用標(biāo)簽來(lái)描述它們包含的數(shù)據(jù)值,并且通過(guò)嵌套標(biāo)簽來(lái)表示數(shù)據(jù)條目間的層次關(guān)系。 XML 可以描述高度結(jié)構(gòu)化的數(shù)據(jù)并通過(guò) XML 模式來(lái)保持結(jié)構(gòu),但是它也能描述半結(jié)構(gòu)化的數(shù) 據(jù),這些數(shù)據(jù)普遍存在于內(nèi)容為導(dǎo)向的應(yīng)用程序。
以服務(wù)為導(dǎo)向的架構(gòu)(SOA)、企業(yè)應(yīng)用程序整合(EAI)、企業(yè)信息整合(EII)、Web 服 務(wù)、企業(yè)消息總線和很多依賴于 XML 作為底層數(shù)據(jù)交換技術(shù)的標(biāo)準(zhǔn)化成就。
就像行業(yè)這樣的機(jī)構(gòu)使用標(biāo)準(zhǔn)化的 XML 模式來(lái)促進(jìn)信息交換并且發(fā)展那些模式來(lái)滿足變化 中的商業(yè)需求。這些努力包括在保險(xiǎn)行業(yè)中的 ACORD、金融行業(yè)中的 FpML 和 FIXML、供應(yīng) 鏈管理中的 違規(guī)廣告、零售商業(yè)中的 ARTS、衛(wèi)生保健中的 HL7、商業(yè)報(bào)告里的 XBRL 和在印 刷行業(yè)中用于授權(quán)、管理和發(fā)布文檔的 DITA 以及整個(gè)網(wǎng)絡(luò)。
這類具體行業(yè)創(chuàng)新(比如管理需求)在驅(qū)動(dòng) XML 發(fā)展。越來(lái)越多的企業(yè)事務(wù)通過(guò)基于網(wǎng)絡(luò) 接口和電子表格來(lái)操作。政府代理和商業(yè)企業(yè)對(duì)保留原始訂單、請(qǐng)求、申明、交易或簽名承擔(dān) 更多的責(zé)任。 XML 提供了一個(gè)簡(jiǎn)單的方法來(lái)抓取并維護(hù)和那些電子交易相關(guān)的數(shù)據(jù)。事實(shí)上 ,XML 文檔常常在基于消息的事務(wù)系統(tǒng)中表現(xiàn)事務(wù)記錄。
XML 和關(guān)系數(shù)據(jù)的優(yōu)缺點(diǎn)
作為一個(gè)自描述數(shù)據(jù)格式,XML 允許不同的數(shù)據(jù)(有模式或沒(méi)有)在不犧牲搜索或聚合能 力的情況下被同時(shí)存在一個(gè)文檔中或某一行中。應(yīng)用程序可以在對(duì)底層數(shù)據(jù)庫(kù)模式不進(jìn)行任何 改變的情況下發(fā)展他們自己的 XML 模式。然而,對(duì)于 XML 的這種擴(kuò)展意味著比起存儲(chǔ)在關(guān)系 表中的數(shù)據(jù)在檢查和解釋 XML 數(shù)據(jù)時(shí)會(huì)花費(fèi)更多的 CPU 和 I/O 資源 – 這可能不切實(shí)際。
對(duì)更多的剛性模式定義,關(guān)系模式需要更少的解釋并允許更多的優(yōu)化數(shù)據(jù)操作。就像這樣 ,他可以提供非常高的性能,不過(guò)卻不能滿足應(yīng)用程序需要的模式彈性。關(guān)系型數(shù)據(jù)模型非常 適合有穩(wěn)定數(shù)據(jù)結(jié)構(gòu)和可預(yù)知訪問(wèn)形式的應(yīng)用程序。 XML 更適合有復(fù)雜多變數(shù)據(jù)結(jié)構(gòu)以及混 有結(jié)構(gòu)化和非結(jié)構(gòu)化信息的應(yīng)用程序。
在某些情況下,XML 提供的性能好處超過(guò)了關(guān)系模型正好是因?yàn)樗膹椥浴jP(guān)系型數(shù)據(jù)庫(kù) 經(jīng)常需要標(biāo)準(zhǔn)化來(lái)使商業(yè)數(shù)據(jù)適應(yīng)簡(jiǎn)單平坦的結(jié)構(gòu)。對(duì)復(fù)雜商業(yè)數(shù)據(jù)的標(biāo)準(zhǔn)化需要在數(shù)據(jù)存取 的時(shí)候進(jìn)行轉(zhuǎn)化,并經(jīng)常在關(guān)系型數(shù)據(jù)庫(kù)中導(dǎo)致多路的連接需求。 XML 可以在一個(gè)文檔中更 自然的表現(xiàn)復(fù)雜的商業(yè)對(duì)象以及對(duì)象間的所有關(guān)系。在一個(gè) XML 文檔中的層次本質(zhì)上就是預(yù) 先計(jì)算的相關(guān)數(shù)據(jù)條目之間的連接。
在選擇一個(gè)數(shù)據(jù)模式時(shí)的另外一個(gè)考慮是應(yīng)用程序使用數(shù)據(jù)。就算數(shù)據(jù)源自 XML,如果數(shù) 據(jù)后來(lái)的處理取決于存儲(chǔ)在表格中的數(shù)據(jù)—例如,在一個(gè)數(shù)據(jù)倉(cāng)庫(kù)中應(yīng)用關(guān)系行在線分析處理 (OLAP)的數(shù)據(jù)—那么把這些數(shù)據(jù)存入關(guān)系格式而非 XML 可能是正確的選擇。
關(guān)系數(shù)據(jù)模式問(wèn)題的 XML 解決方案
為了最大的可能范圍,存儲(chǔ)數(shù)據(jù)的模型應(yīng)該和你數(shù)據(jù)的最高值和最關(guān)鍵的使用模式相匹配 。如果數(shù)據(jù)被模式化成為自然表格,比起 XML 這通常表現(xiàn)為關(guān)系型格式更好。然而,有些情 況下關(guān)系型模式不是最好的選擇而且有時(shí)用來(lái)存儲(chǔ)數(shù)據(jù)甚至是很差的選擇。下面是用 XML 表 現(xiàn)比用關(guān)系型格式更好一些情況。
當(dāng)模式不穩(wěn)定時(shí)
關(guān)系型數(shù)據(jù)的問(wèn)題:如果數(shù)據(jù)模式經(jīng)常改變,那么在關(guān)系表結(jié)果中表現(xiàn)的數(shù)據(jù),更改關(guān)系 模式將產(chǎn)生成本和開銷。一些模式的表格更改在關(guān)系型數(shù)據(jù)庫(kù)中是無(wú)痛的,比如在表中增加一 個(gè)新列、把模式的其它表加入進(jìn)來(lái),還有就是刪除一列或更改一列的類型。不過(guò)模式的其它表 要更改(比如把一個(gè)表正常化進(jìn)多個(gè)表中)會(huì)非常困難。首先要改變表然后應(yīng)用程序需要改變 訪問(wèn)的 SQL 語(yǔ)句。
XML 數(shù)據(jù)解決方案:模式中易變的那一部分可以作為一個(gè)單獨(dú)的 XML 列存在。 XML 天然 的自描述和易擴(kuò)展功能可以無(wú)縫的處理模式變化和改進(jìn)。 XML 文檔格式中的改變是在不需要 在數(shù)據(jù)庫(kù)中更改表或者列并且通常不需要破壞現(xiàn)有 XML 查詢。
當(dāng)數(shù)據(jù)是自然的層次時(shí)
關(guān)系型數(shù)據(jù)的相關(guān)問(wèn)題:天然分層或遞歸數(shù)據(jù)在關(guān)系模式中常常很難表現(xiàn)。例如包括原料 賬單、工程對(duì)象或生物學(xué)數(shù)據(jù)。一個(gè)原料清單可以存進(jìn)一個(gè)關(guān)系型數(shù)據(jù)庫(kù),不過(guò)可能需要遞歸 SQL 來(lái)把它部分或全部重新構(gòu)建。
XML 數(shù)據(jù)解決方案:因?yàn)?XML 是一個(gè)層次型數(shù)據(jù)庫(kù)模式,它可以非常自然的表現(xiàn)本身就是 層次型的商業(yè)數(shù)據(jù)。如果相同數(shù)據(jù)表現(xiàn)為表格形式需要,使用 XML 可以用簡(jiǎn)單、導(dǎo)行的數(shù)據(jù) 訪問(wèn)來(lái)代替復(fù)雜的一系列操作。
當(dāng)數(shù)據(jù)表現(xiàn)商業(yè)對(duì)象時(shí)
關(guān)系型數(shù)據(jù)的問(wèn)題:如果應(yīng)用程序數(shù)據(jù)要表現(xiàn)商業(yè)對(duì)象,比如保險(xiǎn)保單,它經(jīng)常從保留有 數(shù)據(jù)條目和一個(gè)詳細(xì)聲明的組合中得到好處,而不是把它們分散到一系列表中。這對(duì)一個(gè)保單 的那些本身沒(méi)有有效商業(yè)含義并且只能在有上下文的完整表單中被解釋的單獨(dú)的數(shù)據(jù)條目來(lái)說(shuō) 尤其如此。通過(guò)數(shù)十個(gè)關(guān)系型表來(lái)正?;@個(gè)保單意味著應(yīng)用程序處理一個(gè)復(fù)雜的并且對(duì)于他 們的商業(yè)來(lái)說(shuō)是不成體系的數(shù)據(jù)。這增加了負(fù)載和出錯(cuò)的幾率。
XML 數(shù)據(jù)的解決方案:XML 讓你可以表現(xiàn)非常復(fù)雜的商業(yè)對(duì)象比如緊密相關(guān)的文檔以及截 然不同的文檔同時(shí)還抓取所有組成商業(yè)對(duì)象的數(shù)據(jù)條目之間的關(guān)系。以一個(gè)在表中單獨(dú)一行里 的 XML 文檔來(lái)表現(xiàn)每個(gè)保單(商業(yè)對(duì)象)為應(yīng)用程序開發(fā)人員提供了非常直觀的存儲(chǔ)模型并 可以快速進(jìn)行應(yīng)用程序開發(fā)。
當(dāng)對(duì)象有稀疏的屬性時(shí)
關(guān)系型數(shù)據(jù)的問(wèn)題:某些程序有非常多的可能屬性,它們大多數(shù)很稀疏,例如,可以適應(yīng) 非常少的對(duì)象。一類例子是一個(gè)產(chǎn)品編目,這里不同產(chǎn)品屬性數(shù)目非常多,包括:大小、顏色 、重量、長(zhǎng)度、高度、原料、款式、編織方法、伏特、決議、放水以及無(wú)止境的其它屬性。對(duì) 于任何產(chǎn)品,只和這些屬性的子集相關(guān)。一個(gè)可能的關(guān)系型方法是存儲(chǔ)這些數(shù)據(jù)時(shí)一個(gè)屬性一 列,這意味著表中包含 NULL 值得單元占非常大的比例。這是不期望的并且是低效率的。對(duì)這 些稀疏數(shù)據(jù)的另一個(gè)不同的關(guān)系型方法是一個(gè)有 3 列的表,對(duì)每個(gè)產(chǎn)品 ID 存儲(chǔ)了幾對(duì)名字 / 值。這意味著屬性的名字不是列名不過(guò)是在 VARCHAR 列中的值。這使得關(guān)系型數(shù)據(jù)不能精 確的估計(jì)可選約束和生成一個(gè)有效的查詢計(jì)劃。要定義并執(zhí)行一個(gè)約束同樣非常困難,比如對(duì) 一個(gè)特定屬性的唯一性約束。
XML 數(shù)據(jù)解決方案:XML 的美妙之處就是元素和屬性是可選的,例如,如果不需要應(yīng)用一 個(gè)特定的產(chǎn)品他們完全可以省略。無(wú)論是 NULL 值還是名稱以及值都不需要。 XML 模式可以 定義非常多的可選元素,卻對(duì)所有對(duì)象只使用它們中的一部分。在一個(gè)關(guān)系型表中每一行必須 有相同的列, XML 列中的 XML 文檔每一行可以有不同的元素。同樣,如果這個(gè)元素只有很小 的百分比,這個(gè)可選元素的 XML 索引可能非常小。這對(duì)每一行都有嚴(yán)格輸入的關(guān)系型索引的 一個(gè)很明顯的優(yōu)勢(shì)。
當(dāng)數(shù)據(jù)需要交換時(shí)
關(guān)系數(shù)據(jù)的問(wèn)題:如果你從關(guān)系表中導(dǎo)出一批記錄并把它們發(fā)送到另外一個(gè)應(yīng)用程序或組 織中,接收者不能在沒(méi)有額外數(shù)據(jù)來(lái)描述這一列的情況下解釋數(shù)據(jù)。如果你的關(guān)系模式從你上 次發(fā)送數(shù)據(jù)開始已經(jīng)改變的情況下,尤其如此。
XML 數(shù)據(jù)解決方案:XML 是自描述數(shù)據(jù)。 XML 標(biāo)簽是描述它們嵌套值的元數(shù)據(jù)。
DB2 pureXML 超過(guò)其它存儲(chǔ)選項(xiàng)的優(yōu)勢(shì)
因?yàn)?XML 已經(jīng)日益變成企業(yè)運(yùn)營(yíng)的關(guān)鍵,XML 文檔是一種資產(chǎn)共享、保持、搜索、保護(hù)和 更新并保持完全的事務(wù)一致性?;谒挠猛?,XML 數(shù)據(jù)也可能需要與其它數(shù)據(jù)進(jìn)行轉(zhuǎn)換、審 計(jì)和整合。為了達(dá)到這些要求,把 XML 數(shù)據(jù)在 DB2 數(shù)據(jù)庫(kù)中存成自然層次格式,這有很多好 處,包括:
◆注意 XML 數(shù)據(jù)的內(nèi)部結(jié)構(gòu)。這對(duì)在數(shù)據(jù)庫(kù)中以字符或二進(jìn)制大對(duì)象(CLIBs 或 BLOBs) 的形式來(lái)存儲(chǔ) XML 文檔具有優(yōu)勢(shì)。準(zhǔn)確的說(shuō),你可以很容易使用 XQuery、XPath 和 SQL/XML 利用 XML 結(jié)構(gòu)來(lái)查詢 XML 數(shù)據(jù),而且你可以通過(guò)對(duì) XML 數(shù)據(jù)創(chuàng)建索引來(lái)提高查詢性能。另 外,你可以很容易的使用 SQL、XQuery 和 XSLT 來(lái)更新、轉(zhuǎn)換并發(fā)布 XML 數(shù)據(jù)。
◆維護(hù) XML 數(shù)據(jù)的層次和靈活的性質(zhì)。這在分解(切割)XML 文檔到關(guān)系型表中,在這里 管理員映射 XML 元素和屬性到關(guān)系列中。在分解后,XML 文檔之被存儲(chǔ)在這些表中并且沒(méi)有 最初的標(biāo)簽。分解常常需要大量的表,而且實(shí)際使用中非常復(fù)雜。查詢分解后的 XML 文檔可 能需要復(fù)雜的 SQL 連接,這很難開發(fā)和調(diào)試。改變 XML 模式常常會(huì)破壞對(duì)關(guān)系數(shù)據(jù)庫(kù)模式的 映射。這會(huì)使維護(hù)變得昂貴和耗時(shí),并違背了出于靈活性而選擇 XML 的初衷。這也是為什么 DB2 pureXML 允許你適應(yīng)一個(gè) XML 列來(lái)存儲(chǔ)和查詢基于不同 XML 模式的 XML 文檔,或一個(gè) XML 模式的不同版本。
◆在一個(gè)數(shù)據(jù)庫(kù)中整合 XML 文檔和關(guān)系數(shù)據(jù)。這比在兩個(gè)數(shù)據(jù)庫(kù)中分別存儲(chǔ)關(guān)系數(shù)據(jù)和 XML 文檔 -XML-only 數(shù)據(jù)庫(kù)更有優(yōu)勢(shì)。后者需要技巧和人力來(lái)操作并維護(hù)兩個(gè)數(shù)據(jù)庫(kù)系統(tǒng)而 不僅僅是一個(gè)。同樣,從兩個(gè)數(shù)據(jù)庫(kù)中聯(lián)合數(shù)據(jù),通常需要應(yīng)用程序有額外的邏輯,而這常常 很困難且效率低。當(dāng)你在一個(gè) DB2 數(shù)據(jù)庫(kù)中同時(shí)存儲(chǔ) XML 和關(guān)系數(shù)據(jù)時(shí),可以在查詢中聯(lián)合 兩種類型的數(shù)據(jù),甚至可以根據(jù)需要把一種轉(zhuǎn)數(shù)據(jù)換成另外一種。這樣做更加劃算而且比起使 用兩個(gè)不同的數(shù)據(jù)庫(kù),它提供了更好的性能。
DB2 pureXML 的最佳實(shí)踐:概述
DB2 pureXML 功能提供了在存儲(chǔ)、索引、驗(yàn)證和查詢 XML 數(shù)據(jù)上成熟的能力 – 并完全整 合了 DB2 關(guān)系型數(shù)據(jù)管理功能。本文描述了以有效并高效的方式使用 pureXML 的原則。本文 的目標(biāo)不是介紹 pureXML 功能或者它們?nèi)绾喂ぷ鳌O喾幢疚奶峁┝吮WC高性能 pureXML 的指 南,也示范了如何開發(fā) pureXML 功能來(lái)有效的解決特定的商業(yè)問(wèn)題。
我們使用一個(gè)現(xiàn)實(shí)世界的應(yīng)用程序場(chǎng)景來(lái)安排最佳實(shí)踐和本文中的例子。這是來(lái)自金融行 業(yè)的場(chǎng)景而且是基于 XML 格式的叫做 FpML(金融產(chǎn)品標(biāo)記語(yǔ)言)的“金融衍生交易”的交易 和管理。你不需要一個(gè)金融專家來(lái)理解這個(gè)場(chǎng)景。雖然我們只使用這個(gè)特定的場(chǎng)景,最佳實(shí)踐 同樣應(yīng)用到其它 XML 使用情況,比如 XML 表格處理、訂單管理系統(tǒng)、XML 在健康保健和電子 病歷,和其它情況
本文的主題是根據(jù)數(shù)據(jù)庫(kù)對(duì)象的生命周期粗略組織的。我們這個(gè)章節(jié)從查看應(yīng)用程序需要 的數(shù)據(jù)和表開始。然后我們討論 DB2 對(duì) XML 數(shù)據(jù)(第 4 章)的存儲(chǔ)選項(xiàng)。之后 , 第 5 章 提供了添加 XML 數(shù)據(jù)到 DB2 數(shù)據(jù)庫(kù)的竅門和技巧。在第 6 章我們提供了更有效查詢 XML 數(shù) 據(jù)的指南和例子。為了提高查詢性能,定義和使用 XML 索引的最佳實(shí)踐在第 7 章中進(jìn)行了介 紹。 XML 名稱空間和 XML 更新在第 8 章和第 9 章中分別有所討論。第 10 章和 11 章涵蓋 了對(duì)數(shù)據(jù)庫(kù)管理員(DBAs)以及應(yīng)用程序開發(fā)的附加的主題。最后,12 章以總結(jié)最重要的指 南作為結(jié)束。
簡(jiǎn)單場(chǎng)景:FpML 形式中的金融衍生交易
一個(gè)“金融衍生交易”是一個(gè)基于(起源于)其它一些金融資產(chǎn)的金融交易,比如股票、 指數(shù)、利率、流通、或其它的。在一個(gè)金融衍生交易中,根據(jù)影響底層資產(chǎn)的市場(chǎng)條件,當(dāng)事 人雙方同意交易現(xiàn)金。通常情況下,一方利用交易以減輕風(fēng)險(xiǎn);另外一方利用這個(gè)交易來(lái)獲得 立即的收入(通過(guò)費(fèi)用或額外費(fèi)用)或?qū)ξ磥?lái)市場(chǎng)情況將提供收益進(jìn)行投機(jī)。讓我們看一個(gè)例 子:
YourWord Investments 和 MyGlobal Back 達(dá)成了一個(gè)外匯兌換交易。他們商議在 10 月 25 號(hào) YourWord 將支付 71,900,000 人民幣給 MyGlobal,并且 MyGlobal 將支付 10,000,000 美元給 YourWorld 。如果 1 美元兌換人民幣從現(xiàn)在到 10 月 25 日其間低于 7.19,MyGlobal 將從這次交易中獲利 .MyGlobal 可能會(huì)使用這個(gè)交易來(lái)避免美元下降的風(fēng)險(xiǎn) 。 YourWorld 可以投機(jī)美元將增值,或從 MyGlobal 收取進(jìn)行交易的前期費(fèi)用。
衍生交易的奇妙之處是(a)有很多不同的類型和變化,(b)一個(gè)特定交易的狀態(tài)往往需 要單獨(dú)談判而且很復(fù)雜,(c)一個(gè)衍生交易的生命周期可以是從幾天到數(shù)年的范圍而且它們 的條件可以隨時(shí)間而改變。金融企業(yè)發(fā)現(xiàn)在定義一個(gè)可以捕捉到衍生交易高度變化標(biāo)準(zhǔn)的數(shù)據(jù) 格式時(shí)需要 XML 的靈活性和可擴(kuò)展性。結(jié)果就是,他們開發(fā)了 FpML 。 FpML 本質(zhì)上是定義 了 XML 元素和屬性如何用來(lái)描述金融衍生交易的一個(gè) XML 模式。 International Swaps and Derivatives Association, Inc (ISDA) 代表一個(gè)投資銀行組織管理 FpML 標(biāo)準(zhǔn)使市場(chǎng)在場(chǎng)外 進(jìn)行衍生交易。更多金融衍生交易和 FpML 的信息參考【 8 】和【 9 】。
樣本數(shù)據(jù)和表
本文的樣本數(shù)據(jù)庫(kù)由 3 個(gè)表組成,見(jiàn)清單 1。
清單 1. 定義樣本表
create table trades (tradeId integer, tradedoc XML); create table parties(partyInfo XML); create table currencies(symbol char(4), name varchar(30), USDvalue double, lastUpdated timestamp); |
所有的表定義和命令以使用樣本數(shù)據(jù)來(lái)填充它們,以及需要本文中顯示的其它語(yǔ)句可以在
TRADES 表包含 FpML 文檔和每個(gè)文檔的交易 ID 。每個(gè)交易文檔涉及兩個(gè)交易方使文檔中 用 PRTYID 元素的值。更多關(guān)于各個(gè)部分詳細(xì)信息都以 XML 格式存放在 PARTIES 表中。我們 可以從一個(gè) TRADES 和 PARTIES 之間的 XML 到 XML 連接中找到相關(guān)交易的詳細(xì)資料,反之 亦然。很多 FpML 交易通過(guò)標(biāo)記來(lái)引用具體貨幣。額外的貨幣信息在關(guān)系型中可以在 CURRENCIES 表中,如清單 2 所示。我們需要 XML 到關(guān)系型表的連接來(lái)把相關(guān)交易和貨幣信 息聯(lián)系起來(lái)。
清單 2. currency表中的內(nèi)容
SYMBOL NAME USDVALUE LASTUPDATED ------ ------------------------------ -------- ------------------- USD US Dollar 1.000 2008-02-05-15.15.57 EUR Euro 1.460 2008-02-05-15.15.59 GBP Great Britain Pounds 1.960 2008-02-05-15.16.23 JPY Japanese Yen 0.009 2008-02-05-15.15.53 CNY Chinese Yuan (Renminbi, RMB) 7.190 2008-02-05- 15.16.13 |
我們的 PARTIES 表包含 3 行,每一行有一個(gè) XML 文檔。他們描述了與金融衍生交易的例 子有關(guān)的各參與方。下表顯示 3 個(gè)締約方的 XML 文檔:
清單 3. Parties 表的內(nèi)容
<Party> <PtyID>510026</PtyID> <ShortName>MIB</ShortName> <Name>MyGlobal International Bank</Name> <Status>Active</Status> <Address> <Street>498 Wall Street</Street> <City>New York</City> <Country>USA</Country> </Address> <Rating> <RatingDate>2006-05-16</RatingDate> <RatingValue>Baa1</RatingValue> </Rating> </Party> <Party> <PtyID>67781</PtyID> <ShortName>NVB</ShortName> <Name>National Village Bank</Name> <Status>Active</Status> <Address> <Street>1805 Back Street</Street> <PostalCode>EC3M 4TD</PostalCode> <City>London</City> <Country>UK</Country> </Address> <Rating> <RatingDate>2006-06-01</RatingDate> <RatingValue>Aa</RatingValue> </Rating> </Party> <Party> <PtyID>99114</PtyID> <ShortName>YWI</ShortName> <Name>YourWorld Investments</Name> <Status>Active</Status> <Address> <POBox>98765</POBox> <PostalCode>100027</PostalCode> <City>Beijing</City> <Country>China</Country> </Address> <Rating> <RatingDate>2007-01-15</RatingDate> <RatingValue>Aaa</RatingValue> </Rating> <Rating> <RatingDate>2005-04-21</RatingDate> <RatingValue>Aa</RatingValue> </Rating> </Party>
清單 4 顯示 FpML 文檔表現(xiàn)先前我們描述過(guò)的 YourWorld Investment 和 MyGlobal International Bank 之間的貨幣兌換交易。交易以 tradeHeader 元素開始,以“ party1 ”和“ party2 ”標(biāo)記兩個(gè)交易方,并把他們和他們的交易 IDs 以及交易日期聯(lián)系起 來(lái)。在 FpML 文檔的最底部,“ party1 ”和“ party2 ”是映射到具體的標(biāo)識(shí)符“ 510026 ”和“ 99114 ”他們引用 PARTIES 表中交易方信息。交易具體的主要部分在 fxSingleLeg 元素中。 FX 是聲明外匯交易,有兩個(gè)元素叫 exchangedCurrency1 和 exchangedCurrency1 。第一個(gè)表示 YourWorld 支付 CNY 71,900,000 給 MyGlobal,第二個(gè)顯示 MyGlobal 支付 10,000,000 給 YourWorld.
為了更清楚的表示,我們已經(jīng)從 FpML 樣本數(shù)據(jù)刪除了所有名稱空間。我們將在本文后面 部分重新訪問(wèn)名稱空間。
清單 4. FpML格式中的一個(gè)利率衍生工具
<FpML> <trade> <tradeHeader> <partyTradeIdentifier> <partyReference href="party1"/> <tradeId tradeIdScheme="http://www.MyGlobal.com/trade-id">MyGlobal941</tradeId> </partyTradeIdentifier> <partyTradeIdentifier> <partyReference href="party2"/> <tradeId tradeIdScheme="http://www.YourWorld.com/trade-id">YWI0089</tradeId> </partyTradeIdentifier> <tradeDate>2001-10-23Z</tradeDate> </tradeHeader> <fxSingleLeg> <exchangedCurrency1> <payerPartyReference href="party2"/> <receiverPartyReference href="party1"/> <paymentAmount> <currency>CNY</currency> <amount>71900000</amount> </paymentAmount> </exchangedCurrency1> <exchangedCurrency2> <payerPartyReference href="party1"/> <receiverPartyReference href="party2"/> <paymentAmount> <currency>USD</currency> <amount>10000000</amount> </paymentAmount> </exchangedCurrency2> <valueDate>2001-10-25Z</valueDate> <exchangeRate> <quotedCurrencyPair> <currency1>CNY</currency1> <currency2>USD</currency2> <quoteBasis>Currency2PerCurrency1</quoteBasis> </quotedCurrencyPair> <rate>7.91</rate> </exchangeRate> </fxSingleLeg> </trade> <party id="party1"> <partyId>510026</partyId> </party> <party id="party2"> <partyId>99114</partyId> </party> </FpML> |
清單 5 顯示一個(gè) FpML 文檔的其它例子。這個(gè)文檔是一個(gè) “隔夜拆借存款”。 National Village Bank 對(duì)來(lái)自于 YourWorld Investment 的 25,000,000 歐元存款支付 3% 固定貸款 利率。
清單 5. 在 FpML 中的一個(gè)“隔夜拆借存款”例子
<FpML> <trade> <tradeHeader> <partyTradeIdentifier> <partyReference href="party1"/> <tradeId tradeIdScheme="http://www.YourWorld.com/trade-id">YWI7623</tradeId> </partyTradeIdentifier> <partyTradeIdentifier> <partyReference href="party2"/> <tradeId tradeIdScheme="http://www.NationalV.com/swaps/trade-id">69197</tradeId> </partyTradeIdentifier> <tradeDate>2002-02-14Z</tradeDate> </tradeHeader> <termDeposit> <productType>Overnight Term Deposit</productType> <initialPayerReference href="party1"/> <initialReceiverReference href="party2"/> <startDate>2002-03-15Z</startDate> <maturityDate>2002-03-16Z</maturityDate> <dayCountFraction>ACT/360</dayCountFraction> <principal> <currency>GBP</currency> <amount>35000000.00</amount> </principal> <fixedRate>0.03</fixedRate> </termDeposit> </trade> <party id="party1"> <partyId>99114</partyId> </party> <party id="party2"> <partyId>67781</partyId> </party> </FpML>
這兩個(gè)列子(清單 4 和清單 5)讓你對(duì) FpML 衍生數(shù)據(jù)有了一個(gè)概念。 FpML 模式定義了 大約 1800 個(gè)不同的 XML 元素和超過(guò) 600 種類型。任何一個(gè)實(shí)例文檔都只包含了其中的一部 分。然而,一個(gè)關(guān)系型數(shù)據(jù)庫(kù)模式在沒(méi)有 XML 列的情況下需要至少 400 到 500 個(gè)表才能顯 示任意可能的 FpML 文檔。這是令人恐怖的復(fù)雜度,而且通常被認(rèn)為不可管理。這是為什么 XML 是必須的。
OurTRADES 表包含了 5 個(gè) FpML 文檔,包括上面的兩個(gè)。完整的數(shù)據(jù)樣例可以在一個(gè) DB2 命令行(CLP)腳本中下載。
為 XML 存儲(chǔ)選擇正確的存儲(chǔ)選項(xiàng)
正確的配置存儲(chǔ)選項(xiàng)對(duì)于最大化 DB2 數(shù)據(jù)庫(kù)性能非常重要。在這個(gè)章節(jié),我們討論數(shù)據(jù)庫(kù) 的表空間類型、XML 數(shù)據(jù)在數(shù)據(jù)庫(kù)中存儲(chǔ)的頁(yè)面大小、以及在數(shù)據(jù)庫(kù)中存儲(chǔ) XML 數(shù)據(jù)的方法 。
提示:在 DB2 9.5 中 XML 在一個(gè) DB2 表空間中消耗的存儲(chǔ)空間是原始 XML 數(shù)據(jù)以文本 格式在操作系統(tǒng)中占用空間的 0.7 到 1.5 倍。要得到更精確的評(píng)估,比如插入 1000 個(gè)有代 表性的文檔到一個(gè)空表中并抓取一個(gè) DB2 表的快照來(lái)查看這個(gè)表已使用的頁(yè)數(shù)。
為 XML 數(shù)據(jù)選擇表空間類型和頁(yè)大小
數(shù)據(jù)庫(kù)管理表空間(DMS)提供了比系統(tǒng)管理 ( 操作系統(tǒng)管理 ) 表空間(SMS)更高的性 能。這對(duì)關(guān)系型數(shù)據(jù)尤其如此,對(duì) XML 讀寫訪問(wèn)上更是如此。最新創(chuàng)建的表空間默認(rèn)是 DMS 。推薦使用 DMS 表空間與自動(dòng)存儲(chǔ),所以 DMS 容器根據(jù)需要增長(zhǎng)而不需要人工干預(yù)。如果一 個(gè) XML 文檔太大而不能放入這個(gè)表空間的單個(gè)頁(yè)面中,DB2 會(huì)把這個(gè)文檔分別存入多個(gè)域中 ,這樣就存入多個(gè)頁(yè)面中了。很顯然你的應(yīng)用程序可以讓 DB2 處理最大 2G 的 XML 文檔。
通常,一個(gè)文檔的域的數(shù)目越低性能越好,尤其對(duì)于插入和讀取整個(gè)文檔。如果文檔不能 放入一個(gè)頁(yè)面中,每個(gè)文檔拆分的數(shù)目取決于頁(yè)大?。?KB,8KB,16KB 或 32KB)。你的表空 間頁(yè)大小越大,每個(gè)文檔可能被拆分的數(shù)目就越小。例如,假設(shè)一個(gè)文檔跨了 40 個(gè) 4k 頁(yè)。 相同的文檔在 8KB 表空間中可能只需要 20 頁(yè),或 10 個(gè) 16KB 頁(yè),5 個(gè) 32KB 頁(yè),因?yàn)槎?個(gè)小的文檔可以存儲(chǔ)在一個(gè)頁(yè)面中所以不會(huì)有空間浪費(fèi)。
提示:大多數(shù) XML 應(yīng)用程序最好在 16KB 和 32KB 頁(yè)面上運(yùn)行。如果大多數(shù)文檔非常?。?比如小于 4KB)16KB 頁(yè)面可以提供良好的性能,因此在一個(gè)頁(yè)面中存放多個(gè)文檔。更大的文 檔最好使用 32KB 頁(yè)面保存。對(duì)于我們的 FpML 場(chǎng)景,需要 16KB 頁(yè)面。如果你對(duì)關(guān)系型數(shù)據(jù) 和 XML 數(shù)據(jù)使用同樣的頁(yè)面,或者數(shù)據(jù)和索引也存放在相同頁(yè)面,16KB 頁(yè)面同樣可以做很好 的折衷,而且你會(huì)發(fā)現(xiàn) 32KB 頁(yè)面對(duì)關(guān)系數(shù)據(jù)和索引有的訪問(wèn)有負(fù)面影響。這這種情況下,你 可以考慮使用其它的頁(yè)面大小。
XML 和關(guān)系數(shù)據(jù)使用不同的表空間和頁(yè)大小
在清單 1 中的 CREATE TABLE 語(yǔ)句把表中的 XML 數(shù)據(jù)和關(guān)系型數(shù)據(jù)都存在了相同表空間 里。這意味著它們使用相同的頁(yè)面大小和緩沖池。在表空間中,關(guān)系數(shù)據(jù)是存儲(chǔ)在基本數(shù)據(jù)頁(yè) 面上,同時(shí) XML 數(shù)據(jù)是存在另外的 XML 數(shù)據(jù)域(XDA)里的頁(yè)面中。這是因?yàn)榫拖翊髮?duì)象 (LOBs),XML 文檔可能很大,不能放在表的一個(gè)數(shù)據(jù)頁(yè)中的一行里。這種默認(rèn)的規(guī)劃對(duì)于大 多數(shù)應(yīng)用場(chǎng)景提供了很好的性能。這個(gè)選項(xiàng),叫做“基礎(chǔ)內(nèi)嵌表”,將在下面章節(jié)中進(jìn)行介紹 ,你應(yīng)該對(duì)在同時(shí)存儲(chǔ) XML 文檔和關(guān)系型數(shù)據(jù)的數(shù)據(jù)頁(yè)面上選擇這個(gè)選項(xiàng)。然而,默認(rèn)情況 下關(guān)系型數(shù)據(jù)和 XML 數(shù)據(jù)是分開存儲(chǔ)的。
提示:如果你已經(jīng)完成了性能分析并發(fā)現(xiàn)你需要對(duì) XML 數(shù)據(jù)使用一個(gè)大頁(yè)面,而關(guān)系型數(shù) 據(jù)和索引需要小頁(yè)面,你可以使用不同的表空間來(lái)滿足它們。在你定義一個(gè)表的時(shí)候,你可以 指定“長(zhǎng)型”數(shù)據(jù)到一個(gè)有不同頁(yè)面大小的單獨(dú)的表空間。長(zhǎng)型數(shù)據(jù)包括 LOB 和 XML 數(shù)據(jù)。
下面的例子定義了兩個(gè)緩沖池和兩個(gè)表空間,緩沖池和表空間都分別有 4KB 頁(yè)和 32KB 頁(yè) 。注意,一個(gè)表空間總是需要一個(gè)匹配頁(yè)大小的緩沖池。我們的 3 個(gè)表所在的 relData 表空 間是 4KB 頁(yè)面。所有的列都存在這個(gè)表空間中,除了 XML 列。它們被存儲(chǔ)在 xmlData 表空 間的 32KB 頁(yè)面中。
清單 6. XML 和關(guān)系型數(shù)據(jù)存放在不同頁(yè)大小的表空間中的例子
create bufferpool bp4k pagesize 4k; create bufferpool bp32k pagesize 32k; create tablespace relData pagesize 4K bufferpool bp4k; create tablespace xmlData pagesize 32K bufferpool bp32k; create table trades (tradeId integer, tradedoc XML) in relData long in xmlData; create table parties(partyInfo XML) in relData long in xmlData; create table currencies(symbol char(4), name varchar(30), USDvalue double, lastUpdated timestamp) in relData; |
除非明確指定,新表空間都是創(chuàng)建為有大行 IDs 的 DMS 表空間。這意味著一個(gè) 4KB 頁(yè)大 小的表空間可以存儲(chǔ)多達(dá) 2TB 的數(shù)據(jù)并支持在 32KB 大小的頁(yè)面存放 2335 行記錄。
內(nèi)置并壓縮 XML 數(shù) 據(jù)
DB2 VERSION 9.5 也允許你“內(nèi)置”存儲(chǔ) XML 數(shù)據(jù)并壓縮。
提示:如果某些或你的所有 XML 文檔都足夠小,就可以在基礎(chǔ)表頁(yè)面里把它們放進(jìn)相應(yīng)的 行對(duì)象中,就可以把 XML 數(shù)據(jù)內(nèi)置到關(guān)系行中。這樣做也提供了對(duì) XML 數(shù)據(jù)的更直接訪問(wèn)并 避免了重定向到 XDA 對(duì)象中。如果在 XML 列中的一些文檔仍然太大而不能內(nèi)置,它們通常被 存儲(chǔ)在“外部” XDA 對(duì)象中。內(nèi)置可以顯著的減少域索引,因?yàn)榍度胛臋n不需要任何域索引 輸入。它們總是組成一個(gè)單獨(dú)的內(nèi)置域。嵌入文檔也可以使用普通的 DB2 深度行壓縮來(lái)壓縮 ,如圖 7 所示:
清單 7. 嵌入及壓縮 XML 存儲(chǔ)的定義
create table trades (tradeId integer, tradedoc XML in line length 16000) in relData compress yes; |
在這個(gè)例子中,XML 列使用 INLINE LENGTH 16000 定義 . 這意味著任何等于或小于 16000 字節(jié)的文檔都將以嵌入方式存儲(chǔ)。這里指定的大小是參照 XML 在 DB2 中解析后的大小 ,不是 XML 文本文檔在你文件系統(tǒng)中的大小。嵌入長(zhǎng)度必須小于頁(yè)面大小減去本頁(yè)中其它列 之后的大小。
提示:通常你應(yīng)該尋求嵌入最多或全部文檔。如果你在表中只有一個(gè) XML 字段,達(dá)到這個(gè) 目的的最簡(jiǎn)單的方法是設(shè)置內(nèi)置長(zhǎng)度為這一行中的最大可能值。 DB2 不會(huì)允許你定義一個(gè)太 長(zhǎng)的嵌入長(zhǎng)度。選擇一個(gè)較大的嵌入長(zhǎng)度將不會(huì)浪費(fèi)任何空間,因?yàn)橹挥写鎯?chǔ)文檔真正需要的 空間才會(huì)被使用。然而,指定一個(gè)較大的內(nèi)置長(zhǎng)度可以阻止你在以后添加新列到這個(gè)表中。
嵌入 XML 數(shù)據(jù)總是以這個(gè)表的關(guān)系型列存放在相同表空間中,并且不能存在一個(gè)有不同頁(yè) 面大小的其它表空間中。
因?yàn)槲覀兊臉颖颈硎径x時(shí)指定了 COMPRESS YES,關(guān)系數(shù)據(jù)和內(nèi)置 XML 文檔會(huì)被壓縮。 以 60%-70% 的比例壓縮內(nèi)置 XML 數(shù)據(jù)并不罕見(jiàn)。下面的語(yǔ)句可以用來(lái)檢查 PRODUCT 表的壓 縮比率:
清單 8. 用來(lái)檢查數(shù)據(jù)壓縮率的管理函數(shù)
select tabname,pages_saved_percent,bytes_saved_percent from table(sysproc.admin_get_tab_compress_info('MYSCHEMA','TRADES','ESTIMATE')) as t |
提示:
如果你的系統(tǒng)是 I/O 限制而非 CPU 限制,壓縮 XML 數(shù)據(jù)可以提供極大的性能提升。然而 ,要注意內(nèi)置文檔會(huì)顯著的增加在你頁(yè)面中的行的大小。這反過(guò)來(lái)減少了每一頁(yè)中的行數(shù)。只 訪問(wèn)表中關(guān)系列的查詢現(xiàn)在需要讀取比沒(méi)有嵌入文檔要多很多的頁(yè)面。這會(huì)造成比沒(méi)有使用 XML 嵌入文檔情況下更多的 I/O 以及更低的查詢性能。如果你的查詢通常總是查詢 XML 列, 那么對(duì)你沒(méi)有影響,然而,如果你有很多不涉及 XML 列的查詢,你應(yīng)或許不應(yīng)該選擇“內(nèi)置 ”存儲(chǔ)。
【編輯推薦】