You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

160 lines
6.3 KiB

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Reverse BTree Splits</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="start" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
<link rel="up" href="txnconcurrency.html" title="Chapter 4. Concurrency" />
<link rel="prev" href="txnnowait.html" title="No Wait on Blocks" />
<link rel="next" href="filemanagement.html" title="Chapter 5. Managing DB Files" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 12.1.6.2</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Reverse BTree Splits</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="txnnowait.html">Prev</a> </td>
<th width="60%" align="center">Chapter 4. Concurrency</th>
<td width="20%" align="right"> <a accesskey="n" href="filemanagement.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="reversesplit"></a>Reverse BTree Splits</h2>
</div>
</div>
</div>
<p>
If your application is using the Btree access method, and your
application is repeatedly deleting then adding records to your
database, then you might be able to reduce lock contention by
turning off reverse Btree splits.
</p>
<p>
As pages are emptied in a database, DB attempts to
delete empty pages in order to keep
the database as small as possible and minimize search time.
Moreover, when a page in the database fills
up, DB, of course, adds additional pages
to make room for more data.
</p>
<p>
Adding and deleting pages in the database requires that the
writing thread lock the parent page. Consequently, as the
number of pages in your database diminishes, your application
will see increasingly more lock contention; the maximum level
of concurrency in a database of two pages is far smaller than
that in a database of 100 pages, because there are fewer pages
that can be locked.
</p>
<p>
Therefore, if you prevent the database from being reduced to a
minimum number of pages, you can improve your application's
concurrency throughput. Note, however, that you should do so
only if your application tends to delete and then add the same
data. If this is not the case, then preventing reverse Btree
splits can harm your database search time.
</p>
<p>
To turn off reverse Btree splits,
<span>
provide the
<code class="literal">DB_REVSPLITOFF</code> flag to the
<code class="methodname">Db::set_flags()</code>
method.
</span>
</p>
<p>
For example:
</p>
<pre class="programlisting">#include "db_cxx.h"
...
int main(void)
{
u_int32_t env_flags = DB_CREATE | // If the environment does not
// exist, create it.
DB_INIT_LOCK | // Initialize locking
DB_INIT_LOG | // Initialize locking
DB_INIT_MPOOL | // Initialize the cache
DB_THREAD | // Free-thread the env handle
DB_INIT_TXN; // Initialize transactions
u_int32_t db_flags = DB_CREATE | DB_AUTO_COMMIT;
Db *dbp = NULL;
const char *file_name = "mydb.db";
std::string envHome("/export1/testEnv");
DbEnv myEnv(0);
try {
myEnv.open(envHome.c_str(), env_flags, 0);
dbp = new Db(&amp;myEnv, 0);
// Turn off BTree reverse split.
dbp=&gt;set_flags(DB_REVSPLITOFF);
dbp-&gt;open(dbp, // Pointer to the database
NULL, // Txn pointer
file_name, // File name
NULL, // Logical db name
DB_BTREE, // Database type (using btree)
db_flags, // Open flags
0); // File mode. Using defaults
} catch(DbException &amp;e) {
std::cerr &lt;&lt; "Error opening database and environment: "
&lt;&lt; file_name &lt;&lt; ", " &lt;&lt; envHome &lt;&lt; std::endl;
std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
}
try {
dbp-&gt;close(dbp, 0);
myEnv.close(0);
} catch(DbException &amp;e) {
std::cerr &lt;&lt; "Error closing database and environment: "
&lt;&lt; file_name &lt;&lt; ", " &lt;&lt; envHome &lt;&lt; std::endl;
std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
return (EXIT_FAILURE);
}
return (EXIT_SUCCESS);
} </pre>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="txnnowait.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="txnconcurrency.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="filemanagement.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">No Wait on Blocks </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Chapter 5. Managing DB Files</td>
</tr>
</table>
</div>
</body>
</html>