Skip to content

Commit 1636976

Browse files
committed
add DbSession.get_chunk_overview_stats to optimize GetDbOverviewAction on db with tons of chunks
1 parent 59459eb commit 1636976

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

prime_backup/action/get_db_overview_action.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ def run(self) -> DbOverviewResult:
4646
with DbAccess.open_session() as session:
4747
meta = session.get_db_meta()
4848
blob_size_sums = session.get_blob_size_sums_by_storage_method()
49+
chunk_stats = session.get_chunk_overview_stats()
4950
return DbOverviewResult(
5051
db_version=meta.version,
5152
hash_method=meta.hash_method,
5253

5354
blob_count=session.get_blob_count(),
54-
chunk_count=session.get_chunk_count(),
55+
chunk_count=chunk_stats.count,
5556
chunk_group_count=session.get_chunk_group_count(),
5657
chunk_group_chunk_binding_count=session.get_chunk_group_chunk_binding_count(),
5758
blob_chunk_group_binding_count=session.get_blob_chunk_group_binding_count(),
@@ -68,8 +69,8 @@ def run(self) -> DbOverviewResult:
6869
chunked_blob_stored_size_sum=blob_size_sums[BlobStorageMethod.chunked].stored_size,
6970
chunked_blob_raw_size_sum=blob_size_sums[BlobStorageMethod.chunked].raw_size,
7071
chunked_blob_chunk_count=session.get_chunked_blob_chunk_count(),
71-
chunk_raw_size_sum=session.get_chunk_raw_size_sum(),
72-
chunk_stored_size_sum=session.get_chunk_stored_size_sum(),
72+
chunk_raw_size_sum=chunk_stats.raw_size_sum,
73+
chunk_stored_size_sum=chunk_stats.stored_size_sum,
7374
file_raw_size_sum=session.get_file_total_raw_size_sum(),
7475

7576
db_file_size=db_file_size,

prime_backup/db/session.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,24 @@ def get_chunk_raw_size_sum(self) -> int:
431431
def get_chunk_stored_size_sum(self) -> int:
432432
return _int_or_0(self.session.execute(func.sum(schema.Chunk.stored_size).select()).scalar_one())
433433

434+
@dataclasses.dataclass(frozen=True)
435+
class ChunkOverviewStats:
436+
count: int
437+
stored_size_sum: int
438+
raw_size_sum: int
439+
440+
def get_chunk_overview_stats(self) -> ChunkOverviewStats:
441+
count, stored_size_sum, raw_size_sum = self.session.execute(select(
442+
func.count(schema.Chunk.id),
443+
func.sum(schema.Chunk.stored_size),
444+
func.sum(schema.Chunk.raw_size)
445+
)).one()
446+
return self.ChunkOverviewStats(
447+
count=_int_or_0(count),
448+
stored_size_sum=_int_or_0(stored_size_sum),
449+
raw_size_sum=_int_or_0(raw_size_sum),
450+
)
451+
434452
def list_chunks(self, limit: Optional[int] = None, offset: Optional[int] = None) -> List[schema.Chunk]:
435453
s = select(schema.Chunk)
436454
if limit is not None:

0 commit comments

Comments
 (0)