<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle Berkeley DB 中国研发团队的博客 &#187; SQL</title>
	<atom:link href="http://www.bdbchina.com/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Fri, 09 Jul 2010 06:44:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Oracle Berkeley DB加入SQLite联盟</title>
		<link>http://www.bdbchina.com/2010/07/oracle-berkeley-db%e5%8a%a0%e5%85%a5sqlite%e8%81%94%e7%9b%9f/</link>
		<comments>http://www.bdbchina.com/2010/07/oracle-berkeley-db%e5%8a%a0%e5%85%a5sqlite%e8%81%94%e7%9b%9f/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 02:01:02 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1330</guid>
		<description><![CDATA[我很高兴的宣布，Oracle Berkeley DB正式加入SQLite联盟，成为SQLite赞助商的一员！
我想这将是一个双赢的结果，对于SQLite的发展而言是积极的，得到更多来自厂商的支持；对于使用Oracle Berkeley DB SQL用户而言，我们的SQL接口将和SQLite发展保持一致，所有Berkeley DB (及其使用的SQLite接口)的问题和反馈都可以通过Oracle来得到支持和解决。
更多关于Oracle Berkeley DB SQL的信息，请访问：
* http://www.bdbchina.com/2010/03/oracle-berkeley-db-支持sql啦！/
* http://www.oracle.com/us/products/database/berkeley-db/index.html
跟多关于SQLite的信息，请访问：
* http://sqlite.org/
]]></description>
			<content:encoded><![CDATA[<p>我很高兴的宣布，Oracle Berkeley DB正式加入SQLite联盟，成为SQLite赞助商的一员！</p>
<p>我想这将是一个双赢的结果，对于SQLite的发展而言是积极的，得到更多来自厂商的支持；对于使用Oracle Berkeley DB SQL用户而言，我们的SQL接口将和SQLite发展保持一致，所有Berkeley DB (及其使用的SQLite接口)的问题和反馈都可以通过Oracle来得到支持和解决。</p>
<p>更多关于Oracle Berkeley DB SQL的信息，请访问：</p>
<p>* <a href="http://www.bdbchina.com/2010/03/oracle-berkeley-db-%E6%94%AF%E6%8C%81sql%E5%95%A6%EF%BC%81/">http://www.bdbchina.com/2010/03/oracle-berkeley-db-支持sql啦！/</a></p>
<p>* <a href="http://www.oracle.com/us/products/database/berkeley-db/index.html">http://www.oracle.com/us/products/database/berkeley-db/index.html</a></p>
<p>跟多关于SQLite的信息，请访问：</p>
<p>* <a href="http://sqlite.org/">http://sqlite.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/07/oracle-berkeley-db%e5%8a%a0%e5%85%a5sqlite%e8%81%94%e7%9b%9f/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>在UNIX环境下使用DBSQL作为FireFox/SQLite Manager的底层存储引擎</title>
		<link>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/</link>
		<comments>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 21:59:15 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1305</guid>
		<description><![CDATA[本文介绍如何在UNIX/Linux环境下将FireFox/SQLite Manager的底层存储引擎由SQLite转换为DBSQL.本博客介绍的过程同样也可推及到Google Chrome等使用SQLite作为存储引擎的优秀开源软件.
本文假定您已经根据在unixlinux平台上应用berkeley db 11gr2sql成功编译了DBSQL.
最后,需要特别强调的是,在做存储引擎转换和数据迁移前,必须做好用户数据的备份,以防操作不慎或其它意外造成的数据损坏.

 Firefox 3.6 on Linux 
Firefox distributions do not link to external/system sqlite3 lib. So we have to rebuild firefox from source code to force it to link system sqlite3 by &#8220;&#8211;enable-system-sqlite&#8221;
 1. Install sqlite-3.6.22 
We need original sqlite3 because we have to migrate existing database.
Download http://www.sqlite.org/sqlite-3.6.22.tar.gz

tar zxf sqlite-3.6.22.tar.gz
env CFLAGS="-DSQLITE_SECURE_DELETE=1" ./configure [...]]]></description>
			<content:encoded><![CDATA[<p>本文介绍如何在UNIX/Linux环境下将FireFox/SQLite Manager的底层存储引擎由SQLite转换为DBSQL.本博客介绍的过程同样也可推及到Google Chrome等使用SQLite作为存储引擎的优秀开源软件.</p>
<p>本文假定您已经根据<a href="http://www.bdbchina.com/2010/04/在unixlinux平台上应用berkeley-db-11gr2-sql/">在unixlinux平台上应用berkeley db 11gr2sql</a>成功编译了DBSQL.</p>
<p>最后,需要特别强调的是,在做存储引擎转换和数据迁移前,必须做好用户数据的备份,以防操作不慎或其它意外造成的数据损坏.</p>
<p><span id="more-1305"></span></p>
<h2> Firefox 3.6 on Linux </h2>
<p>Firefox distributions do not link to external/system sqlite3 lib. So we have to rebuild firefox from source code to force it to link system sqlite3 by &#8220;&#8211;enable-system-sqlite&#8221;</p>
<p><strong> 1. Install sqlite-3.6.22 </strong><br />
We need original sqlite3 because we have to migrate existing database.</p>
<p>Download http://www.sqlite.org/sqlite-3.6.22.tar.gz</p>
<pre>
tar zxf sqlite-3.6.22.tar.gz
env CFLAGS="-DSQLITE_SECURE_DELETE=1" ./configure --prefix=/usr
make
sudo make install
</pre>
<p><strong> 2. Build Firefox 3.6 </strong><br />
<strong>Note:This step may replace your system Firefox. Please backup your ~/.mozilla at first.</strong><br />
Get source code</p>
<pre>
mkdir $HOME/src/firefox-3.6
hg clone http://hg.mozilla.org/mozilla-central/ src
cd $HOME/src/firefox-3.6
</pre>
<p>Create a file &#8220;mozconfig&#8221; in current directory. Content of file &#8220;mozconfig&#8221;:</p>
<pre>
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-ff-release
ac_add_options --enable-system-sqlite
ac_add_options --disable-ogg
ac_add_options --disable-wave
ac_add_options --disable-crashreporter
ac_add_options --disable-necko-wifi
</pre>
<p>Build</p>
<pre>
make -f client.mk
sudo make -f client.mk install
</pre>
<p><strong> 3. Buid BDB SQL </strong><br />
Place up-to-date db source code on $HOME/hg/db_x86</p>
<pre>
cd $HOME/hg/db_x86/build_unix
env CFLAGS="-O3" ../dist/configure --enable-sql_compat --enable-sql
make dbsql &#038;&#038; make install
</pre>
<p><strong> 4. Modify Firefox linking </strong></p>
<pre>
cd /usr/local/lib/firefox-3.7a2pre
sudo ln -sf $HOME/install/lib/libdb_sql-5.0.so libsqlite3.so.0
</pre>
<p><strong> 5. Data Migration </strong><br />
(The directory name on my computer is &#8220;yezkdh8w.default&#8221;. It may be different in your platform)<br />
Here is an example for data migration. Here we just take downloads.sqlite as example. You may need to go through all *.sqlite files:</p>
<pre>
cd ~/.mozilla/firefox/
cp yezkdh8w.default yezkdh8w.default.bak -r # backup
cd yezkdh8w.default
bash ../firefox_convert.sh /usr/bin/sqlite3 /home/rucong/install/bin/dbsql
$ sqlite3 downloads.sqlite
SQLite version 3.6.22
Enter ".help" for instructions
sqlite> .echo ON
sqlite> .output dump
.output dump
sqlite> .dump
.dump
sqlite> .quit
.quit
$ mv downloads.sqlite downloads.sqlite.bak
$ ~/hg/db_x86/build_unix/dbsql downloads.sqlite
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .read dump
dbsql> .quit
$ rm dump
</pre>
<p><strong> 6. End </strong><br />
That&#8217;s all. Execute the new Firefox to see how it works.</p>
<hr/>
<h2> SQLite Manager </h2>
<p><strong> 1. Install SQLite Manager </strong><br />
Use above Firefox to visit <a href="https://addons.mozilla.org/en-US/firefox/addon/5817">SQLite Manager Plugin</a> and install it.<br />
Restart Firefox. We can start SQLite Manager by Menu->Tools->SQLite Manager now.</p>
<p><strong> 2. Open a BDB SQL Database </strong></p>
<p><strong>Generate database</strong><br />
Note: The version of BDB SQL has to be the same as the one we applied in Firefox.</p>
<pre>
cd db/build_unix
make ex_sql_binding
./ex_sql_binding
</pre>
<p>Now we get BDB SQL database ex_sql_binding.db.</p>
<p><strong>Use SQLite Manager to open the generated db</strong></p>
<p>Start SQLite Manager to open database db/build_unix/ex_sql_binding.db:<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/SQLiteManager.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/SQLiteManager.png" alt="" title="SQLiteManager" width="667" height="353" class="alignnone size-full wp-image-1308" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using DBSQL JDBC Driver in ADF/JDeveloper</title>
		<link>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/</link>
		<comments>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 09:28:17 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[ADF]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[JDeveloper]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1280</guid>
		<description><![CDATA[Oracle 应用程序开发框架 (Oracle ADF) 是一个端到端 J2EE 框架，该框架通过提供现成的基础架构服务和虚拟的声明式开发体验，从而简化了开发。JDeveloper是Oracle公司开发的Java集成开发环境（IDE）。本博客介绍了如何在ADF/JDeveloper中使用DBSQL作为JDBC数据库连接的引擎。
This guide describes how to apply DBSQL JDBC Driver in integrated development environment ADF/JDeveloper step by step.
Environment:

OS: Windows XP 32bit
ADF Business Components: 11.1.1.56.60
Java(TM) Platform: 1.6.0_18
JDeveloper:   11g Release 1(11.1.1.3.0)


 1. Installing the Berkeley DB 

Make sure that the Java environment you apply in the building should be the [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle 应用程序开发框架 (Oracle ADF) 是一个端到端 J2EE 框架，该框架通过提供现成的基础架构服务和虚拟的声明式开发体验，从而简化了开发。JDeveloper是Oracle公司开发的Java集成开发环境（IDE）。本博客介绍了如何在ADF/JDeveloper中使用DBSQL作为JDBC数据库连接的引擎。</p>
<p>This guide describes how to apply DBSQL JDBC Driver in integrated development environment ADF/JDeveloper step by step.<br />
<strong>Environment:</strong></p>
<ul>
<li>OS: Windows XP 32bit</li>
<li>ADF Business Components: 11.1.1.56.60</li>
<li>Java(TM) Platform: 1.6.0_18</li>
<li>JDeveloper:   11g Release 1(11.1.1.3.0)</li>
</ul>
<p><span id="more-1280"></span></p>
<h2> 1. Installing the Berkeley DB </h2>
<ul>
<li>Make sure that the Java environment you apply in the building should be the same as ADF/JDeveloper&#8217;s.</li>
<li>Refer to http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html for instructions about building JDBC Driver on Windows platform. The Release build option is recommended.</li>
<li>Add the dll path into system <strong>PATH</strong>environment variable, e.g. add D:\jdbc\db-5.0.21\build_windows\Win32\Release to your %PATH%</li>
</ul>
<h2>  2. Create JDBC Connection in JDeveloper </h2>
<p>2.1 Select File->new->General->Connections->Database Connection and fill in the form like Figure 1. Select button &#8220;new&#8221; to create new driver SQLiteJDBCDriver(see following Figure 2).<br />
<strong>Figure 1</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png" alt="" title="sc2" width="561" height="560" class="alignnone size-full wp-image-1298" /></a></p>
<p>2.2 Create a new driver SQLiteJDBCDriver. You should back to Figure 1 after clicking button &#8220;OK&#8221;.<br />
<strong>Figure 2</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png" alt="" title="sc1" width="854" height="500" class="alignnone size-full wp-image-1299" /></a></p>
<p>2.3 You can use button &#8220;Test Connection&#8221; to test the setting in Figure 1. If you encounter NullPointerException, please refer following section &#8220;Troubleshooting 4.1&#8243;</p>
<p>2.4 Create an empty project(or open an existing project). Select Edit->properties->Libraries Classpath to add the registered DBSQL_JDBC:<br />
<strong>Figure 3</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png" alt="" title="sc3" width="700" height="503" class="alignnone size-full wp-image-1300" /></a></p>
<h2> 3. Running the JDBC Sample Code </h2>
<p>This chapter only shows how to run the JDBC samples downloaded from Sun (now belongs to Oracle) Developer Network. You can skip this chapter if you already have a test environment.</p>
<p><strong> 3.1 Downloading JDBC sample code from Sun </strong><br />
You can download the JDBC sample code from Sun Developer Network. See &#8220;JDBC programming examples from all three editions (ZIP format)&#8221; at http://java.sun.com/products/jdbc/reference/codesamples/index.html.</p>
<p><strong>  3.2 Modifications Needed </strong><br />
Create an empty project and add all JDBC sample code into it. You will definitely need to:</p>
<ul>
<li>Replace <strong>Class.forName(&#8220;myDriver.ClassName&#8221;)</strong> in all sample code files with <strong>Class.forName(&#8220;SQLite.JDBCDriver&#8221;)</strong></li>
<li>Replace <strong>&#8220;jdbc:mySubprotocol:myDataSource&#8221;</strong> in all sample code files with <strong>jdbc:sqlite:/D:\\example.db</strong></li>
<li>Change the variable name <strong>&#8220;enum&#8221;</strong> in OutputApplet.java to <strong>&#8220;enum1&#8243;</strong>, since as <strong>&#8220;enum&#8221;</strong> is a keyword in some Java environment, and may not be used as an identifier. Otherwise, you may encounter &#8220;Error(87,31):  as of release 5, &#8216;enum&#8217; is a keyword, and may not be used as an identifier&#8221;</li>
</ul>
<p><strong>  3.3 Running examples </strong> </p>
<table>
<tr>
<td> Example Name </td>
<td> Depended Example Name </td>
</tr>
<tr>
<td> CreateCoffees </td>
<td> None </td>
</tr>
<tr>
<td> InsertCoffees </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> BatchUpdate </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> InsertRow </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> InsertRows </td>
<td> CreateCoffees. This example has an issue: it should execute uprs.moveToInsertRow()  before each uprs.insertRow(). </td>
</tr>
<tr>
<td> RSMetaDataMethods </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> TransactionPairs </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> TypeConcurrency </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> PrintColumns </td>
<td> CreateCoffees(or InsertCoffees, or BatchUpdate) </td>
</tr>
<tr>
<td> OutputApplet </td>
<td> CreateCoffees(or InsertCoffees, or BatchUpdate). This example also require AppletViewer environment. </td>
</tr>
<tr>
<td> CreateSuppliers </td>
<td> None </td>
</tr>
<tr>
<td> InsertSuppliers </td>
<td> CreateSuppliers </td>
</tr>
<tr>
<td> Join </td>
<td> InsertCoffees(or BatchUpdate) and InsertSuppliers </td>
</tr>
<tr>
<td> SQLStatement </td>
<td> InsertCoffees(or BatchUpdate) and InsertSuppliers </td>
</tr>
<tr>
<td> PrimaryKeysSuppliers </td>
<td> None </td>
</tr>
<tr>
<td> ForeignKeysCoffees </td>
<td> None </td>
</tr>
<tr>
<td> TypeInfo </td>
<td> None </td>
</tr>
<tr>
<td> TableTypes </td>
<td> None </td>
</tr>
</table>
<p>Other examples does not work because BDSQL JDBC driver does not support User-defined type or something like that.</p>
<p>Take SQLStatement.java for example, since it depends on &#8220;InsertCoffees(or BatchUpdate) and InsertSuppliers&#8221;, further more, &#8220;InsertCoffees(or BatchUpdate)&#8221; again depends on &#8220;CreateCoffees&#8221;, and &#8220;InsertSuppliers&#8221; depends on &#8220;CreateSuppliers&#8221;, so one reasonable sequence to run the SQLStatement example looks like this:</p>
<pre>
Execute CreateCoffee.java
Execute CreateSuppliers.java
Execute InsertCoffee.java
Execute InsertSuppliers.java
Execute SQLStatement.java
</pre>
<p>Finally, we can get result like below:</p>
<pre>
Row 1:
   Column 1:  Acme, Inc.
   Column 2:  Colombian

Row 2:
   Column 1:  Acme, Inc.
   Column 2:  Colombian_Decaf

Process exited with exit code 0.
</pre>
<p>Here is a screenshot of the execution result of the SQLStatement<br />
<strong>Figure 4</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png" alt="" title="sc5" width="640" height="467" class="alignnone size-full wp-image-1301" /></a></p>
<h2> 4. Troubleshooting </h2>
<p><strong> 4.1 Edit db_sql_jdbc.vsproj for different JDK environemt </strong><br />
If you encounter one of following issues:</p>
<ul>
<li> Encounter NullPointerException in JDeveloper JDBCconnection testing(figure 1)</li>
<li> Hits &#8220;ClassNotFoundException: SQLite.JDBC2x.JDBCConnection&#8221; when executing Java programs. </li>
</ul>
<p>That means that your Java environment requires JDBC2x.* instead of JDBC2z.*. So you need to edit build_windows/ex_sql_jdbc.vcproj, replace all JDBC2z with JDBC2x and rebuild the project (ex_sql_jdbc.vcproj).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BerkeleyDB 11gR2的R-Tree功能</title>
		<link>http://www.bdbchina.com/2010/04/bdb11gr2%e7%9a%84r-tree%e5%8a%9f%e8%83%bd/</link>
		<comments>http://www.bdbchina.com/2010/04/bdb11gr2%e7%9a%84r-tree%e5%8a%9f%e8%83%bd/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 05:43:53 +0000</pubDate>
		<dc:creator>linchunsun</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Linchun Sun]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1211</guid>
		<description><![CDATA[1 背景
R-Tree是一种和BTree类似的数据结构，支持高维数据的快速检索，被广泛应用于各种空间数据中。R-Tree的一个典型的应用是从许多空间对象的信息中找出用户关心的那个。如给定一座城市各个建筑物的经纬度坐标并存储于R-Tree中，用户可以通过“查找当前位置向西五公里内的所有餐厅”，“查找会展中心方圆一公里内的所有汽车站”等方式来查询自己感兴趣的某些特定建筑。
2 BDB11gR2的R-Tree功能
新发布的BerkeleyDB 11gR2(以下简称BDB11gR2）版本能够无缝地兼容SQLite的接口，从而支持各种基于SQLite的应用，包括SQLite自带R-Tree扩展应用。关于SQLite的R-Tree细节，可参见http://www.sqlite.org/rtree.html。
下面，本文将从编译和使用两方面，介绍如何在BDB11gR2中使用R-Tree功能。
2.1 编译
BDB11gR2通过编译开关控制是否启用R-Tree功能。默认情况下，BDB11gR2是不启用R-Tree的。要获得R-Tree的支持，则应该在编译时加上SQLITE_ENABLE_RTREE标志。
Linux平台
 cd build_unix
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_RTREE --enable-sql
make dbsql

Windows平台
在工程文件的属性中，选择 Properties -&#62; Configuration Properties -&#62; c/c++ -&#62; Command Line -&#62; Additional Options, 加入/D  DSQLITE_ENABLE_RTREE，并重新编译工程。
2.2 使用R-Tree
一棵R-Tree实际上对应于一张虚拟表。建立R-Tree索引的过程，实际上就是建立虚拟表的过程。和普通表类似的，我们也可以对这张特殊的虚拟表进行插入，删除，更新等操作。
我们以下面这张图为例来说明R-Tree的典型操作和应用。

在图1中，有三个蓝色的矩形，代表三个建筑的边界，标记为1，2，3。它们的坐标信息如图所示。我们要建立一棵R-Tree，来存储这些矩形的坐标信息，并在此基础上进行一些简单的查询。
建立R-Tree索引
CREATE VIRTUAL TABLE demo_index USING rtree(
id,
minX, maxX,
minY, maxY
);
以上操作建立了一张R-Tree索引表。该索引表中每一条记录代表了一个矩形框。每条记录由5列组成，其中id是一个整数类型的主键，minX，maxX分别代表矩形框横坐标的最小值和最大值，minY，maxY分别代表矩形框纵坐标的最小值和最大值。注意，BDB11gR2中的R-Tree表的列数必须是3-11之间的基数，其中第一列是表的主键，2k和2k+1列分别代表第k维数据的下界和上界(k=1~5).
插入数据
向R-Tree的表中插入数据，和向普通表中插入数据的语法是完全一致的。
以下三条语句插入了图1中的三个矩形：
INSERT INTO demo_index VALUES(
1,
0, 2,
0, 1
);
INSERT INTO demo_index VALUES(
2,
3, 5,
3, 5
);
INSERT INTO demo_index VALUES(
3,
4, 5,
1, 4
);
基于R-Tree的查询
和普通表类似的，用户卡可以对R-Tree表进行查询。如
SELECT id FROM demo_index
WHERE id=1;
但R-Tree表上更为常用和典型的查询则是范围查询(Range-Query). 举例如下：
SELECT id FROM [...]]]></description>
			<content:encoded><![CDATA[<h2>1 背景</h2>
<p>R-Tree是一种和BTree类似的数据结构，支持高维数据的快速检索，被广泛应用于各种空间数据中。R-Tree的一个典型的应用是从许多空间对象的信息中找出用户关心的那个。<!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML /> <o:AllowPNG /> </o:OfficeDocumentSettings> </xml><![endif]--><span style="font-family: 宋体;" lang="ZH-CN">如给定一座城市各个建筑物的经纬度坐标并存储于R-Tree中，用户可以通过“查找当前位置向西五公里内的所有餐厅”，“查找会展中心方圆一公里内的所有汽车站”等方式来查询自己感兴趣的某些特定建筑。</span></p>
<h2><span style="font-family: 宋体;" lang="ZH-CN"><span id="more-1211"></span></span>2 BDB11gR2的R-Tree功能</h2>
<p>新发布的BerkeleyDB 11gR2(以下简称BDB11gR2）版本能够无缝地兼容SQLite的接口，从而支持各种基于SQLite的应用，包括SQLite自带R-Tree扩展应用。关于SQLite的R-Tree细节，可参见<a onclick="javascript:pageTracker._trackPageview('/outgoing/www.sqlite.org/rtree.html');" href="http://www.sqlite.org/rtree.html">http://www.sqlite.org/rtree.html</a>。<br />
下面，本文将从编译和使用两方面，介绍如何在BDB11gR2中使用R-Tree功能。</p>
<h3>2.1 编译</h3>
<p>BDB11gR2通过编译开关控制是否启用R-Tree功能。默认情况下，BDB11gR2是不启用R-Tree的。要获得R-Tree的支持，则应该在编译时加上SQLITE_ENABLE_RTREE标志。</p>
<p><strong>Linux平台</strong></p>
<blockquote><p><code> cd build_unix<br />
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_RTREE --enable-sql<br />
make dbsql<br />
</code></p></blockquote>
<p><strong>Windows平台</strong></p>
<blockquote><p>在工程文件的属性中，选择 Properties -&gt; Configuration Properties -&gt; c/c++ -&gt; Command Line -&gt; Additional Options, 加入/D  DSQLITE_ENABLE_RTREE，并重新编译工程。</p></blockquote>
<h3>2.2 使用R-Tree</h3>
<p>一棵R-Tree实际上对应于一张虚拟表。建立R-Tree索引的过程，实际上就是建立虚拟表的过程。和普通表类似的，我们也可以对这张特殊的虚拟表进行插入，删除，更新等操作。</p>
<p>我们以下面这张图为例来说明R-Tree的典型操作和应用。</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/04/rtree.jpg"><img class="size-medium wp-image-1213 aligncenter" title="rtree" src="http://www.bdbchina.com/wp-content/uploads/2010/04/rtree-300x278.jpg" alt="&quot;rtree-pic&quot;" width="300" height="278" /></a></p>
<p>在图1中，有三个蓝色的矩形，代表三个建筑的边界，标记为1，2，3。它们的坐标信息如图所示。我们要建立一棵R-Tree，来存储这些矩形的坐标信息，并在此基础上进行一些简单的查询。</p>
<p><strong>建立R-Tree索引</strong></p>
<blockquote><p>CREATE VIRTUAL TABLE demo_index USING rtree(<br />
id,<br />
minX, maxX,<br />
minY, maxY<br />
);</p></blockquote>
<p>以上操作建立了一张R-Tree索引表。该索引表中每一条记录代表了一个矩形框。每条记录由5列组成，其中id是一个整数类型的主键，minX，maxX分别代表矩形框横坐标的最小值和最大值，minY，maxY分别代表矩形框纵坐标的最小值和最大值。注意，BDB11gR2中的R-Tree表的列数必须是3-11之间的基数，其中第一列是表的主键，2k和2k+1列分别代表第k维数据的下界和上界(k=1~5).</p>
<p><strong>插入数据</strong></p>
<p>向R-Tree的表中插入数据，和向普通表中插入数据的语法是完全一致的。<br />
以下三条语句插入了图1中的三个矩形：</p>
<blockquote><p>INSERT INTO demo_index VALUES(<br />
1,<br />
0, 2,<br />
0, 1<br />
);<br />
INSERT INTO demo_index VALUES(<br />
2,<br />
3, 5,<br />
3, 5<br />
);<br />
INSERT INTO demo_index VALUES(<br />
3,<br />
4, 5,<br />
1, 4<br />
);</p></blockquote>
<p><strong>基于R-Tree的查询</strong></p>
<p>和普通表类似的，用户卡可以对R-Tree表进行查询。如</p>
<blockquote><p>SELECT id FROM demo_index<br />
WHERE id=1;</p></blockquote>
<p>但R-Tree表上更为常用和典型的查询则是范围查询(Range-Query). 举例如下：</p>
<blockquote><p>SELECT id FROM demo_index<br />
WHERE minX&gt;=0 AND maxX&lt;=3<br />
AND minY&gt;=0 AND maxY&lt;=2;</p>
<p>查询的结果为<br />
1</p></blockquote>
<p>上面这条查询的含义是找出图1中所有被包含在红色虚线矩形框中的矩形。</p>
<blockquote><p>SELECT id FROM demo_index<br />
WHERE maxX&gt;=1 AND minX&lt;=4<br />
AND maxY&gt;=0 AND minY&lt;=4;<br />
查询结果为<br />
1<br />
2</p></blockquote>
<p>上面这条查询的含义是找出图1中所有和黑色虚线矩形框有交集的矩形。</p>
<h2>总结</h2>
<p>R-Tree在高维数据的检索中有着广泛的应用。各种地理信息，带时间记录的归档信息等，都可以通过建立基于R-Tree的索引，来达到快速检索的目的。欢迎通过使用Berkeley DB11gR2的RTree功能来构建自己的R-Tree索引，若有任何相关问题，请联系  Linchun dot sun at Oracle dot com。</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML /> <o:AllowPNG /> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face 	{font-family:"\@宋体"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:宋体; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} pre 	{mso-style-priority:99; 	mso-style-link:"HTML Preformatted Char"; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Courier New"; 	mso-fareast-font-family:"Times New Roman";} span.HTMLPreformattedChar 	{mso-style-name:"HTML Preformatted Char"; 	mso-style-priority:99; 	mso-style-unhide:no; 	mso-style-locked:yes; 	mso-style-link:"HTML Preformatted"; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Courier New"; 	mso-ascii-font-family:"Courier New"; 	mso-fareast-font-family:"Times New Roman"; 	mso-hansi-font-family:"Courier New"; 	mso-bidi-font-family:"Courier New";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:宋体; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin-top:0in; 	mso-para-margin-right:0in; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --> <!--[endif]--></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="ZH-CN">建立</span>R-Tree<span style="font-family: 宋体;" lang="ZH-CN">索引</span></p>
<pre>CREATE VIRTUAL TABLE demo_index USING rtree(</pre>
<pre><span>   </span>id,<span>              </span><span> </span></pre>
<pre><span>   </span>minX, maxX,<span>      </span><span> </span></pre>
<pre><span>   </span>minY, maxY<span>       </span><span> </span></pre>
<pre>);</pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">以上操作建立了一张</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">索引表。该索引表一共由</span><span>5</span><span style="font-family: 宋体;" lang="ZH-CN">列组成，每一条记录代表了一个矩形框。其中</span><span>id</span><span style="font-family: 宋体;" lang="ZH-CN">是一个整数类型的主键，</span><span>minX</span><span style="font-family: 宋体;" lang="ZH-CN">，</span><span>maxX</span><span style="font-family: 宋体;" lang="ZH-CN">分别代表矩形框横坐标的最小值和最大值，</span><span>minY</span><span style="font-family: 宋体;" lang="ZH-CN">，</span><span>maxY</span><span style="font-family: 宋体;" lang="ZH-CN">分别代表矩形框纵坐标的最小值和最大值。注意，</span><span>r-tree</span><span style="font-family: 宋体;" lang="ZH-CN">的列数</span><span>n</span><span style="font-family: 宋体;" lang="ZH-CN">必须为</span><span>2m+1</span><span style="font-family: 宋体;" lang="ZH-CN">，其中</span><span>m</span><span style="font-family: 宋体;" lang="ZH-CN">为表示对象的维数。</span></pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">插入数据</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">在</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">的表中插入数据，和往普通表中插入数据的语法是完全一致的。</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">以下三条语句插入了图</span><span>1</span><span style="font-family: 宋体;" lang="ZH-CN">中的三个矩形：</span></pre>
<pre>INSERT INTO demo_index VALUES(</pre>
<pre style="text-indent: 24pt;">1,<span>                   </span></pre>
<pre style="text-indent: 24pt;"><span>0</span>, <span>2</span>,<span>  </span></pre>
<pre style="text-indent: 24pt;"><span>0</span>,<span> 1</span><span>     </span></pre>
<pre>);</pre>
<pre>INSERT INTO demo_index VALUES(</pre>
<pre><span>    </span>2,</pre>
<pre><span>    </span><span>3</span>, <span>5</span>,</pre>
<pre><span>    </span><span>3</span>, <span>5</span></pre>
<pre>);</pre>
<pre>INSERT INTO demo_index VALUES(</pre>
<pre><span>    </span><span>3</span>,</pre>
<pre><span>    </span><span>4</span>, <span>5</span>,</pre>
<pre><span>    </span><span>1</span>, <span>4</span></pre>
<pre>);</pre>
<pre><span> </span></pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">基于</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">的查询</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">和普通表类似的，用户卡可以对</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">表进行查询。如</span></pre>
<pre>SELECT id FROM demo_index</pre>
<pre><span> </span>WHERE <span>id=1;</span></pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">但</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">表上更为常用和典型的查询则是范围查询</span><span>(Range-Query). </span></pre>
<pre><span> </span></pre>
<pre>SELECT id FROM demo_index<span>     </span></pre>
<pre><span> </span>WHERE minX&gt;=<span>0</span> AND maxX&lt;=<span>3</span></pre>
<pre><span>   </span>AND minY&gt;=<span>0</span> AND maxY&lt;=<span>2</span>;</pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">查询的结果为</span></pre>
<pre><span>1</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">这条查询的含义是找出图</span><span>1</span><span style="font-family: 宋体;" lang="ZH-CN">中所有被包含在红色虚线矩形框中的矩形。</span></pre>
<pre>SELECT id FROM demo_index<span>     </span></pre>
<pre><span> </span>WHERE maxX&gt;=<span>1</span> AND minX&lt;=<span>5</span></pre>
<pre><span>   </span>AND maxY&gt;=<span>0</span> AND minY&lt;=<span>4</span>;</pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">查询结果为</span></pre>
<pre><span>1</span></pre>
<pre><span>2</span></pre>
<pre><span>3</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">这条查询的含义是找出图</span><span>2</span><span style="font-family: 宋体;" lang="ZH-CN">中所有和黑色虚线矩形框有交集的矩形。</span></pre>
</div>
<input id="gwProxy" type="hidden" />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/bdb11gr2%e7%9a%84r-tree%e5%8a%9f%e8%83%bd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle Berkeley DB SQL全文检索简介</title>
		<link>http://www.bdbchina.com/2010/04/oracle-berkeley-db-sql%e5%85%a8%e6%96%87%e6%a3%80%e7%b4%a2%e7%ae%80%e4%bb%8b/</link>
		<comments>http://www.bdbchina.com/2010/04/oracle-berkeley-db-sql%e5%85%a8%e6%96%87%e6%a3%80%e7%b4%a2%e7%ae%80%e4%bb%8b/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 09:49:35 +0000</pubDate>
		<dc:creator>傅翠云</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Emily Fu]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Emily]]></category>
		<category><![CDATA[full-text search]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1164</guid>
		<description><![CDATA[  // （一） 背景
最新发布的Oracle Berkeley DB 11gR2 5.0引入了一个SQL用户期盼已久的新特性——Oracle Berkeley DB SQL,简称DBSQL。该版本兼容SQLite 3.6.22，继承并支持SQLite中的全文检索功能。SQLite全文检索功能先后支持FTS1，FTS2和FTS3，其中FTS1/FTS2与SQLite不再兼容，Berkeley DB（简称BDB）同SQLite一样，完美支持FTS3（若需要FTS1和FTS2的支持，请与我联系emily.fu[at]oracle.com）。
全文检索以文档的全部文本信息作为检索对象，为每一个词建立索引，当用户查询时，根据预先建立的索引进行查找，从而很快找到需要的内容。较普通检索，不论从查全率和查准率，还是查询速度上，全文检索在文本搜索上都有较大的优势。如SQLite文档中提到，在相同的文本数据上，SQLite的普通检索和全文检索的检索速度差距上百倍。
全文检索最初起源于文档检索，搜索引擎繁荣时期得以高速的发展，成就了google，baidu等脍炙人口的搜索引擎。同时，它在主流数据库中也得到了充分的体现。Oracle 9i中的全文检索技术Oracle text已经非常完善，并具有强大的文本检索能力和智能化的文本管理能力。又如SQL Server，My SQL，DB2，Sybase等数据库都有相应的全文检索工具，并得以广泛应用。如今，全文检索的应用范围已不仅仅限于文本数据，在非结构化数据如图像，声音，视频等等亦有各种尝试。除了上述数据库的全文检索工具以外，常用的全文检索工具还有开源的lucene等等。
如今BDB提供全文检索功能，BDB应用程序无须依赖外部全文检索工具，而专注提升全文检索的性能和结果满意度。全文检索的关键技术在于分词，BDB全文检索工具兼容自定义分词器，应用程序可定制分词器，从而提供高效而专业的检索。此外，排序算法很大程度影响结果集的呈现，BDB全文检索基于通用的TF-IDF算法，多维度分析结果的相关性，将结果集进行科学地排序，使得相关性越高的结果越早出现。
本文从SMS示例，引入FTS3的工作原理，在BDB中的编译，使用和常用文档。
（二） SMS示例
BDB 11gR2 5.0开发包中有一个FTS3的示例，模拟短信数据库，对短信进行全文检索。假设一条短信记录包括联系人，号码和短信内容三部分信息。通常情况下，短信内容长度在几十个字节到一百多个字节不等，若逐个匹配字符查找到相应关键字，搜索效率很低。若使用全文检索，联系人，号码和短信内容中的每一个词项都将建立其相应的倒排索引，即每个词项都成为关键字，大大加快了查询速度。
该FTS3示例源代码在&#60;db&#62;\sql\examples\c\ex_sql_fts3.c，短信数据来源于&#60;db&#62;\sql\examples\data\sms.csv。
短信数据库设计如下：
const sample_data sms_sample_data = {
"sms",
"\tDROP TABLE IF EXISTS sms;\n"
"\tCREATE VIRTUAL TABLE sms\n"
"\tUSING fts3(\n"
"\t\tnumber varchar(10) NOT NULL,\n"
"\t\tname   varchar(20),\n"
"\t\tcontent    TEXT\n"
"\t, tokenize=simple);",
"../sql/examples/data/sms.csv", 3};
部分短信数据：
1111111111,Aaron,i really like the way you sing but don t give [...]]]></description>
			<content:encoded><![CDATA[<p><script src="js/shCore.js"></script> <script src="js/shBrushSql.js"></script> <script type="text/javascript">// <![CDATA[
dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
// ]]&gt;</script>（一） 背景</p>
<p>最新发布的Oracle Berkeley DB 11gR2 5.0引入了一个SQL用户期盼已久的新特性——<strong>Oracle Berkeley DB SQL</strong>,简称DBSQL。该版本兼容SQLite 3.6.22，继承并支持SQLite中的全文检索功能。SQLite全文检索功能先后支持FTS1，FTS2和FTS3，其中FTS1/FTS2与SQLite不再兼容，Berkeley DB（简称BDB）同SQLite一样，完美支持FTS3（若需要FTS1和FTS2的支持，请与我联系emily.fu[at]oracle.com）。</p>
<p>全文检索以文档的全部文本信息作为检索对象，为每一个词建立索引，当用户查询时，根据预先建立的索引进行查找，从而很快找到需要的内容。较普通检索，不论从查全率和查准率，还是查询速度上，全文检索在文本搜索上都有较大的优势。如SQLite文档中提到，在相同的文本数据上，SQLite的普通检索和全文检索的检索速度差距上百倍。<span id="more-1164"></span></p>
<p>全文检索最初起源于文档检索，搜索引擎繁荣时期得以高速的发展，成就了google，baidu等脍炙人口的搜索引擎。同时，它在主流数据库中也得到了充分的体现。Oracle 9i中的全文检索技术Oracle text已经非常完善，并具有强大的文本检索能力和智能化的文本管理能力。又如SQL Server，My SQL，DB2，Sybase等数据库都有相应的全文检索工具，并得以广泛应用。如今，全文检索的应用范围已不仅仅限于文本数据，在非结构化数据如图像，声音，视频等等亦有各种尝试。除了上述数据库的全文检索工具以外，常用的全文检索工具还有开源的lucene等等。</p>
<p>如今BDB提供全文检索功能，BDB应用程序无须依赖外部全文检索工具，而专注提升全文检索的性能和结果满意度。全文检索的关键技术在于分词，BDB全文检索工具兼容自定义分词器，应用程序可定制分词器，从而提供高效而专业的检索。此外，排序算法很大程度影响结果集的呈现，BDB全文检索基于通用的TF-IDF算法，多维度分析结果的相关性，将结果集进行科学地排序，使得相关性越高的结果越早出现。</p>
<p>本文从SMS示例，引入FTS3的工作原理，在BDB中的编译，使用和常用文档。</p>
<p>（二） SMS示例</p>
<p>BDB 11gR2 5.0开发包中有一个FTS3的示例，模拟短信数据库，对短信进行全文检索。假设一条短信记录包括联系人，号码和短信内容三部分信息。通常情况下，短信内容长度在几十个字节到一百多个字节不等，若逐个匹配字符查找到相应关键字，搜索效率很低。若使用全文检索，联系人，号码和短信内容中的每一个词项都将建立其相应的倒排索引，即每个词项都成为关键字，大大加快了查询速度。</p>
<p>该FTS3示例源代码在&lt;db&gt;\sql\examples\c\ex_sql_fts3.c，短信数据来源于&lt;db&gt;\sql\examples\data\sms.csv。</p>
<p>短信数据库设计如下：</p>
<pre name="code" class="sql:nocontrols:nogutter">const sample_data sms_sample_data = {
"sms",
"\tDROP TABLE IF EXISTS sms;\n"
"\tCREATE VIRTUAL TABLE sms\n"
"\tUSING fts3(\n"
"\t\tnumber varchar(10) NOT NULL,\n"
"\t\tname   varchar(20),\n"
"\t\tcontent    TEXT\n"
"\t, tokenize=simple);",
"../sql/examples/data/sms.csv", 3};</pre>
<p>部分短信数据：</p>
<pre name="code" class="sql:nocontrols:nogutter">1111111111,Aaron,i really like the way you sing but don t give up your day job
2222222222,Belle,income tax is a real cash cow for the government
…</pre>
<p>该示例编译方法请参考本文第IV部分，其演示过程和部分效果如下：<br />
1．  初始化示例，创建短信数据库，并载入原始数据。<br />
2．  rowid等于10的（也称为docid）短信记录查询。rowid是一个FTS3表中每一条记录的全局标识。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT rowid, * FROM sms WHERE rowid=10;"</pre>
<p>3．  用MATCH查询所有联系人是Aaron的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE name MATCH 'Aaron';</pre>
<p>4．  查询联系人和短信内容中出现以Jack为前缀的单词的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE sms MATCH 'Jack*';</pre>
<p>5．  查询短信内容含Demitrius grey的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE content match 'name:Demitrius grey';</pre>
<p>6．  查询短信内容含eag* beav*词组的短信记录，其中*表示任意字符。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE content MATCH '\"eag* beav*\"';</pre>
<p>7．  查询联系人和短信内容中既出现Hedin又出现english的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE sms MATCH 'Hedin AND english';</pre>
<p>8．  使用NEAR查询clear和air距离不超过2个词的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE sms MATCH 'clear NEAR/2 air'</pre>
<p>9．  使用snippet功能，显示含Elymas的短信记录的片段。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT snippet(sms) FROM sms WHERE sms MATCH 'Elymas';</pre>
<p>下图是在android上运行该实例的截屏。</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3_screenshot.png"><img class="size-medium wp-image-1167 aligncenter" title="fts3_screenshot" src="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3_screenshot-300x210.png" alt="FTS3全文检索示例截图" width="427" height="299" /></a></p>
<p>示例更详细的信息，请参考&lt;db&gt;/sql/examples/c/README以及程序中的注释。</p>
<p>FTS3提供了一些丰富的特性，辅助用户得到更好的查询结果，后文将逐一介绍。</p>
<p>（三） FTS3工作原理</p>
<p>FTS3允许用户创建内置全文索引的特殊表（我们称为FTS3表），其中的全文索引有助于在数据库中高效地查找某一个或者几个特殊词汇。</p>
<p>FTS3表全文检索的工作原理如图所示：</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3.bmp"><img class="size-full wp-image-1168 aligncenter" title="fts3" src="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3.bmp" alt="FTS3工作原理" width="256" height="192" /></a></p>
<p>存储一条记录（文档数据）时，将该记录划分成各自独立的词项，为每个词项建立一个倒排索引。当查询时，遍历倒排索引，找到其相应的记录号，根据与查询条件的相关性等排序规则，返回结果集。</p>
<p>在DBSQL中，FTS3表的使用方法同普通表类似，可以进行插入、删除、修改等操作，但略有差异：</p>
<ul>
<li> FTS3表为虚拟表</li>
</ul>
<p>CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT);</p>
<ul>
<li>数据类型定义无效，自动转换成TEXT</li>
</ul>
<ul>
<li>自定义内置分词器（如porter，icu等），也可定制分词器</li>
</ul>
<p>CREATE VIRTUAL TABLE papers USING fts3(author, document, tokenize=porter);</p>
<ul>
<li>使用MATCH关键字进行查询</li>
</ul>
<p>SELECT count(*) FROM enrondata1 WHERE content MATCH &#8216;linux&#8217;</p>
<ul>
<li>使用Snippet，Offset，Matchinfo提供更精准的结果</li>
</ul>
<ul>
<li>FTS3表可通过以下SQL进行优化</li>
</ul>
<p>INSERT INTO docs(docs) VALUES(&#8216;optimize&#8217;);</p>
<ul>
<li>FTS3表不支持索引和触发器</li>
</ul>
<p>（四） 启动FTS3全文检索功能</p>
<p>1) 在BDB 11gR2 5.0开发包，启动FTS3全文检索功能，需要在编译BDB时指定编译选项SQLITE_ENABLE_FTS3，编译后得到包含FTS3的BDB SQL库和相应的shell命令工具dbsql。</p>
<ul>
<li>Linux</li>
</ul>
<p>cd &lt;db&gt;/build_unix<br />
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_FTS3 &#8211;enable-sql &lt;configure options&gt;<br />
make dbsql</p>
<p>由此，生成支持FTS3的BDB SQL库libdb_sql-5.0.a或者libdb_sql-5.0.so。</p>
<ul>
<li>Windows</li>
</ul>
<p>打开&lt;db&gt;/build_windows/Berkeley_DB.sln，右键单击其中的db_sql，选择properties ，打开C/C++，在Preprocessor Definitions里增加 SQLITE_ENABLE_FTS3，继而编译solution或者db_sql工程，即可得到支持FTS3的BDB SQL库libdb_sql50.dll和libdb_sql50.lib。</p>
<p>链接上述的BDB SQL库，即可在应用程序或者BDB SQL Shell(dbsql)中使用FTS3。</p>
<p>2) 编译得到BDB SQL库后，编译和运行第II部分提到的FTS3示例如下：</p>
<ul>
<li>Linux</li>
</ul>
<p>cd &lt;db&gt;/build_unix<br />
make ex_sql_fts3</p>
<p>生成ex_sql_fts3，运行即可看到所有示例中所有查询结果。</p>
<ul>
<li>Windows</li>
</ul>
<p>打开&lt;db&gt;/build_windows/ Berkeley_DB_examples.sln，右键单击其中的ex_sql_fts3，编译得到ex_sql_fts3.exe，运行即可。</p>
<p>（五） DBSQL全文检索特性</p>
<p>下面将用一个新的例子，更详细的介绍DBSQL全文检索的特性。<br />
首先创建表格和载入数据如下：</p>
<pre name="code" class="sql:nocontrols:nogutter">CREATE VIRTUAL TABLE docs USING fts3(title, body);
INSERT INTO docs(docid, title, body) VALUES(1, 'database','a database is a software system');
INSERT INTO docs(docid, title, body) VALUES(2,'BDB','Berkeley DB is called BDB for short');
INSERT INTO docs(docid, title, body) VALUES(3,'Berkeley DB','Berkeley DB is the industry-leading open source embedded database')</pre>
<p>DBSQL提供的特性有：</p>
<p>1. <strong>前缀查询</strong>：前缀后加“*”作为查询条件，返回以该前缀开头的单词所在的文本，或者文本中的某个域。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH 'Be*'; -- Select rows 2 and 3
SELECT * FROM docs WHERE title MATCH 'Be*'; -- Select rows 3</pre>
<p>2. <strong>词组查询</strong>：返回含有某个词组的文本或者文本的某个域。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH '"software system"'; -- Select rows 1
SELECT * FROM docs WHERE docs MATCH '"soft* sy*"'; -- Select rows 1
SELECT * FROM docs WHERE body MATCH '"soft* sy*"'; -- Select rows 1</pre>
<p>3. <strong>邻近查询</strong>：返回距离在指定范围的多个单词所在的文本或者文本中的某个域。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH 'Berkeley NEAR open'; -- Select rows 3
SELECT * FROM docs WHERE docs MATCH 'Berkeley NEAR/6 open'; -- Select rows 3
SELECT * FROM docs WHERE docs MATCH '"Berkeley DB" NEAR/6 open'; -- Select rows 3</pre>
<p>4. <strong>布尔逻辑</strong>：支持NOT，OR，AND二进制集合操作。多个单词之间“-”用于表示NOT语义，隐式支持AND，即多个单词之间若没有操作符，默认使用AND。若添加编译选项SQLITE_ENABLE_FTS3_PARENTHESIS，则显式支持AND和NOT。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH 'Berkeley-database'; -- Select rows 2
SELECT * FROM docs WHERE docs MATCH 'Berkeley database'; -- None
SELECT * FROM docs WHERE docs MATCH 'Berkeley OR database'; -- Select rows 1, 2 and 3</pre>
<p>5. <strong>Snippet</strong>：格式化查询结果中的查询条件，可自定义格式，默认用&lt;b&gt;&lt;/b&gt;标识单词出现的位置，提取查询结果中的所有列，最多返回64个字符。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT snippet(docs) FROM docs WHERE docs MATCH 'database’;
-- &lt;b&gt;database&lt;/b&gt;
Berkeley DB is the industry-leading open source embedded &lt;b&gt;database&lt;/b&gt;</pre>
<p>6.  <strong>Offset</strong>：返回某个单词或多个单词在文本中出现的位置集合，每个位置由四个数字表示，分别是单词在查询中位置，所在文本的列，位移和长度。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT offsets(docs) FROM docs WHERE docs MATCH 'database';
-- 0 0 0 8 1 0 2 8
-- 1 0 57 8</pre>
<p>7.  <strong>Matchinfo</strong>：返回满足条件的文本的BLOB值，该BLOB由(2 + <em>C</em> * <em>P</em> * 3)个32位无符号整型表示，其中C为FTS3表被查询的列数，P为查询的单词数目。前两个字节分别表示查询条件的词组数量和被查询的列数，此后每三个整型数表示当前文本中查询单词或词组在列中出现的位置，这三个整型数分别是当前单词是否出现在当前行的当前列，当前单词所有行的该列出现的次数，当前单词在所有行出现的次数。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT quote(matchinfo(docs)) FROM docs WHERE docs MATCH 'database';
-- X'0100000002000000010000000100000001000000010000000200000002000000'
-- X'0100000002000000000000000100000001000000010000000200000002000000'</pre>
<p>8. <strong>分词器</strong>：可选择simple或者porter分词器，其中默认选择simple分词器，两者的差异在于porter匹配拥有相同词根的单词，例如frustrated和frustrate可以搜出相同的结果，而simple仅仅匹配单词本身。此外，可自定义一个分词器，以适应不同地区和语言的要求。</p>
<p>（六） 参考文档</p>
<ul>
<li>SQLite关于FTS3的文档，<a href="http://www.sqlite.org/fts3.html">http://www.sqlite.org/fts3.html</a></li>
</ul>
<ul>
<li>FTS3开发文档，<a href="http://ft3.sourceforge.net/">http://ft3.sourceforge.net/</a></li>
</ul>
<ul>
<li>BDB 11gR2 5.0 文档列表, <a href="http://www.oracle.com/technology/documentation/berkeley-db/db/index.html">http://www.oracle.com/technology/documentation/berkeley-db/db/index.html</a></li>
</ul>
<ul>
<li>如何在Windows编译FTS3，<a href="http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html#id3369820">http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html#id3369820</a></li>
</ul>
<ul>
<li>如何在Linux/Unix编译FTS3，<a href="http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_unix_sql.html#id3374303">http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_unix_sql.html#id3374303</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/oracle-berkeley-db-sql%e5%85%a8%e6%96%87%e6%a3%80%e7%b4%a2%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>在UNIX/Linux平台上应用Berkeley DB 11gR2 SQL</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 06:35:08 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1121</guid>
		<description><![CDATA[最新发布的Berkeley DB 11gR2是第一个支持SQL的版本，编译过程与以往版本稍有不同。本文将介绍如何在Linux/UNIX下编译 Berkeley DB SQL 5.0.21(以下简称DBSQL)，并运行DBSQL范例。

下载安装包
从官方网站下载db-5.0.21.tar.gz并解压缩获得db-5.0.21目录。
配置

cd db-5.0.21/build_unix
../dist/configure --enable-sql --enable-sql_compact

选项说明：

--enable-sql_compact：

使dbsql库(libdb_sql-5.0.so)包含db库(libdb-5.0.so)，这样libdb_sql-5.0.so就不依赖于db库，其中dbsql提供了SQL API，db库包含原有的BDB功能，这样应用程序不需要链接两个库，方便使用。编译得到的库与sqlite 3.6.22版本对应。方便使用。编译得到的库与sqlite 3.6.22版本对应。


其它常用配置选项：

只编译静态库：

加上"--disable-shared"。

编译最小库：

加上"--enable-smallbuild --enable-statistics"。
这里的--enable-statistics是必须搭配--enable-smallbuild使用的。因为默认的smallbuild不包含dbsql所需要的statistics组件。
常规编译获得的DBSQL动态库大小为2.2M，而最小方式编译得到的库大小为1.1M。话说回来，对于UNIX/Linux大多数应用来说，多个1M大小不是问题，而且smallbuild会采用Os编译器优化选项(尺寸优先)取代O3选项(速度优先)，性能会有所下降。


编译

make dbsql

对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：

.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)

而对于静态编译方式，库文件在build_unix/目录下，文件：

libdb_sql-5.0.a (静态库文件)
dbsql (交互式命令行工具)

如果你需要使用各种BDB工具(如db_dump, db_load等)，进一步执行编译指令make，你将能够得到BDB所提供的所有的库文件和工具，包括之前make dbsql得到的库，以及除了上述db_dump, db_load之外的其他所有BDB提供的工具，熟悉BDB的用户一定对此不陌生。
最后，如果你需要清除包括Makefile在内的所有编译文件，可执行make distclean。Makefile是由configure生成的，单纯的&#8221;make clean&#8221;不能清除这部分记录。
编译并运行范例
DBSQL的C API完全沿用SQLite的C API，这里是SQLite3 C API列表。sql/examples/目录下有多个参考范例。以下我们以C语言范例sql/examples/c/ex_sql_index.c为例：

make ex_sql_index
./ex_sql_index

程序做了以下几件事情：

1. 把表格university加载到数据库
2. 打印以下SQL语句的Query Plan。我们可以看到Query Plan中的VDBE指令有32条。并且有两条向前跳转的Next指令，表示出现了两次循环迭代。

        SELECT rank, country, name
        from university
   [...]]]></description>
			<content:encoded><![CDATA[<p>最新发布的Berkeley DB 11gR2是第一个支持SQL的版本，编译过程与以往版本稍有不同。本文将介绍如何在Linux/UNIX下编译 Berkeley DB SQL 5.0.21(以下简称DBSQL)，并运行DBSQL范例。<br />
<span id="more-1121"></span></p>
<h2>下载安装包</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">官方网站</a>下载db-5.0.21.tar.gz并解压缩获得db-5.0.21目录。</p>
<h2>配置</h2>
<pre name="code" class="java:nogutter">
cd db-5.0.21/build_unix
../dist/configure --enable-sql --enable-sql_compact
</pre>
<p><strong>选项说明：</strong></p>
<ul>
<li><tt>--enable-sql_compact：</tt>
<ul>
<li><tt>使dbsql库(libdb_sql-5.0.so)包含db库(libdb-5.0.so)，这样libdb_sql-5.0.so就不依赖于db库，其中dbsql提供了SQL API，db库包含原有的BDB功能，这样应用程序不需要链接两个库，方便使用。编译得到的库与sqlite 3.6.22版本对应。方便使用。编译得到的库与sqlite 3.6.22版本对应。</tt></li>
</ul>
</ul>
<p><strong>其它常用配置选项：</strong></p>
<ul>
<li><tt>只编译静态库：</tt>
<ul>
<li><tt>加上"--disable-shared"。</tt></li>
</ul>
<li><tt>编译最小库：</tt>
<ul>
<li><tt>加上"--enable-smallbuild --enable-statistics"。</tt></li>
<li><tt>这里的--enable-statistics是必须搭配--enable-smallbuild使用的。因为默认的smallbuild不包含dbsql所需要的statistics组件。</tt></li>
<li><tt>常规编译获得的DBSQL动态库大小为2.2M，而最小方式编译得到的库大小为1.1M。话说回来，对于UNIX/Linux大多数应用来说，多个1M大小不是问题，而且smallbuild会采用Os编译器优化选项(尺寸优先)取代O3选项(速度优先)，性能会有所下降。</tt></li>
</ul>
</ul>
<h2>编译</h2>
<pre name="code" class="java:nogutter">
make dbsql
</pre>
<p>对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：</p>
<pre name="code" class="java:nogutter">
.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)
</pre>
<p>而对于静态编译方式，库文件在build_unix/目录下，文件：</p>
<pre name="code" class="java:nogutter">
libdb_sql-5.0.a (静态库文件)
dbsql (交互式命令行工具)
</pre>
<p>如果你需要使用各种BDB工具(如db_dump, db_load等)，进一步执行编译指令make，你将能够得到BDB所提供的所有的库文件和工具，包括之前make dbsql得到的库，以及除了上述db_dump, db_load之外的其他所有BDB提供的工具，熟悉BDB的用户一定对此不陌生。</p>
<p>最后，如果你需要清除包括Makefile在内的所有编译文件，可执行make distclean。Makefile是由configure生成的，单纯的&#8221;make clean&#8221;不能清除这部分记录。</p>
<h2>编译并运行范例</h2>
<p>DBSQL的C API完全沿用SQLite的C API，<a href='http://www.sqlite.org/c3ref/funclist.html'>这里</a>是SQLite3 C API列表。sql/examples/目录下有多个参考范例。以下我们以C语言范例sql/examples/c/ex_sql_index.c为例：</p>
<pre name="code" class="java:nogutter">
make ex_sql_index
./ex_sql_index
</pre>
<p>程序做了以下几件事情：</p>
<ul>
<li>1. 把表格university加载到数据库</li>
<li>2. 打印以下SQL语句的Query Plan。我们可以看到Query Plan中的VDBE指令有32条。并且有两条向前跳转的Next指令，表示出现了两次循环迭代。
<pre name="code" class="java:nogutter">
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
</pre>
</li>
<li>3. 增加关于region, country的索引
<li>4. 再次打印Query Plan。我们可以看到Query Plan中的VDBE指令简化到了21条。并且只有一次向前跳转的Next指令，表示只(在索引上)出现了一次循环迭代。</li>
<li>5. 删除关于region, country的索引</li>
</ul>
<p>以下是程序输出：</p>
<pre name="code" class="java:nogutter">
================================================================================
Load data source ../sql/examples/data/university.csv into database.
Load done.
================================================================================
STEP1. Explain a query expression
SQL:    EXPLAIN
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
  0     Trace   0       0       0               00      (null)
  1     OpenEphemeral   1       3       0       keyinfo(1,BINARY)       00      (null)
  2     String8 0       1       0       Europe  00      (null)
  3     Goto    0       29      0               00      (null)
  4     OpenRead        0       3       0       5       00      (null)
  5     Rewind  0       18      0               00      (null)
  6     Column  0       4       2               00      (null)
  7     Ne      1       17      2       collseq(BINARY) 69      (null)
  8     Column  0       0       4               00      (null)
  9     Column  0       3       5               00      (null)
  10    Column  0       1       6               00      (null)
  11    MakeRecord      4       3       2               00      (null)
  12    Column  0       3       7               00      (null)
  13    Sequence        1       8       0               00      (null)
  14    Move    2       9       1               00      (null)
  15    MakeRecord      7       3       3               00      (null)
  16    IdxInsert       1       3       0               00      (null)
  17    Next    0       6       0               01      (null)
  18    Close   0       0       0               00      (null)
  19    OpenPseudo      2       2       3               00      (null)
  20    Sort    1       27      0               00      (null)
  21    Column  1       2       2               00      (null)
  22    Column  2       0       4               20      (null)
  23    Column  2       1       5               00      (null)
  24    Column  2       2       6               00      (null)
  25    ResultRow       4       3       0               00      (null)
  26    Next    1       21      0               00      (null)
  27    Close   2       0       0               00      (null)
  28    Halt    0       0       0               00      (null)
  29    Transaction     0       0       0               00      (null)
  30    VerifyCookie    0       5       0               00      (null)
  31    TableLock       0       3       0       university      00      (null)
  32    Goto    0       4       0               00      (null)
================================================================================
STEP2. Create an index on university(region, country)
SQL:    CREATE INDEX university_geo
        ON university (region, country);
================================================================================
STEP3. Explain the query again, we can see the difference
SQL:    EXPLAIN
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
  0     Trace   0       0       0               00      (null)
  1     Noop    0       0       0               00      (null)
  2     String8 0       1       0       Europe  00      (null)
  3     Goto    0       18      0               00      (null)
  4     OpenRead        0       3       0       5       00      (null)
  5     OpenRead        2       4       0       keyinfo(2,BINARY,BINARY)        00      (null)
  6     SeekGe  2       15      1       1       00      (null)
  7     IdxGE   2       15      1       1       01      (null)
  8     IdxRowid        2       2       0               00      (null)
  9     Seek    0       2       0               00      (null)
  10    Column  0       0       3               00      (null)
  11    Column  2       1       4               00      (null)
  12    Column  0       1       5               00      (null)
  13    ResultRow       3       3       0               00      (null)
  14    Next    2       7       0               00      (null)
  15    Close   0       0       0               00      (null)
  16    Close   2       0       0               00      (null)
  17    Halt    0       0       0               00      (null)
  18    Transaction     0       0       0               00      (null)
  19    VerifyCookie    0       6       0               00      (null)
  20    TableLock       0       3       0       university      00      (null)
  21    Goto    0       4       0               00      (null)
================================================================================
STEP4. Drop the index
SQL: DROP INDEX university_geo;
DONE.
</pre>
<h2>使用dbsql shell</h2>
<p>范例运行完后，我们还可以用dbsql shell来查看/操作生成的数据库文件：</p>
<pre name="code" class="java:nogutter">
build_unix$ ./dbsql ex_sql_index.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .tables
university
dbsql> select * from university;
1|Massachusetts Institute of Technology|mit.edu|us|North America|2|1|1|7
2|Harvard University|harvard.edu|us|North America|7|2|12|1
3|Stanford University|stanford.edu|us|North America|4|4|2|24
4|University of California Berkeley|berkeley.edu|us|North America|8|3|5|32
5|Cornell University|cornell.edu|us|North America|1|5|9|37
6|University of Wisconsin Madison|wisc.edu|us|North America|3|10|6|71
7|University of Minnesota|umn.edu|us|North America|6|15|7|22
8|California Institute of Technology|caltech.edu|us|North America|18|6|20|30
9|University of Illinois Urbana Champaign|uiuc.edu|us|North America|17|7|13|51
10|University of Michigan|umich.edu|us|North America|10|8|18|55
11|University of Texas Austin|utexas.edu|us|North America|12|11|8|44
12|University of Washington|washington.edu|us|North America|22|9|4|94
13|University of Chicago|uchicago.edu|us|North America|42|16|44|2
14|Carnegie Mellon University|cmu.edu|us|North America|5|24|3|93
15|University of Pennsylvania|upenn.edu|us|North America|16|14|33|26
16|Columbia University New York|columbia.edu|us|North America|19|12|21|95
17|Texas A&#038;M University|tamu.edu|us|North America|31|31|11|17
18|University of Maryland|umd.edu|us|North America|37|22|17|52
19|University of California Los Angeles|ucla.edu|us|North America|13|17|26|110
20|Purdue University|purdue.edu|us|North America|14|34|14|46
21|Johns Hopkins University|jhu.edu|us|North America|59|27|49|3
22|University of Cambridge|cam.ac.uk|uk|Europe|26|13|70|86
23|Pennsylvania State University|psu.edu|us|North America|27|29|16|102
24|University of Tokyo|u-tokyo.ac.jp|jp|Asia|32|26|65|31
25|University of Arizona|arizona.edu|us|North America|20|36|19|134
dbsql> .quit
</pre>
<h2>结束语</h2>
<p>以上我们介绍了如何在UNIX/Linux环境下编译DBSQL并运行范例。在这一版本开发中，我们为新增SQL部分增加了十个范例，可作为快速参考:</p>
<pre name="code" class="java:nogutter">
1.ex_sql_load:          create table, insert, load csv files
2.ex_sql_query:         select, order by, group by, subquery, SQL function
3.ex_sql_index:         index, query explain
4.ex_sql_statment:      prepare, iterate results, callback function
5.ex_sql_transaction:   transaction, commit, rollback
6.ex_sql_savepoint:     savepoint
7.ex_sql_multi_thread:  multi-thread, transaction, lock/busy handle
8.ex_sql_binding:       prepare, variable binding, transaction, bulk insert
9.ex_sql_fts3:          full-text search features
10.ex_sql_rtree:        create, maintain, and query r-tree index
</pre>
<p>如果您有什么问题和建议，欢迎与我联系。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(drop-in模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:50 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=980</guid>
		<description><![CDATA[前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。
本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。

1. 编译Android代码
从Android官方网站获取一份Android源代码，这份源代码有2~3G之巨。
在Linux平台上，把源代码解压到$HOME/android/android_src
安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:

$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH

先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：

$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make

可看到生成三个镜像：

Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img

2. 安装Android SDK并测试镜像
安装Android SDK: http://developer.android.com/sdk/installing.html, 安装目录：$HOME/android/android-sdk-linux_86
安装Android SDK组件: http://developer.android.com/sdk/adding-components.html,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7
用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。

$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img [...]]]></description>
			<content:encoded><![CDATA[<p>前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。</p>
<p>本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。</p>
<p><span id="more-980"></span></p>
<h2>1. 编译Android代码</h2>
<p>从<a href="http://source.android.com/download">Android官方网站</a>获取一份Android源代码，这份源代码有2~3G之巨。</p>
<p>在Linux平台上，把源代码解压到$HOME/android/android_src</p>
<p>安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:</p>
<pre name="code" class="java:nogutter">
$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH
</pre>
<p>先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make
</pre>
<p>可看到生成三个镜像：</p>
<pre name="code" class="java:nogutter">
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
</pre>
<h2>2. 安装Android SDK并测试镜像</h2>
<p>安装Android SDK: <a href="http://developer.android.com/sdk/installing.html">http://developer.android.com/sdk/installing.html</a>, 安装目录：$HOME/android/android-sdk-linux_86<br />
安装Android SDK组件: <a href="http://developer.android.com/sdk/adding-components.html">http://developer.android.com/sdk/adding-components.html</a>,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7</p>
<p>用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img images
</pre>
<p>创建并运行一个新的设备:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/tools/
$ ./android
</pre>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png" alt="" title="bdb_drop_in_3" width="498" height="287" class="alignnone size-full wp-image-995" /></a></p>
<p>(如图)使用图形界面工具创建一个Android 2.1的设备BDBSQL,并点击&#8221;start&#8221;启动。新的设备第一次启动的时间会非常长，这是正常现象。等到Android界面出现，就说明我们的镜像编译基本没问题了。接下来我们进一步把SQLite库替换为BDB。</p>
<h2>3. 编译DBSQL</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">http://www.oracle.com/technology/software/products/berkeley-db/index.html</a>下载BDB 11gR2源文件(db-5.0.x.tar.gz)，然后</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src/external/sqlite/dist
$ tar zxvf db-5.0.x.tar.gz
$ cp Android.mk Android.mk.bak
$ cp db-5.0.x/build_android/Android.mk .
</pre>
<p>编辑Android.mk，默认的BDB Log和Region文件大小总和可达到十几兆，因此我们有必要修改Android.mk来减小它(可能需要为Android.mk去掉只读属性)。修改第一处LOCAL_CFLAGS如下所示(相对于默认配置，我们删除了-DSQLITE_OMIT_TRUNCATE_OPTIMIZATION，新增了-DSQLITE_DEFAULT_CACHE_SIZE=256 -DBDBSQL_MAX_LOCKS=1000 -DBDBSQL_MAX_LOCK_OBJECTS=1000)：</p>
<pre name="code" class="java:nogutter">
LOCAL_CFLAGS += -Wall -DHAVE_USLEEP=1 \
        -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
        -DSQLITE_THREADSAFE=1 -DNDEBUG=1 -DSQLITE_TEMP_STORE=3 \
        -DSQLITE_OS_UNIX=1 \
        -D_HAVE_SQLITE_CONFIG_H -DSQLITE_THREAD_OVERRIDE_LOCK=-1 \
        -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_BACKWARDS -Dfdatasync=fsync \
        -DSQLITE_DEFAULT_CACHE_SIZE=256 \
        -DBDBSQL_MAX_LOCKS=1000 \
        -DBDBSQL_MAX_LOCK_OBJECTS=1000
</pre>
<p>如果确定不会在多进程间共享数据库，还可以在上述LOCAL_CFLAGS中加入&#8221;-DBDBSQL_OMIT_SHARING&#8221;，这样日志文件不会被写入文件系统，进一步节省了设备空间。</p>
<p>编译系统镜像中的SQLite部分:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod
</pre>
<p>编译好了，再来一次镜像替换：</p>
<pre name="code" class="java:nogutter">
$ cp $HOME/android/android_src/out/target/product/generic/*.img $HOME/android/android-sdk-linux_86/platforms/android-2.1/images
</pre>
<p>使用图形界面工具删除先前的设备BDBSQL，重创建一个新的Android 2.1设备BDBSQL,并点击&#8221;start&#8221;启动。这里一定要创建新的设备，因为启动过的设备，其数据库文件已被SQLite生成，DBSQL无法访问。</p>
<h2>4. 使用DBSQL</h2>
<p>现在Android里所有应用程序的SQL存储引擎都已被替换为DBSQL了。我们使用&#8221;联系人&#8221;来试用一下我们的新设备吧，在Setting里面把Locate设置为中文简体，安装一个中文输入法(比如搜狗)，然后打开“联系人”，随便增加一条记录：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg" alt="" title="bdb_drop_in_5" width="600" height="421" class="alignnone size-full wp-image-1001" /></a></p>
<p>在主机上我们可以使用adb shell来查看并操作程序所生成的数据库。请留意sqlite3 shell输出的版本信息是Berkeley DB 11gR，同时shell的提示符是dbsql>，这说明我们已经把SQLite成功替换为DBSQL引擎：</p>
<pre name="code" class="java:nogutter">
$ adb shell
# cd /data/data/com.android.providers.contacts/databases/
# sqlite3 contacts2.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .tables
_sync_state                       status_updates
_sync_state_metadata              v1_settings
activities                        view_contacts
agg_exceptions                    view_contacts_restricted
android_metadata                  view_data
calls                             view_data_restricted
contact_entities_view             view_groups
contact_entities_view_restricted  view_raw_contacts
contacts                          view_raw_contacts_restricted
data                              view_v1_contact_methods
groups                            view_v1_extensions
mimetypes                         view_v1_group_membership
name_lookup                       view_v1_groups
nickname_lookup                   view_v1_organizations
packages                          view_v1_people
phone_lookup                      view_v1_phones
raw_contacts                      view_v1_photos
settings
dbsql> select * from contacts;
2|逍遥 李|||0|0|0|0|1|1|0nE08B4A8BFA37D4||0
dbsql> select * from data;
1||4|1|0|0|0|li|li|||||||||||||||||
2||6|2|0|0|0|66666666|1||66666666|||||||||||||||
3||6|2|0|0|0|88888888|2||88888888|||||||||||||||
4||8|2|0|0|0|蜀山|1|||||||||||||||||
5||4|2|0|0|0|逍遥 李|逍遥|李||||||||||||||||
dbsql>
</pre>
<h2>5. 结束语</h2>
<p>关于DBSQL库在Android平台上的编译和使用的介绍到这里就结束了。我们用两篇博文分别介绍了side-by-side(并存)和Drop-in(替换)这两种使用方式。在Drop-in模式下，现有的应用程序无修改就可以直接使用DBSQL引擎。</p>
<p>DBSQL在开发过程中始终给予Android平台高度重视，在开发过程中投入了多位资深工程师致力于将DBSQL移植到Android平台上，并将Android列为产品周期测试的主流平台。OARDC的工程师Zengfa.Dou和Stephen.Tang给予了我这个初学者极大帮助。在此一并致谢！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:14 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=946</guid>
		<description><![CDATA[Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;以及更多关于Oracle Berkeley DB SQL的报道。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。
本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。

1. 安装开发环境
(本文假定读者已具备初步的Android Emulator使用经验)
安装SDK
从http://developer.android.com/sdk/index.html下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。
安装NDK
从http://developer.android.com/intl/zh-TW/sdk/ndk/index.html下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。

$ cd android-ndk-1.6_r3
$ build/host-setup.sh

安装NDK Wapper
从开心网共享文件夹下载ndk-wrappers.tgz到$HOME/android

$ tar zxvf ndk-wrappers.tgz

ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：
export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc

(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)
开始安装ndk-wrapper：

$ cd ndk-wrappers
$ ./setup.sh

修改Ndk-Wrapper
修改ndk-wrappers/bin/arm-linux-gcc:

1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden

试验Ndk-Wrapper是否可工作
$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见<a href="http://www.bdbchina.com/2010/03/oracle-berkeley-db-%E6%94%AF%E6%8C%81sql%E5%95%A6%EF%BC%81/">博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;</a>以及<a href="http://www.bdbchina.com/2010/03/%E6%9B%B4%E5%A4%9A%E5%85%B3%E4%BA%8Eoracle-berkeley-db-sql%E7%9A%84%E6%8A%A5%E9%81%93/">更多关于Oracle Berkeley DB SQL的报道</a>。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。</p>
<p>本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。</p>
<p><span id="more-946"></span></p>
<h2>1. 安装开发环境</h2>
<p>(本文假定读者已具备初步的Android Emulator使用经验)<br />
<strong>安装SDK</strong><br />
从<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。</p>
<p><strong>安装NDK</strong><br />
从<a href="http://developer.android.com/intl/zh-TW/sdk/ndk/index.html">http://developer.android.com/intl/zh-TW/sdk/ndk/index.html</a>下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。</p>
<pre class="java:nogutter">
$ cd android-ndk-1.6_r3
$ build/host-setup.sh
</pre>
<p><strong>安装NDK Wapper</strong><br />
从开心网<a "http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=557046&#038;start=0">共享文件夹</a>下载ndk-wrappers.tgz到$HOME/android</p>
<pre class="java:nogutter">
$ tar zxvf ndk-wrappers.tgz
</pre>
<p>ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：</p>
<pre class="java:nogutter">export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc
</pre>
<p>(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)</p>
<p>开始安装ndk-wrapper：</p>
<pre class="java:nogutter">
$ cd ndk-wrappers
$ ./setup.sh
</pre>
<p><strong>修改Ndk-Wrapper</strong><br />
修改ndk-wrappers/bin/arm-linux-gcc:</p>
<pre class="java">
1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden
</pre>
<p><strong>试验Ndk-Wrapper是否可工作</strong></p>
<pre class="java:nogutter">$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</pre>
<h2>2. 编译DBSQL</h2>
<p>以下我们使用上面搭建的NDK编译环境来编译适用于Android平台上的DBSQL库。首先从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">Oracle官网</a>上下载Berkeley DB 11gR2(.tar.gz), 解压并改名为db/</p>
<p><strong>设置CFLAGS</strong></p>
<pre class="java:nogutter">
$ export CFLAGS="-DHAVE_USLEEP=1 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
-DNDEBUG=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_OS_UNIX=1 -D_HAVE_SQLITE_CONFIG_H \
-DSQLITE_THREAD_OVERRIDE_LOCK=-1 -Dfdatasync=fsync -DNO_ANDROID_FUNCS \
-DSQLITE_THREADSAFE=1"
</pre>
<p><strong>设置为动态编译方式</strong></p>
<pre class="java:nogutter">
$ cd db/build_unix
$ ../dist/configure --prefix=$HOME/android/install_db_arm --target=arm-linux \
--host=arm-linux --enable-smallbuild --enable-sql --enable-sql_compat \
--enable-statistics --enable-amalgamation
</pre>
<p><strong>修改build_unix/db_config.h</strong><br />
每次configure完成后，切记都要编辑build_unix/db_config.h，删除以下两行：</p>
<pre class="java:nogutter">#define HAVE_PREAD 1
#define HAVE_PWRITE 1
</pre>
<p><strong>开始编译</strong></p>
<pre class="java:nogutter">
$ make dbsql
</pre>
<p>生成的动态库文件为.libs/libdb_sql-5.0.so，Shell文件为.libs/dbsql。</p>
<h2>3. 使用DBSQL库</h2>
<p>我们使用现成的DBSQL范例来演示如何在自己的程序中使用DBSQL库</p>
<p><strong>编译范例</strong></p>
<pre class="java:nogutter">
$ cd  build_unix
$ make ex_sql_query
</pre>
<p>编译完成后生成范例程序.libs/ex_sql_query /data/bdb</p>
<p><strong>运行范例</strong><br />
启动Android Emulator，上传，并运行DBSQL库和范例</p>
<pre class="java:nogutter">
$ adb shell mkdir /data/bdb
$ adb shell mkdir /data/sql/examples/data
$ adb shell mkdir /data/sql
$ adb shell mkdir /data/sql/examples
$ adb shell mkdir /data/sql/examples/data
$ adb push .libs/libdb_sql-5.0.so /data/bdb
$ adb push .libs/ex_sql_query /data/bdb
$ adb push ../sql/examples/data/ /data/sql/examples/data
$ adb shell "cd /data/bdb; export LD_LIBRARY_PATH=/data/bdb; ./ex_sql_query"
</pre>
<p>现在终端应该已经输出query范例的运行结果了。以下是GUI终端的输出截图：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg"><img class="alignnone size-full wp-image-975" title="bdbsql_android_sidebyside" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg" alt="" width="480" height="332" /></a></p>
<h2>4. 结束语</h2>
<p>至此，关于BDB 11gR2 SQL库的side-by-side编译模式的介绍就结束了。我们可将编译得到的库应用到自己的程序中去。side-by-side模式的优点不改动Android系统底层库和镜像，使用简单。缺点是只能用C/JNI方式调用，无法用Android自带的SQL接口直接调用。而与此对应的是Drop-in模式，Drop-in模式可将Android系统的SQLite层整个替换为BDB 11gR2 SQL，应用程序无修改就可以直接使用，是一种更为强大彻底的应用模式。我们将在后续文章中介绍Drop-in模式的编译方式。</p>
<input id="gwProxy" type="hidden" />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Oracle Berkeley DB 支持SQL啦！</title>
		<link>http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/</link>
		<comments>http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:25:41 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=862</guid>
		<description><![CDATA[Oracle Berkeley DB将于2010年3月底发布最新版本Oracle Berkeley DB 11g release 2，具体版本号为 11.2.5.0.xx (xx代表具体的patch版本号)。
除了对原有Oracle Berkeley DB的功能进行了一定的改进和增强（比如提升了数据压缩功能、性能优化、C/C++中系统资源自动管理功能等等），本次发布的版本中最引人瞩目的变化是我们引入了一个有用的新特性——Oracle Berkeley DB SQL,简称DBSQL (纠正：将原BDBSQL纠正为DBSQL)。这是自Berkeley DB诞生20多年来第一次支持SQL接口。这无论是对开源社区，还是对嵌入式数据库行业来说，都将是一件喜事。在此也感谢整个Oracle Berkeley DB 研发团队的努力工作和大家的不断支持。
 
新的版本，新增的SQL接口，值得期待。    
Oracle Berkeley DB SQL接口简介

从Oracle Berkeley DB (简称BDB)诞生以来，它一直扮演着一个嵌入式、提供API调用的、高性能、非关系型的数据库引擎的角色, 被广泛应用于存储、金融、互联网、电子商务、汽车、消费电子、航空及国防等领域。简言之，它是一个1M大小的C语言类库，提供了基于键/值对（key/value pair）形式的并发和事务操作的API给C/C++/Java/C#/PHP等编程语言调用。由于BDB灵活高效的特点，它特别适合一些大数据量的、或者任务密集型的、或者硬件资源受限而性能要求高的嵌入式、跨平台等等的应用需求。
但我们发现，在很多场合对于关系数据库和SQL的需求是大量存在的。在 “edge”（如消费电子）或者一些大型的企业应用（如ERP）中，一个即时高效、并发的，支持SQL的、本地化嵌入式数据库通常是首选。因此，从 Oracle Berkeley DB 11g release 2开始，我们在保留原有基于key/value操作的API的同时，新增加了对SQL的支持。
DBSQL完全兼容SQLite（著名的嵌入式开源关系数据库）原有的编程接口。以往运行在SQLite上的程序和应用都可以无缝的、方便的迁移到 Oracle Berkeley DB这个更加强大的引擎。并且，Oracle Berkeley DB和SQLite还将进行长期的官方层面的合作，保证了Oracle Berkeley DB的SQL接口和SQLite保持一致，免除了用户的后顾之忧。此外，Berkeley DB SQL完美支持很多第三方的SQLite工具，如JDBC，ODBC，FireFox 3及其SQLite Manager 插件等。
就具体实现来说，在DBSQL中，我们将原SQLite的底层存储引擎替换为Berkeley DB的数据库引擎。如下图所示：

从上面的DBSQL实现图可以看到，Oracle Berkeley DB引入了SQLite的SQL层：包括用户接口（sqlite3(), [...]]]></description>
			<content:encoded><![CDATA[<p><tt>Oracle Berkeley DB将于2010年3月底发布最新版本Oracle Berkeley DB 11g release 2，具体版本号为 11.2.5.0.xx (xx代表具体的patch版本号)。</tt></p>
<p><tt>除了对原有Oracle Berkeley DB的功能进行了一定的改进和增强（比如提升了数据压缩功能、性能优化、C/C++中系统资源自动管理功能等等），本次发布的版本中最引人瞩目的变化是我们引入了一个有用的新特性——Oracle Berkeley DB SQL,简称DBSQL (纠正：将原<span style="text-decoration: line-through;">BDBSQL</span>纠正为DBSQL)。这是自Berkeley DB诞生20多年来第一次支持SQL接口。这无论是对开源社区，还是对嵌入式数据库行业来说，都将是一件喜事。在此也感谢整个Oracle Berkeley DB 研发团队的努力工作和大家的不断支持。<br />
</tt><tt> </tt></p>
<p><tt>新的版本，新增的SQL接口，值得期待。 <img src='http://www.bdbchina.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  <span id="more-862"></span><strong> </strong></tt></p>
<p><tt><strong>Oracle Berkeley DB SQL接口简介</strong><br />
</tt></p>
<p><tt>从Oracle Berkeley DB (简称BDB)诞生以来，它一直扮演着一个嵌入式、提供API调用的、高性能、非关系型的数据库引擎的角色, </tt><tt>被广泛应用于存储、金融、互联网、电子商务、汽车、消费电子、航空及国防等领域</tt><tt>。简言之，它是一个1M大小的C语言类库，提供了基于键/值对（key/value pair）形式的并发和事务操作的API给C/C++/Java/C#/PHP等编程语言调用。由于BDB灵活高效的特点，它特别适合一些大数据量的、或者任务密集型的、或者硬件资源受限而性能要求</tt><tt>高</tt><tt>的嵌入式、跨平台等等的应用需求。</tt></p>
<p><tt>但我们发现，在很多场合对于关系数据库和SQL的需求是大量存在的。在 “edge”（如消费电子）或者一些大型的企业应用（如ERP）中，一个即时高效、并发的，支持SQL的、本地化嵌入式数据库通常是首选。因此，从 Oracle Berkeley DB 11g release 2开始，我们在保留原有基于key/value操作的API的同时，新增加了对SQL的支持。</tt></p>
<p><tt>DBSQL完全兼容SQLite（著名的嵌入式开源关系数据库）原有的编程接口。以往运行在SQLite上的程序和应用都可以无缝的、方便的迁移到 Oracle Berkeley DB这个更加强大的引擎。并且，Oracle Berkeley DB和SQLite还将进行长期的官方层面的合作，保证了Oracle Berkeley DB的SQL接口和SQLite保持一致，免除了用户的后顾之忧。此外，Berkeley DB SQL完美支持很多第三方的SQLite工具，如JDBC，ODBC，FireFox 3及其SQLite Manager 插件等。</tt></p>
<p><tt>就具体实现来说，在DBSQL中，我们将原SQLite的底层存储引擎替换为Berkeley DB的数据库引擎。如下图所示：<br />
</tt></p>
<div id="attachment_864" class="wp-caption aligncenter" style="width: 372px"><tt><tt><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb-sql-architecture.jpg"><img class="size-full wp-image-864" title="Oracle Berkeley DB SQL 架构图" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb-sql-architecture.jpg" alt="Oracle Berkeley DB SQL 架构图" width="362" height="289" /></a></tt></tt><p class="wp-caption-text">Oracle Berkeley DB SQL 架构图</p></div>
<p><tt>从上面的DBSQL实现图可以看到，Oracle Berkeley DB引入了SQLite的SQL层：包括用户接口（sqlite3(), ODBC, JDBC等）和SQL语言处理层（Tokenizer、Parser及Generator），而底层引擎（虚拟机）则使用了BDB的存储引擎。从而，将原来SQLite基于数据库级别的并发提升一个级别 - 至BDB的基于页(Page)级别的并发，并可以利用BDB的更好的内存管理、数据和事务恢复功能、更多的扩展（如Berkeley DB的db_hotbackup、db_stat、db_archive等一系列命令行工具）。<br />
</tt></p>
<p><tt>Oracle Berkeley DB 11g release 2在主流平台经过了严格的、多重的测试和认证（每个平台涵盖以十万计的测试案例），测试平台包括Solaris、*nix、Windows系列(XP, 7, Mobile)、Android 2.0(及以上)、VxWorks等等。此外，我们还提供了大量工具和资料帮助用户熟悉这套最新接口。随版本一起发布的，包括SQLite到Oracle Berkeley DB数据迁移指南、JDBC/ODBC使用指南、全文检索（Full Text Search）向导、空间数据库（R*Tree）向导、Android平台上使用向导、数据库使用手册及调优向导、数据管理员手册、测试集、代码示例等完善的资料，进一步帮助用户放心地来使用我们的产品。了解更多SQLite的语法、API、命令行等帮助，还可以参考SQLite.org上的文档。</tt></p>
<p><tt>总结一下: DBSQL接口是一个1M大小的C语言类库，是一个高效并发的嵌入式数据库。它支持in-memory cache选项，某些场合可作为内存数据库的一个替代方案。它支持C/C++/Java/PHP等语言接口和通过JDBC/ODBC等驱动程序访问。它运行于Unix/POSIX、Windows家族、VxWorks、QNX、Android等平台。和SQLite一样，</tt><tt>它</tt><tt>支持SQL92标准。<br />
</tt></p>
<p><tt><strong>Berkeley DB SQL和SQLite使用上的区别</strong></tt></p>
<p><tt>a) 对于用户和开发人员来说，</tt><tt>这两个产品是没有区别的。它们在SQL语法、API、命令行交互、PRAGAMAs 等方面都是一致的。我认为，用户可以体验的显著区别有可能是性能和并发了 - 由于SQLite提供的是数据库级别的锁，而Berkeley DB  SQL是页(Page)级别的锁，因此后者在绝大多数测试中都会快很多 （如Insert, Update, Delete,  并发操作等）。但是，由于DBSQL提供的细粒度锁的机制，它又会带来一些额外的开销，一些极端的测试用例下会比SQLite慢上少许(但不明显)。并且对于这些极端测试的案例，我们一直在进行性能优化。</tt></p>
<p><tt>b) 对于已有的SQLite应用程序和</tt><tt>工具而言，由于这两者在调用接口都是一致的，因而都可以无缝支持。</tt></p>
<p><tt>c) 对于DBA人员来说，</tt><tt>除了可以继续使用SQLite原来的管理工具，您还可以使用BDB提供</tt><tt>的db_hotbackup、db_stat、db_archive等一系列命令行工具来备份，监控，升级等。另外，您还可以联系Oracle寻求支持。<br />
</tt></p>
<p><tt>总体而言，</tt><tt>我们有充分理由相信</tt><tt>Oracle Berkeley DB  SQL将会比SQLite更快，更稳定。同时，我们也将会提供更好的支持服务。</tt></p>
<p><tt><strong>DBSQL接口和BDB key/value接口的比较</strong><br />
</tt></p>
<p><tt>我们举个例子说明这两套API在开发上的区别。</tt></p>
<p><tt>假设有一个employee的BDB数据库（注：一个BDB的数据库，即相当于关系型数据库中的一张二维表），我们定义其主键字段为：key{empId, email}，定义其value包含字段：value{empName, sex, age,  startDate, status}。相应的，对应于Oracle 关系型数据库的表结构为：<br />
</tt></p>
<blockquote><p><tt>TABLE: employee {<br />
</tt><tt>empId PRIMARY KEY,<br />
</tt><tt> email </tt><tt>PRIMARY KEY,<br />
</tt><tt> empName,<br />
</tt><tt> sex,<br />
</tt><tt> age,<br />
</tt><tt> startDate,<br />
</tt><tt> status<br />
</tt><tt>}</tt></p></blockquote>
<p><tt>接下来，对于数据库的操作，在BDB的语法大致为：<br />
- </tt><tt>要插入一条记录，</tt><tt>employeeDatabase.put(key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>},  value{'John Smith', 'male', 30, 2005-01-01, 'OK'});<br />
- 随后，如果要更新上面那条记录：</tt><tt>employeeDatabase.put(key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>},  value{'John Smith', 'male', 60, 2005-01-01, 'Retired'});<br />
- 如果删除该条记录，则：</tt><tt>employeeDatabase.delete(</tt><tt>key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>}</tt><tt>);  // 此处只需要提供key即可<br />
- 查询记录：</tt><tt>employeeDatabase.get(</tt><tt>key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>}</tt><tt>);  // 此处只需要提供key即可</tt></p>
<p><tt>在DBSQL中，上面的增删改操作都可以通过标准的SQL语言来进行。如更新一条记录，可写成：</tt></p>
<p style="padding-left: 30px;"><tt>update employee set age=60, status='Retired' where empId=1000 and email='john.smith@foo.com';</tt></p>
<p><tt><strong>总结</strong><br />
</tt></p>
<p><tt>最后，需要强调的是，DBSQL是作为对BDB已有功能的一个补充而不是替代。</tt><tt>它只是本次BDB发布产品的一个新特性，并且将会像Hash、Queue、集群等功能一样持续下去。</tt><tt>它的出现在一定程度上更丰富了BDB的应用场景。用户可以根据自己的需要，选择适合的BDB接口：</tt></p>
<ul>
<li><tt>当用户需要非常高的性能，管理非关系型数据，或者以Queue、Hash等方式来组织和访问数据的时候，可以继续选择 Oracle  Berkeley DB的既有key/value  API。如大型企业系统中单点登录、消息队列、工作流等模块，如管理XML、声音、照片、视频等场合，如SOA中的BAM模块、业务规则引擎，如云计算或者云存储节点上，等等。</tt></li>
<li><tt>而在用户需要一个本地持久化的支持SQL的嵌入式数据库时，DBSQL将成为优先的选择。比如，手机的通讯录、个人web站点、桌面端 的应用（如股票软件、浏览器客户端的缓存和存储）及开发工具（如IDE）、中小企业的数据库系统、企业实时系统的一些缓存模块、小型的关系型内存数据库等 等。</tt></li>
</ul>
<p><tt>正式版本的Oracle Berkeley DB 11g release 2将于2010年3月底发布。Oracle Berkeley DB整个产品家族继续以开源形式发布，并对开源社区提供支持。更多</tt><tt>关于</tt><tt>Oracle Berkeley DB 11g release 2的新功能和特性，请关注我们的官方网站（</tt><tt>http://www.oracle.com/database/berkeley-db/index.html</tt><tt>）或者本博客的后续文章。</tt></p>
<p><tt>请至官方网站下载最新版本的Oracle Berkeley DB数据库系列产品，包括Oracle Berkeley DB （及SQL），Oracle Berkeley DB Java版和Oracle Berkeley DB XML数据库。<br />
</tt></p>
<p><tt>更多需求和反馈，欢迎留言或者给我发邮件：chao.huang[at]oracle.com。</tt></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>更多关于Oracle Berkeley DB SQL的报道</title>
		<link>http://www.bdbchina.com/2010/03/%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eoracle-berkeley-db-sql%e7%9a%84%e6%8a%a5%e9%81%93/</link>
		<comments>http://www.bdbchina.com/2010/03/%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eoracle-berkeley-db-sql%e7%9a%84%e6%8a%a5%e9%81%93/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:17:56 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=923</guid>
		<description><![CDATA[Oracle Berkeley DB 11g release   2即将发布，更多的用户可能会关心其SQL接口的一些具体衡量指标，包括性能、并发性、可扩展性以及客户反馈（包括开源社区和合作伙伴等）。下面是我目前收集到的信息，希望能对大家有用。
内部测试数据（总的指标，包括Berkeley DB以及SQL）：

性能：

约以万计(10s of thousands)的Insert/Update/Delete每秒；
约以十万计(100s of thousands)的Select每秒；
约比native SQLite快3倍；
有些极端测试比SQLite慢，但在一个数量级别。


并发性

细粒度的锁（Page level locking），保证了更好的并行读/写；
TPC-B测试显示，多线程的情形下（比单线程）快6-8倍；
支持数据库运行中的进行数据压缩（database online compact）。


可扩展性

单个数据库支持TB级别的数据量；
支持多节点集群。


数据同步

可以通过Oracle Mobile Server 10.3向企业端的大型Oracle数据库进行同步；
Xcsdasd 的同步客户端。


SQL功能集

SQLite3 API, SQL92标准；
ODBC，JDBC标准；
支持Full-Text Search 和R*Tree （Spatial，空间数据库）。


运行平台

Windows Mobile, 2000, XP, 7

Andriod
VxWorks
Linux, Solaris, HP/UX and virtually any *nix variant




注意：由于测试不具有代表性和平台环境等差异，这些指标仅供大家参考。


合作伙伴及用户反馈：

Mike Owens, “The Definitive Guide to SQLite”一书的作者：

Oracle Berkeley DB's new SQLite compatibly offers powerful features for its users and the [...]]]></description>
			<content:encoded><![CDATA[<p><tt>Oracle Berkeley DB 11g release   2即将发布，更多的用户可能会关心其SQL接口的一些具体衡量指标，包括性能、并发性、可扩展性以及客户反馈（包括开源社区和合作伙伴等）。下面是</tt><tt>我</tt><tt>目前收集到的信息，希望能对大家有用。</tt></p>
<h3><strong><tt>内部测试</tt><tt>数据</tt></strong><tt><strong>（总的指标，包括Berkeley DB以及SQL）：</strong></tt></h3>
<ul>
<li><tt>性能：</tt>
<ul>
<li><tt>约以万计(10s of thousands)的Insert/Update/Delete每秒；</tt></li>
<li><tt>约以十万计(100s of thousands)的Select每秒；</tt></li>
<li><tt>约比native SQLite快3倍；</tt></li>
<li><tt>有些极端测试比SQLite慢，但在一个数量级别。</tt></li>
</ul>
</li>
<li><tt>并发性</tt>
<ul>
<li><tt>细粒度的锁（Page level locking），保证了更好的并行读/写；</tt></li>
<li><tt>TPC-B测试显示，</tt><tt>多线程的情形下（比单线程）快6-8倍；</tt></li>
<li><tt>支持数据库运行中的进行数据压缩（database online compact）。</tt></li>
</ul>
</li>
<li><tt>可扩展性</tt>
<ul>
<li><tt>单个数据库支持TB级别的数据量；</tt></li>
<li><tt>支持多节点集群。</tt></li>
</ul>
</li>
<li><tt>数据同步</tt>
<ul>
<li><tt>可以通过</tt><tt>Oracle Mobile Server 10.3向企业端的大型Oracle数据库进行同步；</tt></li>
<li><tt>Xcsdasd 的同步客户端。</tt></li>
</ul>
</li>
<li><tt>SQL功能集</tt>
<ul>
<li><tt>SQLite3 API, SQL92标准；</tt></li>
<li><tt>ODBC，JDBC标准；</tt></li>
<li><tt>支持Full-Text Search 和R*Tree （Spatial，空间数据库）。</tt></li>
</ul>
</li>
<li><tt>运行平台</tt>
<ul>
<li><tt>Windows Mobile, 2000, XP, 7<br />
</tt></li>
<li><tt>Andriod</tt></li>
<li><tt>VxWorks</tt></li>
<li><tt>Linux, Solaris, HP/UX and virtually any *nix variant<br />
</tt></li>
</ul>
</li>
</ul>
<blockquote><p><tt><strong><em>注意：由于测试不具有代表性和平台环境等差异，这些指标仅供大家参考。</em></strong></tt></p>
<p><tt></tt></p></blockquote>
<p><span id="more-923"></span></p>
<h3><tt><strong>合作伙伴及用户反馈：</strong></tt></h3>
<ul>
<li><tt>Mike Owens, “The Definitive Guide to SQLite”一书的作者：</tt></li>
</ul>
<blockquote><p><tt>Oracle Berkeley DB's new SQLite compatibly offers powerful features for its users and the SQLite community at large. The combination of the two technologies provides developers with tremendous flexibility in a single SQL/API.  Oracle has done a fantastic job of integrating the technologies, and also being an exemplary participant in the open source community by contributing time, expertise and resources to the SQLite project.<br />
</tt></p></blockquote>
<ul>
<li><tt>Dr. Richard Hipp, SQLite 数据库的作者及架构师：</tt></li>
</ul>
<blockquote><p><tt>Oracle Berkeley DB 11g combines seamlessly the benefits of SQLite’s ubiquitous API with Berkeley DB’s concurrency and performance into an easy-to-use product. SQLite users can now benefit from enhanced concurrency and performance, and Oracle Berkeley DB users can now benefit from an easy-to-use SQL API.<br />
</tt></p></blockquote>
<ul>
<li><tt>Liam McLoughlin, Google Chromium OS的开发者：</tt></li>
</ul>
<blockquote><p><tt>In my experience Berkley DB 11gR2 is a fully drop-in replacement for SQLite3. I was hugely surprised at just how easy it was; I'd had zero experience in using Berkeley DB in products before, but within a couple hours I had my application powered by Berkeley DB. From there you get all the benefits of Berkeley DB including concurrency and long term stability compared to SQLite3 from an API you're already familiar with. It's quite simply amazing.<br />
</tt></p></blockquote>
<ul>
<li><tt>Marie-Anne Neimat, Oracle 数据库产品研发的VP（仿谷歌对VP的解释为：数据库研发全球副总裁）</tt></li>
</ul>
<blockquote><p><tt>Mobile applications and mobile infrastructure applications need fast, scalable and reliable storage services - yet must be self-managing and operate without administrators.  With new SQL capabilities and Android support, Oracle Berkeley DB 11g  makes it easier for developers to quickly develop and deploy new ‘edge’ applications that meet users high performance and scalability demands.<br />
</tt></p></blockquote>
<ul>
<li><tt>Marco Bambini, SQLabs的CEO</tt></li>
</ul>
<blockquote><p><tt>Berkeley DB 11gR2 combines the familiar SQLite API with the powerful, proven Berkeley DB data storage technology. I re-compiled my SQLiteManager product against the Berkeley DB library without any major issues in very little time. I have now a product that is fully able to manage BDB databases without changing a single line of my code. Performance and concurrency are excellent and I am thrilled to think about the future of this great product.</tt></p></blockquote>
<p><tt>最后，关于Oracle Berkeley DB 11g release 2</tt><tt>的</tt><tt>更多垂询，欢迎留言或者给我发邮件：chao.huang[at]oracle.com。请至官方网址：</tt><tt>http://www.oracle.com/database/berkeley-db/index.html 下载</tt><tt>Oracle Berkeley DB 11g release 2。</tt></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 833px; width: 1px; height: 1px; overflow: hidden;"><em>http://www.oracle.com/corporate/pricing/pricelists.html</em></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eoracle-berkeley-db-sql%e7%9a%84%e6%8a%a5%e9%81%93/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
Դ