アクセスパスとは、データベース内でテーブルにアクセスする方法、つまりどのインデックスを使用してテーブルにアクセスするかを指します。
アクセスパスの分析は、単一テーブルクエリにおいて最も重要な課題の一つです。主テーブルスキャンを使用するアクセスパスについては、実行時間は一般的にスキャンする必要があるデータ量(範囲)に比例します。通常、EXPLAIN EXTENDED コマンドを使用して、テーブルスキャンの範囲を表示することができます。適切なインデックスが存在するクエリでは、インデックスを使用することでデータへのアクセス量を大幅に削減できるため、主テーブルスキャンを使用するクエリについては、選択されていないインデックススキャンの理由を分析する必要があります。これは、利用可能なインデックスが存在しないためか、あるいはインデックススキャンの範囲が広すぎてコストが高くなっているためかを判断する必要があります。
OceanBaseデータベースのパス選択方法は、ルールに基づくパス選択方法とコストに基づくパス選択方法を統合しています。OceanBaseデータベースはまずルールに基づくパス選択方法を使用し、その後ルールに基づくパス選択方法で選択可能なパスが1つだけの場合はそのパスを直接使用します。それ以外の場合は、コストに基づくパス選択方法を使用してコストが最小のパスを選択します。
OceanBaseデータベースでは、ユーザーはHintを使用してアクセスパスを指定できます。アクセスパスのHint形式は /*+INDEX(table_name index_name)*/ です。
ここで、table_name はテーブル名を表し、index_name はインデックス名を表します。index_name が PRIMARY の場合、主テーブルスキャンパスが選択されます。
以下の例は、Hintを使用してアクセスパスを指定する方法です。
obclient> CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, d INT, INDEX k1(b,c));
Query OK, 0 rows affected
obclient> EXPLAIN SELECT/*+INDEX(t1 PRIMARY)*/ * FROM t1;
| ===================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
-----------------------------------
|0 |TABLE SCAN|t1 |1000 |476 |
===================================
Outputs & filters:
-------------------------------------
0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil),
access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0)
obclient> EXPLAIN SELECT/*+INDEX(t1 k1)*/ * FROM t1;
| =====================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-------------------------------------
|0 |TABLE SCAN|t1(k1)|1000 |5656|
=====================================
Outputs & filters:
-------------------------------------
0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil),
access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0)