[PR #29467] fix: optimize database query when retrieval knowledge in App #32422

Closed
opened 2026-02-21 20:51:22 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/langgenius/dify/pull/29467

State: closed
Merged: Yes


Important

  1. Make sure you have read our contribution guidelines
  2. Ensure there is an associated issue and you have been assigned to it
  3. Use the correct syntax to link this PR: Fixes #<issue number>.

Summary

Optimization Strategy

  1. Batch Fetch DatasetDocument Records
    Collect all document_id values and perform a single query using an IN clause to retrieve all related DatasetDocument entries at once.
  2. Categorize Documents by Type
    Classify documents into four groups for targeted processing:
    parent_child_text_docs — Text documents of type PARENT_CHILD_INDEX
    parent_child_image_docs — Image documents of type PARENT_CHILD_INDEX
    normal_text_docs — Standard text documents (non–parent-child)
    normal_image_docs — Standard image documents (non–parent-child)
  3. Batch Fetch ChildChunk Records
    For all PARENT_CHILD text documents, extract their index_node_id values and perform one batch query.
  4. Batch Fetch DocumentSegment Records
    For all normal text documents, collect their index_node_id values and fetch all related segments in a single query.
  5. Batch Fetch SegmentAttachmentBinding Records
    For all image documents, gather all attachment_id values and retrieve the bindings using one batch query.
  6. Unified Batch Update
    Accumulate all segment_id values that need updates, and execute a single bulk update instead of multiple individual updates.
  7. Single Commit
    Move db.session.commit() outside any loops and perform only one commit at the end of the entire process to reduce database overhead.

Screenshots

Before After
... ...

Checklist

  • This change requires a documentation update, included: Dify Document
  • I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
  • I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
  • I've updated the documentation accordingly.
  • I ran dev/reformat(backend) and cd web && npx lint-staged(frontend) to appease the lint gods
**Original Pull Request:** https://github.com/langgenius/dify/pull/29467 **State:** closed **Merged:** Yes --- > [!IMPORTANT] > > 1. Make sure you have read our [contribution guidelines](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) > 1. Ensure there is an associated issue and you have been assigned to it > 1. Use the correct syntax to link this PR: `Fixes #<issue number>`. ## Summary Optimization Strategy 1. Batch Fetch DatasetDocument Records Collect all document_id values and perform a single query using an IN clause to retrieve all related DatasetDocument entries at once. 2. Categorize Documents by Type Classify documents into four groups for targeted processing: parent_child_text_docs — Text documents of type PARENT_CHILD_INDEX parent_child_image_docs — Image documents of type PARENT_CHILD_INDEX normal_text_docs — Standard text documents (non–parent-child) normal_image_docs — Standard image documents (non–parent-child) 3. Batch Fetch ChildChunk Records For all PARENT_CHILD text documents, extract their index_node_id values and perform one batch query. 4. Batch Fetch DocumentSegment Records For all normal text documents, collect their index_node_id values and fetch all related segments in a single query. 5. Batch Fetch SegmentAttachmentBinding Records For all image documents, gather all attachment_id values and retrieve the bindings using one batch query. 6. Unified Batch Update Accumulate all segment_id values that need updates, and execute a single bulk update instead of multiple individual updates. 7. Single Commit Move db.session.commit() outside any loops and perform only one commit at the end of the entire process to reduce database overhead. ## Screenshots | Before | After | |--------|-------| | ... | ... | ## Checklist - [ ] This change requires a documentation update, included: [Dify Document](https://github.com/langgenius/dify-docs) - [x] I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!) - [x] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change. - [x] I've updated the documentation accordingly. - [x] I ran `dev/reformat`(backend) and `cd web && npx lint-staged`(frontend) to appease the lint gods
yindo added the pull-request label 2026-02-21 20:51:22 -05:00
yindo closed this issue 2026-02-21 20:51:22 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: langgenius/dify#32422