]> git.proxmox.com Git - pve-cluster.git/commitdiff
pmxcfs: db: tell query planner that prepared statement are long living
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 22 Apr 2021 08:46:42 +0000 (10:46 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 22 Apr 2021 19:37:55 +0000 (21:37 +0200)
SQLITE_PREPARE_PERSISTENT
    The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner
    that the prepared statement will be retained for a long time and
    probably reused many times. Without this flag,
    sqlite3_prepare_v3() and sqlite3_prepare16_v3() assume that the
    prepared statement will be used just once or at most a few times
    and then destroyed using sqlite3_finalize() relatively soon. The
    current implementation acts on this hint by avoiding the use of
    lookaside memory so as not to deplete the limited store of
    lookaside memory. Future versions of SQLite may act on this hint
    differently.
-- https://sqlite.org/c3ref/c_prepare_normalize.html#sqlitepreparepersistent

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
data/src/database.c

index e3949ef26b392f08dcb0e1ad17dc078c32c31b90..80e0b60bbf6c1cc1a338f2bf2082a307a5126141 100644 (file)
@@ -679,49 +679,53 @@ db_backend_t *bdb_backend_open(
        if (!(bdb->db = bdb_create(filename)))
                goto fail;
 
-       rc = sqlite3_prepare_v2(bdb->db, sql_insert_entry, -1, &bdb->stmt_insert_entry, NULL);
+       // tell the query planner that the prepared statement will be retained for a long time and
+       // probably reused many times
+       const unsigned int flags = SQLITE_PREPARE_PERSISTENT;
+
+       rc = sqlite3_prepare_v3(bdb->db, sql_insert_entry, -1, flags, &bdb->stmt_insert_entry, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_insert_entry' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_update_entry, -1, &bdb->stmt_update_entry, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_update_entry, -1, flags, &bdb->stmt_update_entry, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_update_entry' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_replace_entry, -1, &bdb->stmt_replace_entry, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_replace_entry, -1, flags, &bdb->stmt_replace_entry, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_replace_entry' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_delete_entry, -1, &bdb->stmt_delete_entry, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_delete_entry, -1, flags, &bdb->stmt_delete_entry, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_delete_entry' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_begin, -1, &bdb->stmt_begin, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_begin, -1, flags, &bdb->stmt_begin, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_begin' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_commit, -1, &bdb->stmt_commit, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_commit, -1, flags, &bdb->stmt_commit, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_commit' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_rollback, -1, &bdb->stmt_rollback, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_rollback, -1, flags, &bdb->stmt_rollback, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_rollback' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));
                goto fail;
        }
-       rc = sqlite3_prepare_v2(bdb->db, sql_load_all, -1, &bdb->stmt_load_all, NULL);
+       rc = sqlite3_prepare_v3(bdb->db, sql_load_all, -1, flags, &bdb->stmt_load_all, NULL);
        if (rc != SQLITE_OK) {
                cfs_critical("sqlite3_prepare 'sql_load_all' failed: %s\n", 
                             sqlite3_errmsg(bdb->db));