Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use limit() instead of take() because take() produces needless DISTINCT #72

Merged
merged 1 commit into from
Mar 18, 2023

Conversation

KOBA789
Copy link
Collaborator

@KOBA789 KOBA789 commented Mar 13, 2023

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 念のためテストしていただけると嬉しいです。直近でこの周辺のクエリを触っていたようなのでセカンドオピニオンとして適切だろうと思ってメンションしています。

Copy link
Collaborator

@Ry0taK Ry0taK left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ローカルで以下のケースをテストしてみましたが動作していそうでした

  • フォローしているユーザーの合計ノート数が11件以下/12件以上
  • 1投稿しかしていないユーザーを10人フォロー

Copy link

@EbiseLutica EbiseLutica left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コード上は問題ないです

@Ry0taK Ry0taK merged commit 8a02b80 into MisskeyIO:io Mar 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants