From f07f844d39edd9b8ad67f4433c1e955905dfb685 Mon Sep 17 00:00:00 2001 From: hj24 Date: Wed, 11 Feb 2026 13:59:13 +0800 Subject: [PATCH] fix: optimize message scan sql --- api/models/model.py | 1 - .../retention/conversation/messages_clean_service.py | 8 ++------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/api/models/model.py b/api/models/model.py index c1c6e04ce9..513703224e 100644 --- a/api/models/model.py +++ b/api/models/model.py @@ -1038,7 +1038,6 @@ class Message(Base): Index("message_end_user_idx", "app_id", "from_source", "from_end_user_id"), Index("message_account_idx", "app_id", "from_source", "from_account_id"), Index("message_workflow_run_id_idx", "conversation_id", "workflow_run_id"), - Index("message_created_at_idx", "created_at"), Index("message_app_mode_idx", "app_mode"), Index("message_created_at_id_idx", "created_at", "id"), ) diff --git a/api/services/retention/conversation/messages_clean_service.py b/api/services/retention/conversation/messages_clean_service.py index 93a3cff93d..b095aaa7d5 100644 --- a/api/services/retention/conversation/messages_clean_service.py +++ b/api/services/retention/conversation/messages_clean_service.py @@ -6,7 +6,7 @@ import time from collections.abc import Sequence from typing import cast -from sqlalchemy import delete, select +from sqlalchemy import delete, select, tuple_ from sqlalchemy.engine import CursorResult from sqlalchemy.orm import Session @@ -215,13 +215,9 @@ class MessagesCleanService: msg_stmt = msg_stmt.where(Message.created_at >= self._start_from) # Apply cursor condition: (created_at, id) > (last_created_at, last_message_id) - # This translates to: - # created_at > last_created_at OR (created_at = last_created_at AND id > last_message_id) if _cursor: - # Continuing from previous batch msg_stmt = msg_stmt.where( - (Message.created_at > _cursor[0]) - | ((Message.created_at == _cursor[0]) & (Message.id > _cursor[1])) + tuple_(Message.created_at, Message.id) > tuple_(_cursor[0], _cursor[1]) ) raw_messages = list(session.execute(msg_stmt).all())