Reduce size of load query to prime event_types and states_meta at startup (#89677)

This commit is contained in:
J. Nick Koston 2023-03-14 10:31:31 -10:00 committed by GitHub
parent c2c809682a
commit 0630b7b962
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 17 deletions

View file

@ -793,13 +793,13 @@ class Recorder(threading.Thread):
until its primed. until its primed.
""" """
assert self.event_session is not None assert self.event_session is not None
if hashes := [ if hashes := {
StateAttributes.hash_shared_attrs_bytes(shared_attrs_bytes) StateAttributes.hash_shared_attrs_bytes(shared_attrs_bytes)
for event in events for event in events
if ( if (
shared_attrs_bytes := self._serialize_state_attributes_from_event(event) shared_attrs_bytes := self._serialize_state_attributes_from_event(event)
) )
]: }:
with self.event_session.no_autoflush: with self.event_session.no_autoflush:
for hash_chunk in chunked(hashes, SQLITE_MAX_BIND_VARS): for hash_chunk in chunked(hashes, SQLITE_MAX_BIND_VARS):
for id_, shared_attrs in self.event_session.execute( for id_, shared_attrs in self.event_session.execute(
@ -815,11 +815,11 @@ class Recorder(threading.Thread):
the data in the database for every event until its primed. the data in the database for every event until its primed.
""" """
assert self.event_session is not None assert self.event_session is not None
if hashes := [ if hashes := {
EventData.hash_shared_data_bytes(shared_event_bytes) EventData.hash_shared_data_bytes(shared_event_bytes)
for event in events for event in events
if (shared_event_bytes := self._serialize_event_data_from_event(event)) if (shared_event_bytes := self._serialize_event_data_from_event(event))
]: }:
with self.event_session.no_autoflush: with self.event_session.no_autoflush:
for hash_chunk in chunked(hashes, SQLITE_MAX_BIND_VARS): for hash_chunk in chunked(hashes, SQLITE_MAX_BIND_VARS):
for id_, shared_data in self.event_session.execute( for id_, shared_data in self.event_session.execute(

View file

@ -9,8 +9,10 @@ from sqlalchemy.orm.session import Session
from homeassistant.core import Event from homeassistant.core import Event
from ..const import SQLITE_MAX_BIND_VARS
from ..db_schema import EventTypes from ..db_schema import EventTypes
from ..queries import find_event_type_ids from ..queries import find_event_type_ids
from ..util import chunked
CACHE_SIZE = 2048 CACHE_SIZE = 2048
@ -27,7 +29,7 @@ class EventTypeManager:
def load(self, events: list[Event], session: Session) -> None: def load(self, events: list[Event], session: Session) -> None:
"""Load the event_type to event_type_ids mapping into memory.""" """Load the event_type to event_type_ids mapping into memory."""
self.get_many( self.get_many(
(event.event_type for event in events if event.event_type is not None), {event.event_type for event in events if event.event_type is not None},
session, session,
) )
@ -51,12 +53,13 @@ class EventTypeManager:
return results return results
with session.no_autoflush: with session.no_autoflush:
for event_type_id, event_type in session.execute( for missing_chunk in chunked(missing, SQLITE_MAX_BIND_VARS):
find_event_type_ids(missing) for event_type_id, event_type in session.execute(
): find_event_type_ids(missing_chunk)
results[event_type] = self._id_map[event_type] = cast( ):
int, event_type_id results[event_type] = self._id_map[event_type] = cast(
) int, event_type_id
)
return results return results

View file

@ -9,8 +9,10 @@ from sqlalchemy.orm.session import Session
from homeassistant.core import Event from homeassistant.core import Event
from ..const import SQLITE_MAX_BIND_VARS
from ..db_schema import StatesMeta from ..db_schema import StatesMeta
from ..queries import find_all_states_metadata_ids, find_states_metadata_ids from ..queries import find_all_states_metadata_ids, find_states_metadata_ids
from ..util import chunked
CACHE_SIZE = 8192 CACHE_SIZE = 8192
@ -27,11 +29,11 @@ class StatesMetaManager:
def load(self, events: list[Event], session: Session) -> None: def load(self, events: list[Event], session: Session) -> None:
"""Load the entity_id to metadata_id mapping into memory.""" """Load the entity_id to metadata_id mapping into memory."""
self.get_many( self.get_many(
( {
event.data["new_state"].entity_id event.data["new_state"].entity_id
for event in events for event in events
if event.data.get("new_state") is not None if event.data.get("new_state") is not None
), },
session, session,
) )
@ -60,10 +62,13 @@ class StatesMetaManager:
return results return results
with session.no_autoflush: with session.no_autoflush:
for metadata_id, entity_id in session.execute( for missing_chunk in chunked(missing, SQLITE_MAX_BIND_VARS):
find_states_metadata_ids(missing) for metadata_id, entity_id in session.execute(
): find_states_metadata_ids(missing_chunk)
results[entity_id] = self._id_map[entity_id] = cast(int, metadata_id) ):
results[entity_id] = self._id_map[entity_id] = cast(
int, metadata_id
)
return results return results