程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 可視化 DB2 中的空間數據

可視化 DB2 中的空間數據

編輯:DB2教程

簡介

  幾乎每個數據庫都包含空間信息。地址信息是其中最突出的代表。其他例子還包括街道,在數據庫中,街道不僅可以通過其名稱來表示,還可以通過它在地球上的確切位置來表示。Linestring 就是建模那些對象的一種方式。分公司和客戶居住地的位置可以用點描述。類似地,州和國家邊界可以用多邊形表示。非地理應用程序也可以受益於關系數據庫中的空間數據。倉庫和貨架上的產品的位置可以用顯式地建模的地理信息表示。空間距離的計算可以幫助根據不同的標准最優地安排倉庫中產品的位置。

  DB2 for Linux, UNIX, and Windows 支持(從 Version 7 開始)使用 DB2 Spatial Extender 產品存儲、管理和檢索數據庫中的空間數據。通過這個擴展器,可以像對待任何其他關系數據(例如數字和字符串)一樣,使用專用的數據類型為點、線、多邊形等幾何圖原和那些圖原的集合建模。DB2 Spatial Extender 不僅提供數據類型,而且還附帶了很多用於執行空間操作的空間函數和方法。例如,可以確定兩個圖形之間的距離,執行空間集合操作,如合並或交叉圖形,獲取一個 linestring 的長度。

  DB2 for z/OS 的空間支持提供了幾乎與擴展器相同的功能。雖然在內部實現上有所差異,但是空間類型和函數的使用是類似的。主要不同在於 DB2 for Linux, UNIX, and Windows 中的空間函數通常可以通過方法注釋來調用(例如 geometry..ST_Buffer(10, ''METER'')..ST_AsText())。DB2 for z/OS 還不支持結構化類型和方法(用於實現擴展器),因此那個平台上的空間支持只接受函數調用語法(例如 ST_AsText(ST_Buffer(geometry, 10, ''METER'')))。

  雖然對於很多應用程序來說空間計算和比較已經足夠,但是有時候將數據庫中的數據可視化還是很有幫助的。表格表示法(用於傳統關系數據)並不是最適合使空間信息可訪問的方法。相反,空間數據需要呈現地圖。有很多方法可以提取幾何圖形並生成那樣的地圖。一些商業工具 -- Geographic Information Systems (GIS) -- 就是專用於顯示和修改空間和非空間數據。其他一些系統則通過根據集合圖形生成靜態圖像(例如 JPEG 或 TIFF)來提供簡單的界面。之後,這些圖像可以由一個 Web 浏覽器顯示。

  ESRI ArcExplorer 可以從 DB2 Spatial Extender Web 站點(見 參考資料 小節)下載,它是用 Java™ 實現的。因此,它可以在任何含適當的 Java Virtual Machine (JVM) 的平台上使用。

