アクセスパスとは、データベース内でテーブルにアクセスする方法、つまりどのインデックスを使用してテーブルにアクセスするかを指します。
アクセスパスの分析は、単一テーブルクエリにおける最も重要な問題の一つです。主表スキャンを使用するアクセスパスでは、実行時間は一般的にスキャンが必要なデータ量(範囲)に比例します。通常、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)