From 616821a090e77daa43a01bdf93717c95a90a6193 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 10 Apr 2024 15:38:40 +0800 Subject: [PATCH] :zap: Reduce disk reads when editing documents https://github.com/siyuan-note/siyuan/issues/10961 --- kernel/sql/database.go | 48 ++++++------------------------------------ 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/kernel/sql/database.go b/kernel/sql/database.go index dcd0b9bf2..d709b2964 100644 --- a/kernel/sql/database.go +++ b/kernel/sql/database.go @@ -959,59 +959,25 @@ func deleteByBoxTx(tx *sql.Tx, box string) (err error) { } func deleteBlocksByIDs(tx *sql.Tx, ids []string) (err error) { - placeholders := strings.Repeat("?,", len(ids)) - placeholders = placeholders[:len(placeholders)-1] - stmt := "DELETE FROM blocks WHERE id IN (" + placeholders + ")" - args := make([]interface{}, len(ids)) - for i, id := range ids { - args[i] = id - } - if err = execStmtTx(tx, stmt, args...); nil != err { - return - } - var ftsIDs []string for _, id := range ids { removeBlockCache(id) ftsIDs = append(ftsIDs, "\""+id+"\"") } - stmt = "SELECT ROWID FROM blocks_fts WHERE blocks_fts MATCH 'id:(" + strings.Join(ftsIDs, " OR ") + ")'" - rows, err := tx.Query(stmt) - if nil != err { - logging.LogErrorf("query blocks_fts failed: %s", err) + + stmt := "DELETE FROM blocks WHERE id IN (" + strings.Join(ftsIDs, ",") + ")" + if err = execStmtTx(tx, stmt); nil != err { return } - var rowIDs []string - for rows.Next() { - var rowID int - if err = rows.Scan(&rowID); nil != err { - return - } - rowIDs = append(rowIDs, fmt.Sprintf("%d", rowID)) - } - rows.Close() - stmt = "DELETE FROM blocks_fts WHERE rowid IN (" + strings.Join(rowIDs, ",") + ")" + + ftsIDsMatch := strings.Join(ftsIDs, " OR ") + stmt = "DELETE FROM blocks_fts WHERE rowid IN (SELECT ROWID FROM blocks_fts WHERE blocks_fts MATCH 'id:(" + ftsIDsMatch + ")')" if err = execStmtTx(tx, stmt); nil != err { return } if !caseSensitive { - stmt = "SELECT ROWID FROM blocks_fts_case_insensitive WHERE blocks_fts_case_insensitive MATCH 'id:(" + strings.Join(ftsIDs, " OR ") + ")'" - rows, err = tx.Query(stmt) - if nil != err { - logging.LogErrorf("query blocks_fts_case_insensitive failed: %s", err) - return - } - rowIDs = nil - for rows.Next() { - var rowID int - if err = rows.Scan(&rowID); nil != err { - return - } - rowIDs = append(rowIDs, fmt.Sprintf("%d", rowID)) - } - rows.Close() - stmt = "DELETE FROM blocks_fts_case_insensitive WHERE rowid IN (" + strings.Join(rowIDs, ",") + ")" + stmt = "DELETE FROM blocks_fts_case_insensitive WHERE rowid IN (SELECT ROWID FROM blocks_fts_case_insensitive WHERE blocks_fts_case_insensitive MATCH 'id:(" + ftsIDsMatch + ")')" if err = execStmtTx(tx, stmt); nil != err { return }