mirror of
https://github.com/discourse/discourse.git
synced 2024-12-04 16:03:38 +08:00
bd301c3f08
Optimize `UserStatpost_read_count` calculation. In addition, tests were updated to fail when code is not evaluated. Creation of PostTiming was updating `post_read_count`. Count it has to be reset to ensure that ensure_consitency correctly calculates result. Extracting users seen in the last hour to separate Common Table Expression reduces the amount of processed rows. Before ``` Update on user_stats (cost=267492.07..270822.95 rows=2900 width=174) (actual time=12606.121..12606.127 rows=0 loops=1) -> Hash Join (cost=267492.07..270822.95 rows=2900 width=174) (actual time=12561.814..12603.689 rows=10 loops=1) Hash Cond: (user_stats.user_id = x.user_id) Join Filter: (x.c <> user_stats.posts_read_count) Rows Removed by Join Filter: 67 -> Seq Scan on user_stats (cost=0.00..3125.34 rows=75534 width=134) (actual time=0.014..39.173 rows=75534 loops=1) -> Hash (cost=267455.80..267455.80 rows=2901 width=48) (actual time=12558.613..12558.617 rows=77 loops=1) Buckets: 4096 Batches: 1 Memory Usage: 39kB -> Subquery Scan on x (cost=267376.03..267455.80 rows=2901 width=48) (actual time=12168.601..12558.572 rows=77 loops=1) -> GroupAggregate (cost=267376.03..267426.79 rows=2901 width=12) (actual time=12168.595..12558.525 rows=77 loops=1) Group Key: pt.user_id -> Sort (cost=267376.03..267383.28 rows=2901 width=4) (actual time=12100.490..12352.106 rows=2072830 loops=1) Sort Key: pt.user_id Sort Method: external merge Disk: 28488kB -> Nested Loop (cost=1.28..267209.18 rows=2901 width=4) (actual time=0.040..11528.680 rows=2072830 loops=1) -> Nested Loop (cost=0.86..261390.02 rows=13159 width=8) (actual time=0.030..3492.887 rows=3581648 loops=1) -> Index Scan using index_users_on_last_seen_at on users u (cost=0.42..89.71 rows=28 width=4) (actual time=0.010..0.201 rows=78 loops=1) Index Cond: (last_seen_at > '2023-04-11 00:22:49.555537'::timestamp without time zone) -> Index Scan using index_post_timings_on_user_id on post_timings pt (cost=0.44..9287.60 rows=4455 width=8) (actual time=0.081..38.542 rows=45919 loops=78) Index Cond: (user_id = u.id) -> Index Scan using forum_threads_pkey on topics t (cost=0.42..0.44 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=3581648) Index Cond: (id = pt.topic_id) Filter: ((deleted_at IS NULL) AND ((archetype)::text = 'regular'::text)) Rows Removed by Filter: 0 Planning Time: 0.692 ms Execution Time: 12612.587 ms ``` After ``` Update on user_stats (cost=9473.60..12804.30 rows=2828 width=174) (actual time=677.724..677.729 rows=0 loops=1) -> Hash Join (cost=9473.60..12804.30 rows=2828 width=174) (actual time=672.536..677.706 rows=1 loops=1) Hash Cond: (user_stats.user_id = x.user_id) Join Filter: (x.c <> user_stats.posts_read_count) Rows Removed by Join Filter: 54 -> Seq Scan on user_stats (cost=0.00..3125.34 rows=75534 width=134) (actual time=0.012..23.977 rows=75534 loops=1) -> Hash (cost=9438.24..9438.24 rows=2829 width=48) (actual time=647.818..647.822 rows=55 loops=1) Buckets: 4096 Batches: 1 Memory Usage: 37kB -> Subquery Scan on x (cost=9381.66..9438.24 rows=2829 width=48) (actual time=647.409..647.805 rows=55 loops=1) -> HashAggregate (cost=9381.66..9409.95 rows=2829 width=12) (actual time=647.403..647.786 rows=55 loops=1) Group Key: pt.user_id Batches: 1 Memory Usage: 121kB -> Nested Loop (cost=1.86..9367.51 rows=2829 width=4) (actual time=0.056..625.245 rows=120022 loops=1) -> Nested Loop (cost=1.44..3692.96 rows=12832 width=8) (actual time=0.047..171.754 rows=217440 loops=1) -> Nested Loop (cost=1.00..254.63 rows=25 width=12) (actual time=0.030..1.407 rows=56 loops=1) Join Filter: (u.id = user_stats_1.user_id) -> Nested Loop (cost=0.71..243.08 rows=25 width=8) (actual time=0.018..1.207 rows=87 loops=1) -> Index Scan using index_users_on_last_seen_at on users u (cost=0.42..86.71 rows=27 width=4) (actual time=0.009..0.156 rows=87 loops=1) Index Cond: (last_seen_at > '2023-04-11 00:47:07.437568'::timestamp without time zone) -> Index Only Scan using user_stats_pkey on user_stats us (cost=0.29..5.79 rows=1 width=4) (actual time=0.011..0.011 rows=1 loops=87) Index Cond: (user_id = u.id) Heap Fetches: 87 -> Index Scan using user_stats_pkey on user_stats user_stats_1 (cost=0.29..0.45 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=87) Index Cond: (user_id = us.user_id) Filter: (posts_read_count < 10000) Rows Removed by Filter: 0 -> Index Scan using index_post_timings_on_user_id on post_timings pt (cost=0.44..92.98 rows=4455 width=8) (actual time=0.036..2.492 rows=3883 loops=56) Index Cond: (user_id = user_stats_1.user_id) -> Index Scan using forum_threads_pkey on topics t (cost=0.42..0.44 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=217440) Index Cond: (id = pt.topic_id) Filter: ((deleted_at IS NULL) AND ((archetype)::text = 'regular'::text)) Rows Removed by Filter: 0 Planning Time: 1.406 ms Execution Time: 677.817 ms ``` |
||
---|---|---|
.. | ||
concerns | ||
about.rb | ||
admin_dashboard_data.rb | ||
admin_dashboard_general_data.rb | ||
admin_dashboard_index_data.rb | ||
allowed_pm_user.rb | ||
anonymous_user.rb | ||
api_key_scope.rb | ||
api_key.rb | ||
application_request.rb | ||
associated_group.rb | ||
auto_track_duration_site_setting.rb | ||
backup_draft_post.rb | ||
backup_draft_topic.rb | ||
backup_file.rb | ||
backup_location_site_setting.rb | ||
backup_metadata.rb | ||
badge_grouping.rb | ||
badge_type.rb | ||
badge.rb | ||
base_font_setting.rb | ||
bookmark.rb | ||
category_and_topic_lists.rb | ||
category_custom_field.rb | ||
category_featured_topic.rb | ||
category_group.rb | ||
category_list.rb | ||
category_page_style.rb | ||
category_required_tag_group.rb | ||
category_search_data.rb | ||
category_tag_group.rb | ||
category_tag_stat.rb | ||
category_tag.rb | ||
category_user.rb | ||
category.rb | ||
child_theme.rb | ||
color_scheme_color.rb | ||
color_scheme_setting.rb | ||
color_scheme.rb | ||
custom_emoji.rb | ||
developer.rb | ||
digest_email_site_setting.rb | ||
directory_column.rb | ||
directory_item.rb | ||
discourse_connect.rb | ||
discourse_version_check.rb | ||
dismissed_topic_user.rb | ||
do_not_disturb_timing.rb | ||
draft_sequence.rb | ||
draft.rb | ||
email_change_request.rb | ||
email_level_site_setting.rb | ||
email_log.rb | ||
email_style.rb | ||
email_token.rb | ||
embeddable_host.rb | ||
embedding.rb | ||
emoji_set_site_setting.rb | ||
emoji.rb | ||
external_upload_stub.rb | ||
given_daily_like.rb | ||
global_setting.rb | ||
group_archived_message.rb | ||
group_associated_group.rb | ||
group_category_notification_default.rb | ||
group_custom_field.rb | ||
group_history.rb | ||
group_manager.rb | ||
group_mention.rb | ||
group_request.rb | ||
group_tag_notification_default.rb | ||
group_user.rb | ||
group.rb | ||
ignored_user.rb | ||
imap_sync_log.rb | ||
incoming_domain.rb | ||
incoming_email.rb | ||
incoming_link.rb | ||
incoming_links_report.rb | ||
incoming_referer.rb | ||
invite_redeemer.rb | ||
invite.rb | ||
invited_group.rb | ||
invited_user.rb | ||
javascript_cache.rb | ||
like_notification_frequency_site_setting.rb | ||
linked_topic.rb | ||
locale_site_setting.rb | ||
mailing_list_mode_site_setting.rb | ||
muted_user.rb | ||
navigation_menu_site_setting.rb | ||
new_topic_duration_site_setting.rb | ||
notification_level_when_replying_site_setting.rb | ||
notification.rb | ||
oauth2_user_info.rb | ||
onceoff_log.rb | ||
optimized_image.rb | ||
permalink.rb | ||
plugin_store_row.rb | ||
plugin_store.rb | ||
post_action_type.rb | ||
post_action.rb | ||
post_analyzer.rb | ||
post_custom_field.rb | ||
post_detail.rb | ||
post_hotlinked_media.rb | ||
post_mover.rb | ||
post_reply_key.rb | ||
post_reply.rb | ||
post_revision.rb | ||
post_search_data.rb | ||
post_stat.rb | ||
post_timing.rb | ||
post_upload.rb | ||
post.rb | ||
previous_replies_site_setting.rb | ||
private_message_topic_tracking_state.rb | ||
published_page.rb | ||
push_subscription.rb | ||
quoted_post.rb | ||
remote_theme.rb | ||
remove_muted_tags_from_latest_site_setting.rb | ||
report.rb | ||
reviewable_claimed_topic.rb | ||
reviewable_flagged_post.rb | ||
reviewable_history.rb | ||
reviewable_post.rb | ||
reviewable_priority_setting.rb | ||
reviewable_queued_post.rb | ||
reviewable_score.rb | ||
reviewable_sensitivity_setting.rb | ||
reviewable_user.rb | ||
reviewable.rb | ||
s3_region_site_setting.rb | ||
screened_email.rb | ||
screened_ip_address.rb | ||
screened_url.rb | ||
search_log.rb | ||
shared_draft.rb | ||
shelved_notification.rb | ||
sidebar_section_link.rb | ||
single_sign_on_record.rb | ||
site_setting.rb | ||
site.rb | ||
sitemap.rb | ||
skipped_email_log.rb | ||
slug_setting.rb | ||
stylesheet_cache.rb | ||
tag_group_membership.rb | ||
tag_group_permission.rb | ||
tag_group.rb | ||
tag_search_data.rb | ||
tag_user.rb | ||
tag.rb | ||
theme_field.rb | ||
theme_modifier_set.rb | ||
theme_setting.rb | ||
theme_translation_override.rb | ||
theme.rb | ||
top_lists.rb | ||
top_menu_item.rb | ||
top_topic.rb | ||
topic_allowed_group.rb | ||
topic_allowed_user.rb | ||
topic_converter.rb | ||
topic_custom_field.rb | ||
topic_embed.rb | ||
topic_featured_users.rb | ||
topic_group.rb | ||
topic_invite.rb | ||
topic_link_click.rb | ||
topic_link.rb | ||
topic_list.rb | ||
topic_notifier.rb | ||
topic_participants_summary.rb | ||
topic_poster.rb | ||
topic_posters_summary.rb | ||
topic_search_data.rb | ||
topic_tag.rb | ||
topic_thumbnail.rb | ||
topic_timer.rb | ||
topic_tracking_state.rb | ||
topic_user.rb | ||
topic_view_item.rb | ||
topic.rb | ||
translation_override.rb | ||
trust_level_and_staff_and_disabled_setting.rb | ||
trust_level_and_staff_setting.rb | ||
trust_level_setting.rb | ||
trust_level3_requirements.rb | ||
unsubscribe_key.rb | ||
upload_reference.rb | ||
upload.rb | ||
user_action.rb | ||
user_api_key_scope.rb | ||
user_api_key.rb | ||
user_archived_message.rb | ||
user_associated_account.rb | ||
user_associated_group.rb | ||
user_auth_token_log.rb | ||
user_auth_token.rb | ||
user_avatar.rb | ||
user_badge.rb | ||
user_badges.rb | ||
user_bookmark_list.rb | ||
user_custom_field.rb | ||
user_email.rb | ||
user_export.rb | ||
user_field_option.rb | ||
user_field.rb | ||
user_history.rb | ||
user_ip_address_history.rb | ||
user_notification_schedule.rb | ||
user_open_id.rb | ||
user_option.rb | ||
user_profile_view.rb | ||
user_profile.rb | ||
user_search_data.rb | ||
user_search.rb | ||
user_second_factor.rb | ||
user_security_key.rb | ||
user_stat.rb | ||
user_status.rb | ||
user_summary.rb | ||
user_upload.rb | ||
user_visit.rb | ||
user_warning.rb | ||
user.rb | ||
username_validator.rb | ||
watched_word.rb | ||
web_crawler_request.rb | ||
web_hook_event_type.rb | ||
web_hook_event.rb | ||
web_hook.rb |