mdb_drop optimization

If we know there are no sub-DBs and no overflow pages, skip leaf scan.
mdb.RE/0.9
Howard Chu 9 years ago
parent 0820431975
commit f9cdc4f032
  1. 11
      libraries/liblmdb/mdb.c

@ -9660,8 +9660,11 @@ mdb_drop0(MDB_cursor *mc, int subs)
/* DUPSORT sub-DBs have no ovpages/DBs. Omit scanning leaves. /* DUPSORT sub-DBs have no ovpages/DBs. Omit scanning leaves.
* This also avoids any P_LEAF2 pages, which have no nodes. * This also avoids any P_LEAF2 pages, which have no nodes.
* Also if the DB doesn't have sub-DBs and has no overflow
* pages, omit scanning leaves.
*/ */
if (mc->mc_flags & C_SUB) if ((mc->mc_flags & C_SUB) ||
(!subs && !mc->mc_db->md_overflow_pages))
mdb_cursor_pop(mc); mdb_cursor_pop(mc);
mdb_cursor_copy(mc, &mx); mdb_cursor_copy(mc, &mx);
@ -9683,6 +9686,9 @@ mdb_drop0(MDB_cursor *mc, int subs)
pg, omp->mp_pages); pg, omp->mp_pages);
if (rc) if (rc)
goto done; goto done;
mc->mc_db->md_overflow_pages -= omp->mp_pages;
if (!mc->mc_db->md_overflow_pages && !subs)
break;
} else if (subs && (ni->mn_flags & F_SUBDATA)) { } else if (subs && (ni->mn_flags & F_SUBDATA)) {
mdb_xcursor_init1(mc, ni); mdb_xcursor_init1(mc, ni);
rc = mdb_drop0(&mc->mc_xcursor->mx_cursor, 0); rc = mdb_drop0(&mc->mc_xcursor->mx_cursor, 0);
@ -9690,6 +9696,8 @@ mdb_drop0(MDB_cursor *mc, int subs)
goto done; goto done;
} }
} }
if (!subs && !mc->mc_db->md_overflow_pages)
goto pop;
} else { } else {
if ((rc = mdb_midl_need(&txn->mt_free_pgs, n)) != 0) if ((rc = mdb_midl_need(&txn->mt_free_pgs, n)) != 0)
goto done; goto done;
@ -9711,6 +9719,7 @@ mdb_drop0(MDB_cursor *mc, int subs)
/* no more siblings, go back to beginning /* no more siblings, go back to beginning
* of previous level. * of previous level.
*/ */
pop:
mdb_cursor_pop(mc); mdb_cursor_pop(mc);
mc->mc_ki[0] = 0; mc->mc_ki[0] = 0;
for (i=1; i<mc->mc_snum; i++) { for (i=1; i<mc->mc_snum; i++) {

Loading…
Cancel
Save