From 2f3bb5b169ed3c82a4b92b5045655a3636fe37bf Mon Sep 17 00:00:00 2001 From: Daniel Vaz Gaspar Date: Mon, 15 Jan 2024 19:04:44 +0000 Subject: [PATCH] fix: improve performance on reports log queries (#26416) --- UPDATING.md | 2 + ...a167d4c62e_add_indexes_to_report_models.py | 64 +++++++++++++++++++ superset/reports/models.py | 10 +++ 3 files changed, 76 insertions(+) create mode 100644 superset/migrations/versions/2024-01-05_16-20_65a167d4c62e_add_indexes_to_report_models.py diff --git a/UPDATING.md b/UPDATING.md index b5c48924b727e..79c2e09286261 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -31,6 +31,8 @@ assists people when migrating to a new version. ### Potential Downtime +- [26416](https://github.com/apache/superset/pull/26416): adds 2 database indexes to report_execution_log and 1 to report_recipient to improve performance, this may cause downtime on large deployments. + ### Other - [24982](https://github.com/apache/superset/pull/24982): By default, physical datasets on Oracle-like dialects like Snowflake will now use denormalized column names. However, existing datasets won't be affected. To change this behavior, the "Advanced" section on the dataset modal has a "Normalize column names" flag which can be changed to change this behavior. diff --git a/superset/migrations/versions/2024-01-05_16-20_65a167d4c62e_add_indexes_to_report_models.py b/superset/migrations/versions/2024-01-05_16-20_65a167d4c62e_add_indexes_to_report_models.py new file mode 100644 index 0000000000000..e82ed2421e3a3 --- /dev/null +++ b/superset/migrations/versions/2024-01-05_16-20_65a167d4c62e_add_indexes_to_report_models.py @@ -0,0 +1,64 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""add indexes to report models + +Revision ID: 65a167d4c62e +Revises: 06dd9ff00fe8 +Create Date: 2024-01-05 16:20:31.598995 + +""" + +# revision identifiers, used by Alembic. +revision = "65a167d4c62e" +down_revision = "06dd9ff00fe8" + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + + +def upgrade(): + op.create_index( + "ix_report_execution_log_report_schedule_id", + "report_execution_log", + ["report_schedule_id"], + unique=False, + ) + op.create_index( + "ix_report_execution_log_start_dttm", + "report_execution_log", + ["start_dttm"], + unique=False, + ) + op.create_index( + "ix_report_recipient_report_schedule_id", + "report_recipient", + ["report_schedule_id"], + unique=False, + ) + + +def downgrade(): + op.drop_index( + "ix_report_recipient_report_schedule_id", table_name="report_recipient" + ) + op.drop_index( + "ix_report_execution_log_start_dttm", table_name="report_execution_log" + ) + op.drop_index( + "ix_report_execution_log_report_schedule_id", table_name="report_execution_log" + ) diff --git a/superset/reports/models.py b/superset/reports/models.py index 1eb38af8b5fec..59135cda6cbae 100644 --- a/superset/reports/models.py +++ b/superset/reports/models.py @@ -24,6 +24,7 @@ DateTime, Float, ForeignKey, + Index, Integer, String, Table, @@ -196,6 +197,10 @@ class ReportRecipients(Model, AuditMixinNullable): foreign_keys=[report_schedule_id], ) + __table_args__ = ( + Index("ix_report_recipient_report_schedule_id", report_schedule_id), + ) + class ReportExecutionLog(Model): # pylint: disable=too-few-public-methods @@ -228,3 +233,8 @@ class ReportExecutionLog(Model): # pylint: disable=too-few-public-methods backref=backref("logs", cascade="all,delete,delete-orphan"), foreign_keys=[report_schedule_id], ) + + __table_args__ = ( + Index("ix_report_execution_log_report_schedule_id", report_schedule_id), + Index("ix_report_execution_log_start_dttm", start_dttm), + )