函數索引基於用戶定義例程(UDR)的返回值構建,能將表達式計算結果預存有序,查詢時直接掃描索引避免全表掃描與重複計算,大幅提升 SELECT 性能。本文系統介紹優勢、類型、限制、創建注意事項,並通過三個完整實戰案例(圓面積、圖像 RGB、空間 R-Tree)演示創建、驗證與優化器行為。
WITH (NOT VARIANT)。CREATE INDEX idx1 ON tab(c1, f(c3)))。CREATE/DROP INDEX ... ONLINE 無效,操作期間持有排他鎖,表不可訪問。oncheck -ci 驗證,-y 修復,同普通索引。CREATE TABLE circles (radius FLOAT);
CREATE FUNCTION circleArea(radius FLOAT) RETURNS FLOAT
WITH (NOT VARIANT)
RETURN 3.14159 * radius * radius;
END FUNCTION;
CREATE INDEX areaOfCircleIndex ON circles (circleArea(radius));
-- 查詢自動使用索引
SELECT radius FROM circles WHERE circleArea(radius) < 500;
INFORMIXDIR、LD_LIBRARY_PATH。sbsp2(匹配 ONCONFIG SBSPACENAME)。imagedb:images 表(BLOB 列 image)。imageUDR.c → imageUDR.so,部署至 $INFORMIXDIR/extend,註冊四個函數:avgRGB/Red/Green/Blue(HANDLESNULLS)。-- 無索引:全表掃描,Estimated Cost 2
SET EXPLAIN ON;
SELECT name, avgRed(image), avgGreen(image), avgBlue(image), avgRGB(image)
FROM images
WHERE avgRGB(image) > 150 AND avgBlue(image) > 160;
-- sqexplain.out 顯示 SEQUENTIAL SCAN
-- 創建四個函數索引
CREATE INDEX avgRGBIndex ON images (avgRGB(image));
CREATE INDEX avgRedIndex ON images (avgRed(image));
CREATE INDEX avgGreenIndex ON images (avgGreen(image));
CREATE INDEX avgBlueIndex ON images (avgBlue(image));
-- 再次查詢:索引掃描,Estimated Cost 1
SET EXPLAIN ON;
SELECT ... FROM images WHERE avgRGB(image) > 150 AND avgBlue(image) > 160;
-- sqexplain.out 顯示 INDEX PATH,Index Keys: avgRGB(image),Lower Index Filter: avgRGB > 150
-- 強制避免索引
SELECT {+AVOID_INDEX(images avgRGBIndex)} * FROM images WHERE avgRGB(image) > 100;
-- EXPLAIN 顯示 DIRECTIVES FOLLOWED: AVOID_INDEX,回退全表掃描
查找海嘯淹沒範圍內的城市:需計算城市幾何中心 st_centroid(citylim),判斷是否與海嘯邊界 st_envelope(inundation) 相交。創建 R-Tree 索引加速 st_centroid 計算。
ifxrltree.2.00、spatial.8.21.FC1 至 spatialdb。syssbspace(匹配 SYSSBSPACENAME)。loadshp 載入 Shapefile(城市邊界、海嘯線),生成表 cities(citylim)、tsunami(inundation)。CREATE INDEX citycenterindex
ON cities (st_centroid(citylim) st_geometry_ops)
USING rtree;
st_geometry_ops 操作符類包含 ST_Intersects、ST_Contains 等空間函數,優化器據此匹配索引。WHERE st_intersects(st_centroid(citylim), st_envelope(inundation)) 觸發索引掃描(Estimated Cost 從 25671 降至 12920,INDEX PATH)。st_distance 不屬於該操作符類,同樣查詢模式不會使用索引。UPDATE STATISTICS)。函數索引是 Informix 強大的調優工具,通過預計算與有序存儲,同時減少掃描行數與計算開銷。適用於大表、高頻、含確定性表達式的查詢場景。創建前務必做成本收益分析,避免過度索引拖慢寫入。B-Tree 覆蓋通用場景,R-Tree 釋放空間查詢潛能,靈活組合可應對多樣業務需求。