但是,ArcExplorer 附帶了一個特定於 Windows 的安裝例程。這有礙於在其他平台,例如 Linux 和 AIX® 上部署和使用 ArcExplorer。下面的小節描述如何克服這個問題。本文在一個 Linux 系統上設置一個 ArcExplorer,並訪問存儲在同一個系統上的 DB2 數據庫以及 DB2 for z/OS 上維護的另一個數據庫中的空間數據。

  本文首先解釋如何安裝、啟動和設置 ArcExplorer。接著,道出訪問存儲在數據庫中的數據前需要滿足的需求。最後,本文就如何有效地使用 ArcExplorer 給出一些指南。所有內容都基於 Linux 系統上捕捉的屏幕快照進行講解。但是,同樣的步驟也適用於其他系統。

  部署 ArcExplorer

  ArcExplorer 是用於可視化空間數據的一款輕量級工具。它由 5 個 .jar 文件組成,在下載 小節中的歸檔文件中可以找到這 5 個文件。您也許會注意到,與 windows 上的本地安裝相比,您也許會注意到,這種 windows 上的安裝更為復雜。在 windows 上,需要安裝一個完全可以運行的產品,其中包括 Java Runtime Environment (JRE)。如今,幾乎可以斷定每個系統上都已經安裝了 Java。因此,可以依賴於已有的 JRE 和 JVM。這樣可以幫助減少安裝鏡像的大小,使之只有 2.5MB -- 而最初的 Windows 安裝大小約為 100MB。與此同時,ArcExplorer 自動得益於對已有 Java 包的更新。

  與 JVM 類似,ArcExplorer 安裝目錄中不需要有 db2java.zip 文件的副本。該文件實際上是用於 ArcExplorer 與 DB2 的通信。雖然 README 指示您從 DB2 安裝目錄復制那個文件,但是更簡單、更好的方法是直接從其原始位置(例如 ~/sqllib/java/db2Java.zip)使用該文件。通過在 CLASSPATH 環境變量中引用該位置,就可以使用那個文件。

  總之,運行 ESRI ArcExplorer 所需的文件只有 aeJava_help.jar、arcims_aej.jar、arcims_sdk.jar、sde_sql3.jar 和 XML.jar。此外,下載小節還提供了 shell 腳本 arcexplorer,用於設置 classpath 和同時啟動 JVM 和 ArcExplorer。

  下載小節中還有其他一些文件。文件 aeJava.ico 是一個圖像,如果想通過菜單啟動 ArcExplorer,則可以使用它作為菜單中的一個圖標。文件 LICENSE 包含 ArcExplorer 附帶的許可,用戶必須遵從該許可。腳本 host.sql 包含一些 sql 語句,這些語句使用聯邦建立到一個遠程 DB2 for z/OS 子系統的連接,並通過昵稱訪問三個含空間數據的遠程表。最後,文件 import.jcl 是一個 JCL 腳本,可以使用它將空間數據從 shapefile 導入到 DB2 for z/OS 子系統。shell 腳本 import.sh 則在 DB2 for Linux, UNIX,

and Windows 做同樣的事情。

  有了前面的那些信息,現在可以下載本文提供的 ZIP 歸檔文件,並將其中的內容解壓到您選擇的一個目錄中。為了啟動 ArcExplorer,進入那個目錄,調用 arcexplorer 腳本,如清單 1 所示。您將看到 ArcExplorer 出現(還沒有經過配置),如圖 1 所示。

  清單 1. 啟動 ArcExplorer

  $ cd /usr/local/arcexplorer

  $ ./arcexplorer

  圖 1. 啟動的 ArcExplorer

  啟動的 ArcExplorer

  准備數據庫中的空間數據

  現在您已經確認了 Java 應用程序的基本功能,本節將解釋如何設置數據庫,從示例 shapefile 中導入空間數據,最後可視化數據。

  空間化數據庫

  為了管理數據庫中的空間數據,必須啟用數據庫的空間操作功能。可以使用工具 db2se 開始 DB2 for Linux, Unix, and Windows 上的啟用過程,如清單 2 所示。

  清單 2. 啟用數據庫

$ db2 create database spatialDB20000I  The CREATE DATABASE command completed successfully.$ db2se enable_db spatialEnabling database. Please wait ...GSE1036W  The Operation was successful.  But values of certaindatabase manager and database configuration parameters should beincreased. <歡迎光臨學網,點擊這裡查看更多文章教程 [1] [2] [3]  [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]

/pre>
  對於警告 GSE1036W,暫時可以忽略。該警告是啟用步驟中發出的,用於確認某些數據庫管理器(DBM)配置參數是否不低於某個最小值,以確保在較復雜的場景中可以使用擴展器的適當功能。但是由於目前只需使用一些簡單的查詢,因此不必強制調整這些參數。

  空間化一個 DB2 for z/OS 子系統還需執行更多的步驟。數據庫管理員必須修改 JCL 腳本,以啟用數據庫。例如,需要使用 DB2 子系統的名稱。調整腳本之後,執行腳本,為 DB2 子系統啟用空間支持特性。這個過程的細節超出了本文的范圍。情參閱文檔(見參考資料 小節)。

  導入空間數據

  本文使用 DB2 Spatial Extender 附帶的三個示例 shapefile -- 即 sjMainStreets、sjZipCodes 和 sjCensusBlocks -- 來演示如何使用 ArcExplorer。第一步是將那些 shapefile 導入到空間化數據庫中。這裡分別針對 DB2 for Linux, UNIX, and Windows 和 DB2 for z/OS 討論這一過程,因為兩者之間有明顯的不同。

  DB2 for Linux, UNIX, and Windows

  清單 3 顯示如何使用 db2se 命令行工具導入 shapefile。只有 shapefile sqMainStreets 被導入到數據庫 SPATIAL 中。導入其他兩個 shapefile 的命令在 import.sh 文件中,該文件可以在下載小節中找到。當然,DB2 Control Center 中也提供了相同的功能。另外,也可以從您自己的應用程序中通過調用 db2gse.ST_import_shape 存儲過程來開始導入。

  清單 3. 將示例 shapefile 導入到 DB2 for Linux, UNIX, and Windows 中

