self join to resolve query performance

This commit is contained in:
J. Nick Koston
2023-03-10 12:05:52 -10:00
parent b2eb220ffe
commit 14514e3851
2 changed files with 13 additions and 7 deletions

View File

@@ -111,9 +111,12 @@ def purge_old_data(
_LOGGER.debug("Cleanup filtered data hasn't fully completed yet")
return False
_purge_old_recorder_runs(instance, session, purge_before)
# This purge cycle is finished, clean up old event types and
# recorder runs
if instance.event_type_manager.active:
_purge_old_event_types(instance, session)
_purge_old_recorder_runs(instance, session, purge_before)
if repack:
repack_database(instance)
return True

View File

@@ -741,12 +741,15 @@ def find_event_types_to_purge() -> StatementLambdaElement:
"""Find event_type_ids to purge."""
return lambda_stmt(
lambda: select(EventTypes.event_type_id, EventTypes.event_type).where(
EventTypes.event_type_id.not_in(
select(EventTypes.event_type_id).join(
used_event_type_ids := select(
distinct(Events.event_type_id).label("used_event_type_id")
).subquery(),
EventTypes.event_type_id
== (
select(distinct(EventTypes.event_type_id).label("unused_event_type_id"))
.filter(EventTypes.event_type_id.not_in(select(Events.event_type_id)))
.subquery()
).c.unused_event_type_id
== used_event_type_ids.c.used_event_type_id,
)
)
)
)