Use limit() instead of take() because take() produces needless DISTINCT #72
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What
Home Timeline の構築で用いている
take()
をlimit()
に置き換えます。Why
クエリパフェーマンスの向上がねらいです。
投稿 note 数の少ないユーザーばかりをフォローしているユーザーにおいて、特に改善幅が大きいです。
複雑な JOIN を含むクエリで take() を用いると、ベーステーブルの行の増幅を避けるために TypeORM が DISTINCT つきのクエリを自動で発行します。
この DISTINCT つきクエリはパフォーマンスへのインパクトが大きく、行の増幅が起きないクエリでは省略すべきです。
現状の Home Timeline のクエリでは行の増幅が起きるような JOIN はしておらず、省略可能です。
明示的に省略する場合は take() ではなく limit() を使います。
参考: https://github.com/typeorm/typeorm/blob/58fc08840a4a64ca1935391f4709a784c3f0b373/docs/select-query-builder.md#using-pagination
Additional info (optional)
@Ry0taK 念のためテストしていただけると嬉しいです。直近でこの周辺のクエリを触っていたようなのでセカンドオピニオンとして適切だろうと思ってメンションしています。