このクエリはすでに完全に実行されていますが、問題は、4 つのテーブルが大きくなりすぎて、かなり遅くなることです。
これを最適化するにはどうすればよいですか?
SELECT
all_records.user_id,
users.NAME,
users.IMAGE
FROM (
SELECT user_id FROM comments
WHERE commentable_id = #{object.id}
AND commentable_type = '#{object.class.to_s}'
UNION ALL
SELECT user_id FROM hello
WHERE helloable_id = #{object.id}
AND helloable_type = '#{object.class.to_s}'
UNION ALL
SELECT user_id FROM foo
WHERE fooable_id = #{object.id}
AND fooable_type = '#{object.class.to_s}'
UNION ALL
SELECT user_id FROM bar
WHERE barable_id = #{object.id}
AND barable_type = '#{object.class.to_s}'
) AS all_records
INNER JOIN users ON users.id = all_records.user_id
GROUP BY
all_records.user_id,
users.NAME,
users.IMAGE
LIMIT 15
クエリが行うべきことは、(4) テーブルで何かを行った一意のユーザーを取得することです (テーブルの名前の変更を許してください)。それでもLIMIT 15
4つのテーブルすべてを読み取っていると思うので、それでも動作が遅くなります。私はこれを正しく行っていますか、またはこれを最適化する方法はありますか?
参考までに:私はpostgresを使用しており、railsを使用していますが、で実行していfind_by_sql
ます。
編集
ローカル ポストグル: 9.0.5; ヘロクポストグル: 9.1