SQL 本質為集合語言。大量 INSERT/UPDATE/SELECT 時,單一陳述式處理多列可避免空間函數重複初始化/銷毀開銷,並減少客戶端-伺服器交互。示範:將 50 筆 INSERT 合併為一條陳述式,利用暫存表與 ROW_NUMBER() 分塊提交地理編碼,顯著提升效能。
UPDATE <user_table>
SET location = <geocoder_function>(<parameters>)
WHERE id IN (
SELECT t.id FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM <user_table> WHERE <geocoding_selection>
) AS t WHERE t.rn BETWEEN <first_row_num> AND <last_row_num>
);
使用 Common Table Expression (CTE) 將空間建構函數 (如 ST_LineString) 提取為單一計算,避免每列重複執行。實測在分區環境 (DPF) 中,重構後查詢快 9%。
WITH t(g) AS (VALUES (db2gse.ST_LineString('linestring(10 50, 20 40)', 1003)))
SELECT r.id FROM roads2 AS r, t
WHERE db2gse.ST_Intersects(r.shape, t.g) = 1;
ST_Intersects, ST_Within, ST_Distance 等)謂詞必須出現在 WHERE 子句,且參考含索引的空間欄位。正確形式:
WHERE ST_Intersects(<indexed_shape_column>, ...) = 1
WHERE ST_Distance(..., <indexed_shape_column>) < <some_distance>
用 db2expln 或 Control Center Explain SQL 檢視存取計畫,出現 EISCAN 且顯示索引名稱即表示使用網格索引。
圖3 帶有網格索引掃描的空間查詢訪問計劃
優化器難以精準估算空間索引成本,可用 SELECTIVITY 關鍵字提供估計值 (0~1),值越小越傾向採用索引掃描。
WHERE ST_Intersects(shape, ...) = 1 SELECTIVITY 0.000001
gseidx 工具可分析幾何資料分佈、建議最佳網格大小、收集統計資訊 (含直方圖)。輸出包含:資料範圍、各網格層級索引項/幾何體比率、佔用網格儲存格統計、針對不同查詢視窗大小的建議網格尺寸與索引成本估算。
gseidx "CONNECT TO testdb GET GEOMETRY STATISTICS FOR COLUMN roads(shape) USING GRID SIZES (0.5) SHOW HISTOGRAM WITH 10 BUCKETS"
gseidx "CONNECT TO testdb GET GEOMETRY STATISTICS FOR COLUMN roads(shape) ADVISE GRID SIZES"
經驗:資料按空間屬性叢集 + 合適緩衝池,對效能影響遠大於精細調整網格參數。
實測導入相同 shapefile:
SMS (inline 292) 3分15秒 → DMS (inline 292) 49秒 (快 73%)
SMS (inline 2000) 1分56秒 → DMS (inline 2000) 38秒 (快 66%)
查詢效能兩者無顯著差異。
db2se import_shape ... -tableCreationParameters "IN dms" ...
本文涵蓋空間 SQL 改寫、網格索引機制與調優、Index Advisor 使用、表空間類型選擇五大進階主題。實際效果取決於資料特徵與系統配置,建議以此為起點逐步驗證優化。