Jelajahi Sumber

:zap: Reduce disk reads when editing documents https://github.com/siyuan-note/siyuan/issues/10961

Daniel 1 tahun lalu
induk
melakukan
616821a090
1 mengubah file dengan 7 tambahan dan 41 penghapusan
  1. 7 41
      kernel/sql/database.go

+ 7 - 41
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) {
 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
 	var ftsIDs []string
 	for _, id := range ids {
 	for _, id := range ids {
 		removeBlockCache(id)
 		removeBlockCache(id)
 		ftsIDs = append(ftsIDs, "\""+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
 		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 {
 	if err = execStmtTx(tx, stmt); nil != err {
 		return
 		return
 	}
 	}
 
 
 	if !caseSensitive {
 	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 {
 		if err = execStmtTx(tx, stmt); nil != err {
 			return
 			return
 		}
 		}