результаты могут быть очень разными из-за разных условий в запросе. если вам не хватает данных из explain/pg_stat_statements, посмотрите на log_executor_stats, там замеры на основе getrusage, что чуть "ближе" к системе. но имхо все равно закладываться на эти результаты и чтото планировать на их основе не очень надежно.
как разделить чтения из кеша OS и с диска это отдельный вопросю сейчас кокретно про shared hit. вот из explain analyze или pgss я вижу что для выполнения запроса было 100 хитов, а сколько за этими хитами реальных разных блоков - может быть 1 который 100 раз прочитали, или 100 когда например сек скан таблицы