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

未使用のインデックスを検出

Oracle

-- Start monitoring:
ALTER INDEX customer_city_idx MONITORING USAGE;
-- Check after a while (12c+, all schemas):
SELECT owner, index_name, used FROM dba_object_usage;

USED = NO なら、そのインデックスは監視期間中に使用されていない。監視は NOMONITORING USAGE で無効にする。旧来の v$object_usage はセッションユーザーのインデックスのみを表示し、12c 以降は非推奨。12.2+ ではインデックスの使用状況が DBA_INDEX_USAGE で自動的に追跡される。

PostgreSQL

SELECT relname AS table, indexrelname AS index, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY relname;

idx_scan = 0 は、統計が最後にリセットされて以降そのインデックスが使われていないことを意味する。UNIQUE/PK インデックスは削除しないこと。

MySQL

SELECT * FROM sys.schema_unused_indexes;

performance_schema が有効で、サーバーがしばらく稼働している必要がある。UNIQUE 制約は除外される。

SQL Server

SELECT OBJECT_NAME(i.object_id) AS table_name, i.name AS index_name
FROM sys.indexes i
LEFT JOIN sys.dm_db_index_usage_stats s
  ON i.object_id = s.object_id AND i.index_id = s.index_id
  AND s.database_id = DB_ID()
WHERE i.type_desc = 'NONCLUSTERED'
  AND COALESCE(s.user_seeks + s.user_scans + s.user_lookups, 0) = 0;

usage_stats はサーバー再起動時にリセットされる。十分な観測期間を確保すること。

MongoDB

db.customer.aggregate([{ $indexStats: {} }])
// Indexes with low/0 accesses.ops are candidates

accesses.ops は accesses.since のタイムスタンプ以降のアクセス数をカウントする。_id インデックスは削除できない。

Redis

# Not applicable: core Redis has no secondary indexes.
# If the RediSearch module is used, check statistics with FT.INFO <index>.

データモデルがキーバリューのため、従来のインデックスの概念はない。

DBAtlas で開く →