処理汎用性
ビットマップインデックスのようなインデックスは,
非等値性
B-treeは,
これによって,
リスト2 B-treeは不等号や範囲検索もそこそこ速い
SELECT *
FROM TestTbl
WHERE indexed_col > 100;
SELECT *
FROM TestTbl
WHERE indexed_col <= 100;
SELECT *
FROM TestTbl
WHERE indexed_col BETWEEN 10 AND 100;
ただそうは言ってもやはり,
リスト3 否定条件やIS NULLでは役に立たない
SELECT *
FROM TestTbl
WHERE indexed_col <> 100;
SELECT *
FROM TestTbl
WHERE indexed_col IS NULL;
親ソート性
遅いSQL文によくありがちなパターンとして,
- 集約関数
(COUNT, SUM, AVG, MAX, MIN) - ORDER BY句
- 集合演算
(UNION, INTERSECT, EXCEPT) - OLAP関数
(RANK, ROW_ NUMBERなど)
ソートがメモリ上で行われている間はそれほど大きなパフォーマンス低下は引き起こさないのですが,
しかし,
リスト4 B-treeインデックスが高速化することがある処理の例
SELECT SUM(col)
FROM TestTbl
GROUP BY indexed_col;
SELECT indexed_col
FROM TestTbl
ORDER BY indexed_col;
SELECT COUNT(*)
FROM TestTbl;
SELECT MAX(indexed_col)
FROM TestTbl;
SELECT MIN(indexed_col)
FROM TestTbl;