DBAtlas · データベース運用アトラス

クエリの実行計画を取得(EXPLAIN)

Oracle

EXPLAIN PLAN FOR
SELECT * FROM customer WHERE city = 'Ankara';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- For the actual executed plan:
-- SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', NULL, 'ALLSTATS LAST'));

EXPLAIN PLAN は推定の実行計画を返す。実際の行数には DISPLAY_CURSOR + STATISTICS_LEVEL=ALL を使用する。

PostgreSQL

EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT * FROM customer WHERE city = 'Ankara';

ANALYZE はクエリを実際に実行する(INSERT/UPDATE/DELETE では注意。トランザクション内で試して ROLLBACK する)。

MySQL

EXPLAIN ANALYZE
SELECT * FROM customer WHERE city = 'Ankara';
-- Estimate only (does not execute): EXPLAIN FORMAT=JSON SELECT ...;

EXPLAIN ANALYZE(MySQL 8.0.18+)はクエリを実行する。FORMAT=JSON は実行せずに詳細を返す。

SQL Server

SET STATISTICS PROFILE ON;
SELECT * FROM dbo.customer WHERE city = 'Ankara';
SET STATISTICS PROFILE OFF;
-- Estimated plan only (does not execute):
-- SET SHOWPLAN_XML ON;

SSMS では「Include Actual Execution Plan」(Ctrl+M)でグラフィカルな実行計画を表示できる。

MongoDB

db.customer.find({ city: "Ankara" }).explain("executionStats")

executionStats は実際に返されたドキュメント数とインデックスの使用状況(IXSCAN vs COLLSCAN)を示す。

Redis

# Not applicable: Redis has no query planner.
# The complexity of each command is documented (e.g. GET O(1), SORT O(N+M*log(M))).

パフォーマンスはコマンドの計算量とキー/データ構造のサイズで決まる。SLOWLOG で計測する。

DBAtlas で開く →