$ db2se import_shape SPATIAL -filename sjMainStreets -srsName NAD83_SRS_1 \        -tableName MAIN_STREETS -createTableFlag 1 -spatialColumn SHAPE \        -idColumn SE_ROW_ID -commitScope 1000 -clIEnt 1GSE0000I  The operation was completed successfully.$ db2se register_spatial_column SPATIAL -tableName MAIN_STREETS \        -columnName SHAPE -srsName NAD83_SRS_1GSE0000I  The Operation was completed successfully.

    對於導入操作,有兩件事情要注意。ArcExplorer 要求表中存在一個名為 SE_ROW_ID 的列。那個列的類型必須聲明為 INTEGER。這個列中的值用於惟一地標識每一行,也就是說,它必須是一個 ID 列。可以選擇讓 shape import 自動添加該列並為之生成惟一值(選項 idColumn)。第二件事情是 ArcExplorer 要求所有空間列指定一個空間引用系統。這可以通過像清單 3 中最後一步那樣注冊空間列來完成。

  也有其他方法可以提供強制的 SE_ROW_ID 列。例如,可以使用空間表上的一個視圖,通過重新命名視圖定義中的 ID 列,從一個已有的 ID 列中取得 SE_ROW_ID 值。另一種方法是使用不同的編號技術,例如在線分析處理(OLAP)函數 ROW_NUMBER() 為新的 SE_ROW_ID 列生成值。具體實現留給有興趣的同學作為練習。
DB2 for z/OS

 

  DB2 for z/OS 的空間支持提供了一個類似於 db2se 的工具。這個工具的名稱為 DSN5SCLP,由於在 z/OS 上運行,因此必須從一個 JCL 腳本中啟動該工具。要導入的 shapefile 必須在 z/OS 上的一個分層文件系統(HFS)數據集中。清單 4 中的腳本假設掛載點(mount point)名為 /u/stolze/。在您自己的系統中,可以需要相應地調整這個值。shapefile 被存儲為二進制數據。因此,.dbf 文件中的所有數據(包含非空間屬性信息)仍然以 ASCII 格式編碼。(另一方面,生成的消息文件則以 EBCDIC 格式存儲來自導入操作的所有消息。)

  和前面一樣,DB2 for Linux, UNIX, and Windows 上使用相同的 shapefile。清單 4 顯示了如何導入 shapefile sjMainStreets。其他兩個 shapefile 可以按相同方式導入,只是需要調整一下文件名和表名。在 下載小節中可以找到用於所有三個表的完整 JCL 腳本 import.jcl。

  清單 4. 將示例 shapefile 導入到 DB2 for z/OS 中

//IMPORT JOB ''USER=$$USER'','''',CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1)
//JOBLIB  DD  DSN=DB2A.SDSNEXIT,DISP=SHR
//        DD  DSN=DB2A.SDSNLOAD,DISP=SHR
//        DD  DSN=CEE.SCEERUN,DISP=SHR
//        DD  DSN=CBC.SCLBDLL,DISP=SHR
//*
//* IMPORT SHAPE FILES
//*
//IMPORT   EXEC PGM=IKJEFT01,REGION=0M,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//DSNAOINI DD DSN=DB2A.SDSNSAMP(DSNAOINI),DISP=SHR
//CEEDUMP  DD SYSOUT=*
//SYSTSIN  DD *

DSN5SCLP /import

