葉云霜,林偉華,劉福江,董曉瑩
(中國地質(zhì)大學(武漢) 信息工程學院,湖北 武漢 430000)
對于海量空間數(shù)據(jù)的高效存儲、管理等問題的研究,已經(jīng)發(fā)展了近半個世紀,國內(nèi)外學者已經(jīng)做了大量的研究工作,并取得了顯著成果。如面向?qū)ο蟮年P系型數(shù)據(jù)庫,主要基于關系型數(shù)據(jù)庫開發(fā)支持空間數(shù)據(jù)管理的擴展模塊。再有就是空間數(shù)據(jù)引擎中間件技術,使得空間數(shù)據(jù)可以用關系型數(shù)據(jù)庫進行存儲并用于GIS平臺上的各種復雜查詢與分析,能夠與特定GIS平臺緊密結(jié)合,空間處理效率更高。后來,Thomas Kyte[1](2005)詳細地闡述了關系數(shù)據(jù)庫中分區(qū)的概念、策略、擴展及索引分區(qū);目前關系數(shù)據(jù)庫中的分區(qū)技術在管理關系型數(shù)據(jù)中應用較廣泛,如徐暢等(2017)采用影像獲取難易程度分區(qū)及統(tǒng)籌學的思想,設計第一次全國地理國情普查標準時點核準影像獲取及覆蓋方案,實現(xiàn)對普查標準時點核準遙感影像任務區(qū)的優(yōu)化覆蓋[2]。而其在空間數(shù)據(jù)管理中應用較少,胡小彭等(2017)提出了一種基于分區(qū)存儲技術的空間數(shù)據(jù)入庫解決方案,并應用到安徽省地理國情普查中,驗證了分區(qū)存儲數(shù)據(jù)庫的讀取效率明顯高于非分區(qū)存儲數(shù)據(jù)庫[3]。張小文等(2011)以SuperMap地理信息系統(tǒng)控件為基礎,設計與實現(xiàn)了分區(qū)技術的靈活管理,與預報員交互的預報流程和預報結(jié)果的Web發(fā)布等功能[4]。但是,當矢量圖層要素量達到10萬條時,數(shù)據(jù)庫查詢性急劇下降,管理負擔增大。如何利用關系型數(shù)據(jù)庫的分區(qū)技術管理大容量的空間數(shù)據(jù)尤其是要素量達到千萬級別以上的矢量圖層數(shù)據(jù),仍是困擾廣大空間數(shù)據(jù)用戶的主要問題之一。
因此,文中采用不同管理方式、不同分區(qū)粒度、不同索引方式的分區(qū)技術來系統(tǒng)管理空間大圖層數(shù)據(jù),并通過實驗驗證分區(qū)技術對海量要素圖層數(shù)據(jù)的存儲具有優(yōu)化作用。
數(shù)據(jù)分區(qū)技術是按照約定的方式從物理上劃分庫表結(jié)構(gòu),但分區(qū)表中的每個分區(qū)在邏輯上是獨立的。如果選擇合適的數(shù)據(jù)分區(qū)策略,會大大加快數(shù)據(jù)的查詢速度[5-7]。
由于分區(qū)表不能通過ArcGIS等GIS平臺創(chuàng)建,因此需要先在數(shù)據(jù)庫中建好表結(jié)構(gòu)。構(gòu)建過程如下:
(1)在GIS平臺創(chuàng)建企業(yè)級地理空間數(shù)據(jù)庫(create enterprise geodatabase),創(chuàng)建SDE用戶、SDE表空間、安裝SDE Repository(SDE資料檔案庫,包含空間數(shù)據(jù)字典和ArcSDE軟件程序包);
(2)在關系型數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)存儲所用表空間、用戶并授權(quán);
(3)在關系型數(shù)據(jù)庫中創(chuàng)建分區(qū)表,并創(chuàng)建全局空間索引;
(4)在關系型數(shù)據(jù)庫中創(chuàng)建分區(qū)表,并創(chuàng)建本地空間索引;
(5)按設置好的規(guī)則執(zhí)行數(shù)據(jù)存儲。
將數(shù)據(jù)按照分區(qū)進行組織后,數(shù)據(jù)在邏輯上是同一張表,查詢時表名沒有區(qū)別,但實際數(shù)據(jù)存放在不同的分區(qū)中,可能存放于不同的服務器等存儲設備上。在地圖窗口進行查詢?yōu)g覽時是整張表同時展示在地圖窗口中,那么在執(zhí)行空間查詢?nèi)缈蜻x時數(shù)據(jù)庫可能同時需要訪問多個分區(qū),需要考慮是否先找到與感興趣區(qū)域相交的分區(qū)再進行查詢;再到分區(qū)中執(zhí)行相關查詢返回需要的結(jié)果,或者直接就只使用感興趣區(qū)域作為查詢條件。分區(qū)的算法有3種,分別命名為part_query1、part_query2、part_query3,其偽代碼分別為:
(1)part_query1。
根據(jù)slfw(矢量范圍底圖),判斷BR(boundary rectangle,范圍矩形)與哪些矢量底圖相交,得到相交矢量范圍列表slfw_lists。將slfw_lists作為查詢條件之一,SQL語句樣式如下:
“select shape from part_table t where slfwdm in (slfw_lists) sdo_filter (t.shape,BR))”;
(2)part_query2。
將得到的矢量范圍列表slfw_lists的過程內(nèi)嵌到SQL語句里,其樣式如下:
“select shape from part_table t where slfwdm in (select slfwdm from slfw t where sdo_filter(t.shape,BR));sdo_filter(t.shape,BR))”;
(3)part_query3。
僅使用BR作為查詢條件,SQL語句樣式如下:
Select shape frompart_table t where sdo_filter(t.shape,BR));
其中,part_query1、part_query2都是先用矢量范圍底圖與范圍矩形進行相交查詢獲取目標要素所在的矢量范圍代碼,然后再到圖層元數(shù)據(jù)表中根據(jù)矢量范圍代碼獲取目標要素所在子表名,然后再到相應的子表中做精準查找。而part_query1和part_query2的區(qū)別在于,part_query2同樣將表示在各個子表中查找的sql語句保存到一個總的sql語句中只執(zhí)行一次在分表中的精準查找,嘗試以此來提高效率;part_query3則是利用分區(qū)表向上只有一個圖名、邏輯上不分離的特性不考慮子表直接做大表與BR的相交查詢得到目標結(jié)果要素。
1.3.1 技術流程
最優(yōu)分區(qū)方法的確定是通過采用不同分區(qū)機制來確立的。首先對存儲海量要素圖層數(shù)據(jù)的數(shù)據(jù)庫大表進行分區(qū)拆分。其次,深入研究應用分區(qū)技術管理海量要素圖層數(shù)據(jù)時的具體問題:分區(qū)鍵的確定、不同分區(qū)粒度的選擇、空間索引的建立。然后,利用事件追蹤查詢時數(shù)據(jù)庫內(nèi)部的操作,結(jié)合前面的實驗結(jié)果進一步研究不同的分區(qū)粒度及索引方式對查詢效率的影響。最后,確定大表拆分方案。技術流程如圖1所示。
1.3.2 分區(qū)鍵的選擇
分區(qū)時需要選擇一個屬性項作為分區(qū)作用對象來完成表的分區(qū),即分區(qū)鍵。分區(qū)鍵的選擇需要考慮被訪問次數(shù)最多的那些屬性字段(例如屬性字段“用途”訪問次數(shù)最多,則把用途相似的要素放在同一分區(qū)中)、歸檔頻率(歸檔數(shù)據(jù)顯然使用時間字段實現(xiàn)范圍分區(qū)是較好的選擇[8-10])等。
圖1 技術流程
1.3.3 分區(qū)粒度的選擇
在確定了分區(qū)鍵之后,就需要考慮分區(qū)粒度的選擇[11]。分區(qū)粒度的選擇沒有固定的模式或者原則,比如:便于系統(tǒng)維護考慮的是多大的分區(qū)能夠維護方便,比如銀行系統(tǒng)的用戶信息存儲,按市分區(qū)比按省分區(qū)后期維護方便,則采用用戶信息存儲按市分區(qū);便于歸檔考慮的是歸檔頻率,比如對小區(qū)用戶管理,按單元樓歸檔比按門牌號進行歸檔方便,不同目的采用的分區(qū)方法不同。
1.3.4 索引機制的構(gòu)建
在分區(qū)之后再對數(shù)據(jù)創(chuàng)建索引雙管齊下能夠快速提提升查詢檢索效率[12-14]。關系型數(shù)據(jù)庫中管理空間數(shù)據(jù)使用較多的是四叉樹索引和R樹索引。與四叉樹索引相比,R樹索引更自動智能,具有較高的存儲利用率。
文中測試環(huán)境的硬件設備包括GIS應用服務器、數(shù)據(jù)庫服務器、測試機。軟件設備包括Windows Server 2008、Arcgis[15]服務器10.2.2版本、Linux[16]操作系統(tǒng)、Oracle[17-18]關系數(shù)據(jù)庫11g、旗艦版Microsoft Windows7 、IE測試瀏覽器。
為了驗證數(shù)據(jù)大表拆分方案分區(qū)在包含海量要素的大圖層(一般值要素量超過200萬條圖層)上的適用性,以貴州省87個縣的地類圖斑數(shù)據(jù)為研究對象,該地類圖斑圖層數(shù)據(jù)包含的要素總數(shù)為6 695 554條。查詢時隨機從貴州省省域內(nèi)選擇3個樣本范圍,作為空間查詢時的查詢范圍。將6*3個樣本范圍分別與3個實驗主體進行空間查詢運算,記錄每次查詢的耗時。
文中研究的海量要素圖層,在其應用場景中,當在地圖窗口中對這些矢量數(shù)據(jù)進行瀏覽或查詢時,多數(shù)情況下其本質(zhì)為對集中連片要素集合的訪問,這些集中連片要素地理位置很接近,通常情況下歸屬于一個或幾個行政單元。因此,考慮到若能夠在進行矢量數(shù)據(jù)查詢時,根據(jù)行政區(qū)化過濾和縮小數(shù)據(jù)庫中檢索范圍,則能夠起到訪問較少數(shù)據(jù)而較快找到滿足條件數(shù)據(jù)的效果;另外,在多用戶并發(fā)訪問場景下,同一時刻不同用戶訪問的數(shù)據(jù)通常是不同地理范圍的,那么若不同地理范圍的數(shù)據(jù)存放在不同的存儲設備上,則能夠起到IO負載均衡的效果。因此,文中選擇以行政區(qū)代碼作為分區(qū)鍵、將相同行政區(qū)代碼的要素存放在同一個分區(qū)中的分區(qū)策略。
以地類圖斑為測試數(shù)據(jù),設計實驗測試如何選擇分區(qū)粒度。國內(nèi)行政區(qū)劃大致可分為:國、省、市、縣、鄉(xiāng)鎮(zhèn)五個級別,而分區(qū)是將分區(qū)后的數(shù)據(jù)分配單獨的段,國內(nèi)有40 446個鄉(xiāng)鎮(zhèn)級別的區(qū)域,若將數(shù)據(jù)分成40 446個,會導致分區(qū)數(shù)據(jù)過于分散、細致,數(shù)據(jù)的管理和查詢功能性能降低,驗證該種分區(qū)方案必要性不高。因此,文中主要考慮驗證“按省分區(qū)”、“按市分區(qū)”、“按縣分區(qū)”這三種分區(qū)方式的效率。
為了模擬真實應用場景,提高查詢檢索效率,在對數(shù)據(jù)進行分區(qū)之后也為其創(chuàng)建空間索引,空間索引的類型均選擇適合空間對象的R樹索引。與表分區(qū)一樣,索引也可以分區(qū),索引分區(qū)方法有本地分區(qū)索引和全局分區(qū)索引。本地分區(qū)索引指的是每個表分區(qū)都有一個索引分區(qū),而且只索引該表分區(qū),是一對一的關系。全局分區(qū)索引指的是索引存儲時整體按照范圍或者散列進行分區(qū)。此時,一個索引分區(qū)可能指向任何(和所有)表分區(qū),一個表分區(qū)的數(shù)據(jù)也可能存在于任何一個索引分區(qū)。此外,全局索引還可以不進行分區(qū),整體存儲在一個分區(qū)中。
2.3.1 不同分區(qū)方案查詢效率分析
首先,為得到不同分區(qū)方案下的查詢效率,將全國范圍內(nèi)的分別為千萬級和億級要素量的兩組數(shù)據(jù)分別按照“未分區(qū)+空間索引”、“按縣分區(qū)+本地空間索引”、“按縣分區(qū)+全局空間索引”、“按市分區(qū)+本地空間索引”、“按市分區(qū)+全局空間索引”、“按省分區(qū)+本地空間索引”、“按省分區(qū)+全局空間索引”分為七組。對于分組后的數(shù)據(jù)分別選取1∶500、1∶2 000、1∶10 000、1∶25 000、1∶50 000、1∶100 000六個覆蓋常用的大中小查詢場景,針對全局和本地空間索引根據(jù)上述結(jié)論分別采用適合其的part_query3(全局空間索引)和part_query2(本地空間索引)算法在全國范圍內(nèi)隨機生成各比例尺的查詢范圍,在Oracle數(shù)據(jù)庫中進行空間查詢,記錄查詢耗時。最后,采用百分位數(shù)回歸法[19]計算平均值和第100位百分位數(shù),結(jié)果如表1~表4所示。并對查詢結(jié)果做歸一化處理(用不同分區(qū)方案的查詢統(tǒng)計結(jié)果與當前比例尺下查詢耗時最低的值的比值表示)。
表1 千萬級要素量下不同分區(qū)方案查詢效率平均值 s
注:表中字體加粗部分圈出的為該行的最小值,表示該比例尺下查詢耗時最短。
對查詢效率進行排序:按縣+全局>按省+全局>未分區(qū)>按市+全局>按省+本地>按市+本地>按縣+本地。
表2 千萬級要素量下不同分區(qū)方案查詢效率第100百分位數(shù) s
注:表中字體加粗部分圈出的為該行的最小值,表示該比例尺下查詢耗時最短。
對查詢效率進行排序:按縣+全局>按省+全局>按市+全局>未分區(qū)>按省+本地>按市+本地>按縣+本地。
表3 億級要素量下不同分區(qū)方案查詢效率平均值 s
注:表中字體加粗部分圈出的為該行的最小值,表示該比例尺下查詢耗時最短。
對查詢效率進行排序:按縣+全局>按省+全局>按市+全局>未分區(qū)>按省+本地>按市+本地>按縣+本地。
表4 億級要素量下不同分區(qū)方案查詢效率第100百分位數(shù) s
注:表中字體加粗部分圈出的為該行的最小值,表示該比例尺下查詢耗時最短。
對查詢效率進行排序:按縣+全局>按省+全局>未分區(qū)>按市+全局>按省+本地>按市+本地>按縣+本地。
觀察比較表1~表4可知:
(1)對于文中的實驗數(shù)據(jù),“按縣+全局”索引效率更高;
(2)全局索引比本地索引效率更高;
(3)索引為全局索引時,三種分區(qū)粒度的效率從高到低分別是:按縣分區(qū)、按省分區(qū)、按市分區(qū);
(4)索引為本地索引時,三種分區(qū)粒度的效率從高到低分別是:按省分區(qū)、按市分區(qū)、按縣分區(qū),分區(qū)粒度越大效率越高。
2.3.2 分區(qū)粒度對查詢效率的影響分析
已知查詢檢索的要素集數(shù)據(jù)量越大則耗時越久,但在數(shù)據(jù)庫中幾百與幾千甚至幾萬條記錄查看時實際上相差甚小,因此只要合理選擇分區(qū)粒度,這都不會是影響查詢效率的主要原因,文中主要研究除此之外由于分區(qū)而額外增加的查詢操作。從elapsed中的三種數(shù)據(jù)庫調(diào)用類型parse、execute、fetch入手,利用tkprof分析trc文件。以按縣分區(qū)查詢中耗時較多的一系列SQL為參照,比較相同SQL在按省分區(qū)空間查詢中的耗時。以數(shù)據(jù)字典表Seg$查詢?yōu)槔绫?所示。
表5 Seg$表中查詢過程統(tǒng)計分析
注:表中字體加粗的為執(zhí)行次數(shù)。
SQL查詢的對象是seg$,按縣分區(qū)對SQL ID為9tgj4g8y4rwy8的SQL執(zhí)行了17 796次,總耗時間為1.75 s;而按省分區(qū)對相同SQL的執(zhí)行次數(shù)僅為383次,總耗時為0.05 s。在此Lobfrag$、Obj$、Indpart$、Obj$(2)、Tabpart$、SDO_FILTER數(shù)據(jù)字典表不做贅述,得出:
(1)分區(qū)越多、表上的lob column越多,對數(shù)據(jù)字典表的訪問次數(shù)越多。
(2)全局空間索引下,數(shù)據(jù)經(jīng)過分區(qū)后,不同分區(qū)粒度之所效率會有不同,差異在于對于數(shù)據(jù)字典表的訪問次數(shù)上,查詢效率與分區(qū)粒度的大小呈負相關,在主要幾個與分區(qū)相關的數(shù)據(jù)字典表中具有如表6的關系。
表6 全局空間索引下各數(shù)據(jù)字典的訪問次數(shù)與分區(qū)個數(shù)的關系
其中,X表示分區(qū)數(shù),Y表示lob column 個數(shù)。
2.3.3 索引方式對查詢效率的影響分析
索引也可以分區(qū),為了研究索引分區(qū)對空間數(shù)據(jù)查詢效率的影響,同樣使用范圍為全國的要素量在千萬級別的數(shù)據(jù)進行實驗,將數(shù)據(jù)分別按照按縣和按省進行分區(qū)并且創(chuàng)建本地空間索引。同樣開啟10046事件[20](Oracle中獲取最完整的sql執(zhí)行計劃的一個功能),跟蹤SDO_FILTER操作。使用tkpof分析trc文件中耗時最多的SQL,對根據(jù)綁定變量的值分析不同SQL(主要是對數(shù)據(jù)字典的遞歸查詢)查詢的數(shù)據(jù)內(nèi)容。比較在使用分區(qū)索引時所查詢的數(shù)據(jù)字典內(nèi)容,與在使用全局索引時查詢的數(shù)據(jù)字典內(nèi)容。在使用分區(qū)空間索引時,按縣分區(qū)與按省分區(qū)對數(shù)據(jù)字典的訪問次數(shù)及返回記錄數(shù)如下。同樣為了分析SQL語句解析次數(shù)與分區(qū)數(shù)的關系,將查詢語句中的綁定變量提取出來與相應的數(shù)據(jù)字典表進行連接,以Seg$表和Obj$表的查詢統(tǒng)計過程為例,見表7、表8。
表7 Seg$表中查詢過程統(tǒng)計分析
注:表中字體加粗的為執(zhí)行次數(shù)。
查詢內(nèi)容包括LOB INDEX PRTITION、LOB PARTITION、TABLE PARTITION、少量sys和mdsys用戶下的表和其他表。
以按縣分區(qū)表為例,包括:
INDEX PARTITION:2 531*3=7 593
此處不包括分區(qū)空間索引,僅包括LOB INDEX PARTITION;
LOB PARTITION:2 531*3=7 593
TABLE PARTITION為2 531。
表8 Obj$表中查詢過程統(tǒng)計分析
注:表中字體加粗的為執(zhí)行次數(shù)。
查詢內(nèi)容包括LOB PARTITION、SPATIAL INDEX PARTITION相關的TABLE PARTITION。
以按省分區(qū)表為例,包括:
LOB PARTITION:43*3=129
INDEXPARTITION為43,此處包括SPATIAL INDEX PARTITION,不包括LOB INDEX PARTITION
TABLE PARTITION:(僅包括與查詢范圍相關的分區(qū),可忽略不計)
Lobfrag$、Indpart$、Obj$(2)、Tabpart$不做贅述,得出訪問次數(shù)與分區(qū)個數(shù)的關系見表9。
表9 本地空間索引下各數(shù)據(jù)字典的訪問次數(shù)與分區(qū)個數(shù)的關系
其中,X表示索引分區(qū)數(shù),Y表示lob column個數(shù)(與數(shù)據(jù)本身格式有關)。已知為所有的數(shù)據(jù)分別按縣和按省進行了分區(qū)并為其建立了全局空間索引。根據(jù)表9可知:
(1)對數(shù)據(jù)字典訪問次數(shù)與索引分區(qū)的粒度線性相關,分區(qū)數(shù)越多,訪問次數(shù)越多;
(2)索引分區(qū)與數(shù)據(jù)分區(qū)相似,均是在查詢對象的數(shù)據(jù)量達到一定程度后,即索引分區(qū)是在要查詢的索引池中數(shù)量達到影響查詢效率時可以考慮進行索引分區(qū);
(3)索引是提升查詢效率最有效的方法。文中實驗是在普通查詢環(huán)境下(即不以索引主鍵為查詢條件)的查詢效率分析,如果查詢條件中包含分區(qū)鍵使用本地空間索引將可以直接定位到相應的分區(qū)中,查詢對象將僅限于那個子分區(qū),在這樣的查詢情景下本地空間索引將會有更高的查詢效率。
在前人利用關系型數(shù)據(jù)庫的分區(qū)技術不能有效管理大容量的空間數(shù)據(jù)尤其是要素量達到千萬級別以上的矢量圖層數(shù)據(jù)的基礎上,文中采用不同管理方式、不同分區(qū)粒度、不同索引方式及其組合的分區(qū)技術來系統(tǒng)管理空間大圖層數(shù)據(jù),并通過實驗驗證了分區(qū)技術對海量要素圖層數(shù)據(jù)的存儲具有優(yōu)化作用。得出結(jié)論:(1)分區(qū)技術在對海量要素圖層數(shù)據(jù)存儲和查詢中具有優(yōu)化作用;(2)僅僅考慮查詢效率時,如果在分區(qū)后各個子表中查詢操作本身差別不大,在不使用分區(qū)鍵作為查詢條件的查詢情境中,分區(qū)粒度越大則效率越高;(3)僅僅考慮查詢效率時,使用分區(qū)鍵作為查詢條件時,則本地分區(qū)索引效率更高;否則全局空間索引在查詢情景中表現(xiàn)更優(yōu)等。該方法為更好地應用分區(qū)技術解決實際遇到的存儲與檢索效率問題提供技術支持。但是,用分區(qū)技術來管理其他類型的數(shù)據(jù)時,分區(qū)鍵的確定、分區(qū)粒度的選擇和索引方式的確定不能一概而論,還應根據(jù)實際情況確定,這也是下一步研究的內(nèi)容。