Looking at the calculation of levelStep:
+ /*
+ * Calculate levelStep by available amount of memory. We should be able
to
+ * load into main memory one page of each underlying node buffer (which
+ * are in levelStep below). That give constraint over
+ * maintenance_work_mem. Also we should be able to have subtree of
+ * levelStep level in cache. That give constraint over
+ * effective_cache_size.
+ *
+ * i'th underlying level of sub-tree can consists of
+ * i^maxIndexTuplesPerPage pages at maximum. So, subtree of levelStep
+ * levels can't be greater then 2 * maxIndexTuplesPerPage ^ levelStep
+ * pages. We use some more reserve due to we probably can't take whole
+ * effective cache and use formula 4 * maxIndexTuplesPerPage ^
levelStep =
+ * effectiveCache. We use similar logic with maintenance_work_mem. We
+ * should be able to store at least last pages of all buffers where we
are
+ * emptying current buffer to.
+ */
+ effectiveMemory = Min(maintenance_work_mem * 1024 / BLCKSZ,
+ effective_cache_size);
+ levelStep = (int) log((double) effectiveMemory / 4.0) /
+ log((double) maxIndexTuplesPerPage);
+
I can see that that's equal to the formula given in the paper,
log_B(M/4B), but I couldn't see any explanation for that formula in the
paper. Your explanation makes sense, but where did it come from?
It seems a bit pessimistic: while it's true that the a subtree can't be
larger than 2 * maxIndexTuplesPerPage ^ levelStep, you can put a tighter
upper bound on it. The max size of a subtree of depth n can be
calculated as the geometric series:
r^0 + r^1 + r^2 + ... + r^n = (1 - r^(n + 1)) / (1 - r)
where r = maxIndexTuplesPerPage. For r=2 those formulas are equal, but
for a large r and small n (which is typical), the 2 *
maxIndexTuplesPerPage^levelStep formula gives a value that's almost
twice as large as the real max size of a subtree.
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers