キャッシュヒット率を計測
Oracle
SELECT metric_name, ROUND(value, 2) AS pct
FROM v$sysmetric
WHERE metric_name = 'Buffer Cache Hit Ratio'
AND intsize_csec = (SELECT MAX(intsize_csec) FROM v$sysmetric);低い比率が常に悪いとは限らない。単独ではなくワークロードの文脈で解釈すること。
PostgreSQL
SELECT ROUND(sum(blks_hit) * 100.0 / NULLIF(sum(blks_hit) + sum(blks_read), 0), 2) AS cache_hit_pct
FROM pg_stat_database;通常は 99% 以上が目標。低い場合は shared_buffers と OS キャッシュを見直す。
MySQL
SELECT ROUND((1 - (
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='Innodb_buffer_pool_read_requests')
)) * 100, 2) AS buffer_pool_hit_pct;reads はディスクからの読み取り、read_requests は読み取りの総数。低い場合は innodb_buffer_pool_size を増やす。
SQL Server
SELECT ROUND(
100.0 * (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name='Buffer cache hit ratio')
/ NULLIF((SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name='Buffer cache hit ratio base'), 0), 2) AS pct;最新の SQL Server では、Page Life Expectancy (PLE) のほうがメモリ圧迫の指標として有意義。
MongoDB
var c = db.serverStatus().wiredTiger.cache;
({ configuredMB: +(c['maximum bytes configured']/1048576).toFixed(0),
inCacheMB: +(c['bytes currently in the cache']/1048576).toFixed(0),
readIntoCache: c['pages read into cache'],
evictedPages: c['unmodified pages evicted'] })「pages read into cache」と eviction が多い場合は、WiredTiger キャッシュが小さすぎることを示す。
Redis
INFO stats
# keyspace_hits / (keyspace_hits + keyspace_misses) = hit ratioヒット率が継続的に低い場合は、TTL/eviction の設定またはアクセスパターンの見直しが必要。