_shape STLEC1 +
   -fileName /u/stolze/sjMainStreets +
   -createTableFlag 1 +
   -srsName NAD83_SRS_1 +
   -tableName MAIN_STREETS +
   -tableCreationParameters "IN DATABASE SPATIAL" +
   -spatialColumn SHAPE -idColumn SE_ROW_ID +
   -messagesFile /u/stolze/mainStreets.msg

//*
//* REGISTER SPATIAL COLUMNS
//*
//REGISTER EXEC PGM=IKJEFT01,REGION=0M,DYNAMNBR=20
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//DSNAOINI DD DSN=DB2A.SDSNSAMP(DSNAOINI),DISP=SHR
//CEEDUMP  DD SYSOUT=*
//SYSTSIN  DD *

DSN5SCLP /register_spatial_column STLEC1 +
   -tableName MAIN_STREETS -columnName SHAPE -srsName NAD83_SRS_1

//* 
  DSN5SCLP 要求為每個操作指定 DB2 位置名稱(清單中為 STLEC1),其中 db2se 需要一個數據庫的名稱。為了建立到各個 DB2 子系統的連接,這是必需的。惟一需要注意的其他事項是,可以、也應該在 CREATE TABLE 語句後面添加一個子句,以指定將表放在哪個數據庫中。選項 tableCreationParameters 用於提供用於數據庫 SPATIAL 的信息。

  JCL 腳本不僅導入空間數據,而且還為那些表中的空間列注冊一個專用的 sql Reporting Service (SRS)。這與之前的小節是一樣的。這一步實際上不是必需的,因為 ArcExplorer 不在本地訪問 DB2 for z/OS。相反,正如接下來的小節中要詳細解釋的那樣,這裡使用一個聯邦層。

  為訪問 DB2 for z/OS 上的空間數據設置聯邦

  不幸的是,不能讓 ArcExplorer 直接訪問 DB2 for z/OS 中的空間數據。ArcExplorer 依賴於來自 DB2 for Linux, UNIX, and windows 的編目視圖,並且(在內部)使用特定於 DB2 for Linux, UNIX, and windows 的語法(即方法調用)來處理空間數據。雖然可以模擬所需的 DB2 for Linux, UNIX, and Windows 中的編目視圖,但是查詢語法顯得更精妙一些。

  DB2 的聯邦功能為我們提供了一個解決方案。我們將空間和非空間數據存儲在 DB2 for z/OS 中,但是使用一個 DB2 for Linux, UNIX, and Windows 實例作為聯邦服務器。這個聯邦服務器透明地通過昵稱訪問 DB2 for z/OS 中的數據,同時提供所需的編目視圖和接受方法調用語法。

  但是,需要通過迂回的方法傳輸空間數據,並在 DB2 for z/OS 與 DB2 for Linux, UNIX,文章整理:學網 http://www.xue5.com (本站) [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]

and Windows 中不同的內部表示之間轉換空間數據。實現到 DB2 數據源的 DRDA 包裝器還沒有提供這種轉換功能。因此,在轉換步驟中可以使用視圖,按照其 well-known binary (WKB) 編目傳輸空間數據。圖 2 顯示了 ArcExplorer 訪問 DB2 for z/OS 中的空間數據的架構。

  圖 2. 聯邦設置

  聯邦設置

  箭頭表明空間和非空間數據在系統中的流向。來自 ArcExplorer 的查詢總是被定向到 DB2 for Linux, UNIX, and Windows。更具體地說,ArcExplorer 訪問具有(已注冊)空間列的視圖。ArcExplorer 完全不知道實際的數據源於何處。視圖本身基於一個昵稱。那個昵稱有一個 BLOB 列,其中包含 WKB 格式的幾何圖形。根據請求,聯邦服務器從遠程數據源(即 DB2 for z/OS 子系統)獲取 BLOB 值。包裝器並不訪問含幾何信息的基本表 MAIN_STREETS,而是訪問視圖 MAIN_STREET_VIEW。該視圖用於調用函數 ST_AsBinary,以便將空間數據從基本表轉換為 WKB 表示。

  上述架構可以用清單 5 中所示的一系列 sql 語句實現。該清單只反映表 MAIN_STREETS 的設置,並通過視圖 MAIN_STREETS_HOST 使之可以在 DB2 for Linux, UNIX, and Windows 中被訪問。其他表,如 ZIP_CODES 和 CENSUS_BLOCKS,可以以相同方式處理。SQL 腳本 host.sql(可以在下載小節中找到)包含用於所有三個表的 sql 語句。 清單 5. 設置到 DB2 for z/OS 的聯邦訪問

lor="#ffffff" border="1" heihgt="">

CREATE WRAPPER drda;CREATE server host TYPE DB2/ZOS VERSION ''9'' WRAPPER DRDA   AUTHORIZATION sysadm PASSWORD password OPTIONS ( DBNAME ''HOST'' );CREATE USER MAPPING FOR USER server host   OPTIONS ( REMOTE_AUTHID ''SYSADM'', REMOTE_PASSWORD ''PASSWord'' );SET PASSTHRU host;CREATE VIEW main_streets_view AS   SELECT census1, census2, cfcc, cfcc1, cfcc2, fedirp, fedirs, fename,          fetype, INTEGER(fnode) AS fnode, fraddl, fraddr, length,          se_row_id, source, tlid, INTEGER(tnode) AS tnode, toaddl,          toaddr, zipl, zipr,          db2gse.ST_AsBinary(shape) AS wkb, db2gse.ST_SrId(shape) AS srsId   FROM   main_streets;SET PASSTHRU RESET;CREATE NICKNAME main_streets_nick   FOR host.sysadm.main_streets_view;CREATE VIEW main_streets_host AS   SELECT census1, census2, cfcc, cfcc1, cfcc2, fedirp, fedirs, fename,          fetype, fnode, fraddl, fraddr, length, se_row_id, source, tlid,          tnode, toaddl, toaddr, zipl, zipr,          db2gse.ST_MultiLineString(wkb, srsId) AS shape   FROM   main_streets_nick;! db2se register_spatial_column spatial -tableName MAIN_STREETS_HOST        -columnName SHAPE -srsName NAD83_SRS_1;

 
  上述設置的總體效果是,所有數據在物理上只存儲在 DB2 for z/OS 中,而所有訪問則被定向到 DB2 for Linux, UNIX, and windows。在查詢時,DB2 for Linux, UNIX, and Windows 轉換查詢,以適應 DB2 for z/OS,並且用視圖轉換空間數據。
  可視化空間數據

 

  完成之前的所有准備工作之後,現在可以將注意力放在根據空間數據呈現地圖上來。首先,需要添加一個層。一個層是具有共同類型的空間對象(及其非空間屬性)的一個集合。例如,所有街道可以形成一個街道層。按照關系 DBMS,一個層對應於一個空間表,也就是有一個幾何列和一些其他非幾何列的表。表中的所有列都是具有那個表所表示的某種實體類型的實體。其他列中的值描述每個幾何圖形的屬性(例如街道名稱)。

  可以通過菜單(Layer > Add Layers)或者單擊工具條中的 Add Layers 圖標在 ArcExplorer 中添加一個層。在新打開的 Catalog 窗口中,第一步是添加一個數據庫連接。要連接的數據庫必須在本地 DB2 (客戶機)實例中編目。另外還必須指定一個用戶名和密碼。圖 3 顯示了這一步。

  圖 3. 設置 DB2 連接

  設置 DB2 連接

  上一步的結果是一個新的連接對象。對於要訪問的每個數據庫,只需設置一次連接。如果使用前面提到的聯邦設置,那麼只需要一個到聯邦服務器,即 DB2 for Linux, UNIX, and Windows 的連接。可以立即為已有數據庫連接添加新層。可以選擇該連接,然後獲得相關數據庫中所有層(已注冊的空間列)的列表。對於本場景,選擇所有三個層,單擊 Add Layers 圖標,然後關閉 Catalog 窗口。圖 4 演示了這一點。注意,DB2 for z/OS 中空間表的昵稱還沒有被添加,因此這裡沒有顯示。

  圖 4. 添加層 layers

  添加層

  在主窗口的左面板上,現在可以選擇要呈現的層,為那個層選擇顏色和其他要使用的屬性,縮小和放大,找到幾何圖形並獲得相關的屬性,以及根據當前選擇的地圖區域創建圖像。還可以上下移動層(通過在左側的概要圖中右鍵單擊層)。這將影響繪制層的順序,以及哪些層顯示在其他層之上。圖 5 演示如何使用 Identify 圖標顯示關於一個選中的人口普查區域的信息。在使用 Identify 特性之前,必須在最左測面板上選中相關的層。

  圖 5. 獲得幾何圖形的屬性

  獲得幾何圖形的屬性文章整理:學網 http://www.xue5.com (本站) [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]

  相同的操作也可以在 DB2 for z/OS 子系統中的空間數據上執行。聯邦設置會隱藏數據本身的來源。ArcExplorer 只與 DB2 for Linux, UNIX, and windows 系統打交道。圖 6 演示了選擇並呈現層 ZIP_CODES_HOST 的結果。在功能上,層與 DB2 for Linux, UNIX, and Windows 數據庫中存儲的基本表沒有區別。

  圖 6. 呈現 DB2 for z/OS 中的空間數據

  呈現 DB2 for z/OS 中的空間數據

  對 ArcExplorer 的性能考慮

  ArcExplorer 包含 Query Builder 特性。該特性允許根據不同的謂詞過濾要顯示的幾何圖形。圖 7 展示了該特性,其中涉及所有 17 個人口普查區域,列 HOUSHO_29 包含值 6。

  圖 7. 使用 ArcExplorer 的 Query Builder 過濾幾何圖形

  過濾幾何圖形

  通過分析 CLI 跟蹤可以發現,查詢構建器中指定的謂詞沒有被下推到 DB2 中。ArcExplorer 將所有數據裝載到主存中,並在那裡應用所有過濾。雖然對於少量幾何圖形和少數幾個表來說這樣做已經足夠了,但是對於較大的表,這樣很快就會導致性能問題。因此,初次裝載 ArcExplorer 項目時會導致較長的延時。

  這種低效問題很容易在數據庫級克服。為此,可以在 DB2 中定義一個視圖,並注冊那個視圖的空間列。隨後,使 ArcExplorer 知道該視圖,並將其看作一個層。清單 6 總結了該設置。

  清單 6. 在數據庫級過濾

$ db2 CREATE VIEW census_blocks_6 AS \        SELECT blockgroup, population, househo_28, househo_29, per_capita, \               median_hou, median_fam, average__1, average__2, se_row_id, \               shape \        FROM   census_blocks \        WHERE  househo_29 = 6DB20000I  The sql command completed successfully.$ db2se register_spatial_column spatial -tableName CENSUS_BLOCKS_6 \        -columnName SHAPE -srsName NAD83_SRS_1GSE0000I  The Operation was completed successfully.


  在刷新用於數據庫連接的列表之後,添加新層。然後選擇顯示新層,圖 8 中的結果與之前 ArcExplorer 本身執行過濾時是一樣的。現在,該視圖在 sql 級注入過濾謂詞,DB2 可以利用通常的數據庫技術,即索引訪問。

  圖 8. 在數據庫級過濾幾何圖形

  在數據庫級過濾幾何圖形

  如果有些空間表根本不會用 ArcExplorer 來訪問,那麼就要考慮另一個性能問題。那些表中的空間列不應該注冊。如果注冊了那些空間列,那麼 ArcExplorer 將在啟動時或者要添加一個新層時訪問和掃描那些表。這是為了提供可用數據的一致、完整的視圖。通過注銷那些表,可以避免上述掃描,因為 ArcExplorer 不再知道那些表的存在。

  結束語

  本文介紹了如何使用 ESRI ArcExplorer 來可視化用 DB2 Spatial Extender 或 Spatial Support for DB2 for z/OS 管理的空間數據。文中解釋了如何將 shapefile 導入到不同的 DB2 系統中,並對其進行設置,使 ArcExplorer 可以訪問該數據。然後演示對空間數據的訪問,並介紹 ArcExplorer 的基本功能。最後一節討論如何在數據庫級應用過濾謂詞,以提高查詢性能和縮短響應時間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved