<?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>Thu, 15 Dec 2011 10:35:52 +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>Berkeley DB 5.2 ADO.NET开发包介绍</title>
		<link>http://www.bdbchina.com/2011/07/berkeley-db-5-2-ado-net%e5%bc%80%e5%8f%91%e5%8c%85%e4%bb%8b%e7%bb%8d/</link>
		<comments>http://www.bdbchina.com/2011/07/berkeley-db-5-2-ado-net%e5%bc%80%e5%8f%91%e5%8c%85%e4%bb%8b%e7%bb%8d/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 06:19:03 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1566</guid>
		<description><![CDATA[Berkeley DB 5.2版本在六月份顺利发布了。在这一版本中，我负责完成了Berkeley DB SQL (以下简称DBSQL)的第一个独立的ADO.NET发布包。以下向大家介绍一下其基本用法。
ADO.NET是微软在.NET Framework中负责数据访问的类库集，它是使用在COM时代奠基的OLE DB技术以及.NET Framework的类库和编程语言来发展的，它可以让.NET上的任何编程语言能够连接并访问关系数据库与非数据库型数据源（例如XML，Excel或是文字档数据），或是独立出来作为处理应用程序数据的类对象，其在.NET Framework中的地位是举足轻重，许多人将ADO.NET视为ADO的下一个版本，但其实它是一个全新的架构、产品与概念。
DBSQL ADO.NET包是一个针对Windows ADO.NET用户发布的独立包，已包含DBSQL所需的源代码和文件。ADO.NET用户可直接用它来编译生成基于Berkeley DB引擎的ADO.NET库。
用户可在Oracle Berkeley DB的官方网站下载以下文件：

Berkeley DB dbsql-adodotnet-5.2.28.zip, for ADO.NET (12M)

下文将详细介绍在Windows和Windows Mobile环境下的编译使用过程：

1. 环境需求
如果你的环境没有满足以下要求，相对应的工程是无法编译通过的：

System.Data.SQLite.Linq 需要 .Net Framework 3.5 SP1.
SQLite.Designer需要Microsoft Visual Studio SDK.

如果你不需要以上两个组件，可忽略相应的系统需求。
2. Windows
以Windows XP 32bit Visual Studio 2008为例:
打开SQLite.NET.2008.sln，如果遇到对话框询问加载方式，选择“正常加载项目”。
选择编译方式为ReleaseNative, Win32

编译整个项目。

测试生成的库：右键选择test.2008, 调试，启动新实例。点击“Run”，运行整个测试集。这些内置的ADO.NET测试同时也是很好的范例。

3. Windows Mobile
以下仍以Windows XP 32bit Visual Studio 2008为例。首先，要安装Windows Mobile 6.5.3 DTK (Developer Tool Kit) 在这里下载。
打开SQLite.NET.2008.WinCE.sln，如果遇到对话框询问加载方式，选择“正常加载项目”
然后，在”Mixed Platforms”所在的下拉菜单中选择“配置管理器”，然后如下图所示新建一个平台：

编译选项选择ReleaseNativeOnly, 然后编译整个工程。
编译通过后，将SQLite.Interop.2008.WinCE布署到Windows Mobile仿真器上：
右键选择SQLite.Interop.2008.WinCE, [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB 5.2版本在六月份顺利发布了。在这一版本中，我负责完成了Berkeley DB SQL (以下简称DBSQL)的第一个独立的ADO.NET发布包。以下向大家介绍一下其基本用法。</p>
<p>ADO.NET是微软在.NET Framework中负责数据访问的类库集，它是使用在COM时代奠基的OLE DB技术以及.NET Framework的类库和编程语言来发展的，它可以让.NET上的任何编程语言能够连接并访问关系数据库与非数据库型数据源（例如XML，Excel或是文字档数据），或是独立出来作为处理应用程序数据的类对象，其在.NET Framework中的地位是举足轻重，许多人将ADO.NET视为ADO的下一个版本，但其实它是一个全新的架构、产品与概念。</p>
<p>DBSQL ADO.NET包是一个针对Windows ADO.NET用户发布的独立包，已包含DBSQL所需的源代码和文件。ADO.NET用户可直接用它来编译生成基于Berkeley DB引擎的ADO.NET库。</p>
<p>用户可在Oracle Berkeley DB的官方网站<a href="http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html">下载</a>以下文件：</p>
<ul>
<li>Berkeley DB dbsql-adodotnet-5.2.28.zip, for ADO.NET (12M)</li>
</ul>
<p>下文将详细介绍在Windows和Windows Mobile环境下的编译使用过程：<br />
<span id="more-1566"></span></p>
<h2>1. 环境需求</h2>
<p>如果你的环境没有满足以下要求，相对应的工程是无法编译通过的：</p>
<ul>
<li>System.Data.SQLite.Linq 需要 .Net Framework 3.5 SP1.</li>
<li>SQLite.Designer需要Microsoft Visual Studio SDK.</li>
</ul>
<p>如果你不需要以上两个组件，可忽略相应的系统需求。</p>
<h2>2. Windows</h2>
<p>以Windows XP 32bit Visual Studio 2008为例:</p>
<p>打开SQLite.NET.2008.sln，如果遇到对话框询问加载方式，选择“正常加载项目”。</p>
<p>选择编译方式为ReleaseNative, Win32<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_1.png"><img class="alignnone size-full wp-image-1567" title="dbsql_adodotnet_1" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_1.png" alt="" width="284" height="35" /></a></p>
<p>编译整个项目。<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_2.jpg"><img class="alignnone size-full wp-image-1568" title="dbsql_adodotnet_2" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_2.jpg" alt="" width="500" height="415" /></a></p>
<p>测试生成的库：右键选择test.2008, 调试，启动新实例。点击“Run”，运行整个测试集。这些内置的ADO.NET测试同时也是很好的范例。<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_3.png"><img class="alignnone size-full wp-image-1569" title="dbsql_adodotnet_3" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_3-300x258.png" alt="" width="400" height="344" /></a></p>
<h2>3. Windows Mobile</h2>
<p>以下仍以Windows XP 32bit Visual Studio 2008为例。首先，要安装Windows Mobile 6.5.3 DTK (Developer Tool Kit) 在<a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c0213f68-2e01-4e5c-a8b2-35e081dcf1ca&amp;displaylang=en">这里</a>下载。</p>
<p>打开SQLite.NET.2008.WinCE.sln，如果遇到对话框询问加载方式，选择“正常加载项目”</p>
<p>然后，在”Mixed Platforms”所在的下拉菜单中选择“配置管理器”，然后如下图所示新建一个平台：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_4.png"><img class="alignnone size-full wp-image-1572" title="dbsql_adodotnet_4" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_4.png" alt="" width="608" height="360" /></a></p>
<p><strong>编译选项选择ReleaseNativeOnly, 然后编译整个工程。</strong></p>
<p>编译通过后，将SQLite.Interop.2008.WinCE布署到Windows Mobile仿真器上：<br />
右键选择SQLite.Interop.2008.WinCE, 属性-&gt;部署-&gt;远程目录<br />
按需定义部署目录。这里为了方便演示下面的测试，将目录设定为：<br />
%CSIDL_PROGRAM_FILES%\testce</p>
<p>确定保存后，再次右键选择SQLite.Interop.2008.WinCE，选择部署。稍等一会后，当VisualStudio输出窗口显示以下内容，表明仿真器已经启动<br />
========== 部署: 成功1 个，失败0 个，跳过0 个==========<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_5.jpg"><img class="alignnone size-full wp-image-1573" title="dbsql_adodotnet_5" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_5.jpg" alt="" width="262" height="406" /></a></p>
<p>同样的部署System.Data.SQLite.Compact.2008, 按下图所示选择仿真器<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_6.jpg"><img class="alignnone size-full wp-image-1574" title="dbsql_adodotnet_6" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_6.jpg" alt="" width="367" height="222" /></a></p>
<p>右键选择testce.2008, 调试，启动新实例。如上图选择仿真器。测试集会自动运行，这些内置的ADO.NET测试同时也是很好的范例。运行结果如下所示(在仿真器中可用方向键对结果翻页)：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_7.jpg"><img class="alignnone size-full wp-image-1575" title="dbsql_adodotnet_7" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_7.jpg" alt="" width="262" height="406" /></a></p>
<h2>4. 结束语</h2>
<p>以上介绍了DBSQL ADO.NET发布包的编译使用过程。你可以在发布包的根目录下找到具体的官方文档。如果在使用过程中有任何问题，欢迎和我交流！</p>
<p>BDB Blog：<a href="http://www.bdbchina.com/">http://www.bdbchina.com/</a><br />
BDB微博：<a href="http://weibo.com/bdbchina">http://weibo.com/bdbchina</a><br />
个人微博：<a href="http://weibo.com/2153755234">http://weibo.com/2153755234</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2011/07/berkeley-db-5-2-ado-net%e5%bc%80%e5%8f%91%e5%8c%85%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Open World 2010旧金山 — BDB 演讲系列 (II)</title>
		<link>http://www.bdbchina.com/2010/11/oracle-open-world-2010%e6%97%a7%e9%87%91%e5%b1%b1-%e2%80%94-bdb-%e6%bc%94%e8%ae%b2%e7%b3%bb%e5%88%97-ii/</link>
		<comments>http://www.bdbchina.com/2010/11/oracle-open-world-2010%e6%97%a7%e9%87%91%e5%b1%b1-%e2%80%94-bdb-%e6%bc%94%e8%ae%b2%e7%b3%bb%e5%88%97-ii/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 05:02:47 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[sync]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1505</guid>
		<description><![CDATA[这次为大家带了的是Berkeley DB与移动数据同步的演讲。具体解决了当今从移动的终端向数据中心的Oracle数据库进行数据同步、设备管理、应用管理等场合的需求。转载请注明出处。
1. Oracle Berkeley DB 和Mobile Server的架构

2. Oracle企业移动应用平台
]]></description>
			<content:encoded><![CDATA[<p>这次为大家带了的是Berkeley DB与移动数据同步的演讲。具体解决了当今从移动的终端向数据中心的Oracle数据库进行数据同步、设备管理、应用管理等场合的需求。转载请注明出处。<span id="more-1505"></span></p>
<h3>1. Oracle Berkeley DB 和Mobile Server的架构</h3>
<div id="attachment_1506" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.bdbchina.com/wp-content/uploads/2010/11/12.png"><img class="size-medium wp-image-1506" title="Oracle Berkeley DB 和Mobile Server的架构" src="http://www.bdbchina.com/wp-content/uploads/2010/11/12-300x148.png" alt="Oracle Berkeley DB 和Mobile Server的架构" width="300" height="148" /></a><p class="wp-caption-text">Oracle Berkeley DB 和Mobile Server的架构</p></div>
<p class="mceTemp mceIEcenter">
<h3>2. Oracle企业移动应用平台</h3>
<div id="attachment_1507" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.bdbchina.com/wp-content/uploads/2010/11/22.png"><img class="size-medium wp-image-1507" title="Oracle企业移动应用平台" src="http://www.bdbchina.com/wp-content/uploads/2010/11/22-300x223.png" alt="Oracle企业移动应用平台" width="300" height="223" /></a><p class="wp-caption-text">Oracle企业移动应用平台</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/11/oracle-open-world-2010%e6%97%a7%e9%87%91%e5%b1%b1-%e2%80%94-bdb-%e6%bc%94%e8%ae%b2%e7%b3%bb%e5%88%97-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Open World 2010旧金山 &#8212; BDB 演讲系列 (I)</title>
		<link>http://www.bdbchina.com/2010/10/oracle-open-world-2010%e6%97%a7%e9%87%91%e5%b1%b1-bdb-%e6%bc%94%e8%ae%b2%e7%b3%bb%e5%88%97-i/</link>
		<comments>http://www.bdbchina.com/2010/10/oracle-open-world-2010%e6%97%a7%e9%87%91%e5%b1%b1-bdb-%e6%bc%94%e8%ae%b2%e7%b3%bb%e5%88%97-i/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 10:15:50 +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>
		<category><![CDATA[oow]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1470</guid>
		<description><![CDATA[从本文及后续博客，我将会为大家带来最新的，Berkeley DB在Oracle Open World 2010 (2010年9月19-23号在旧金山举行）的一系列讲座的精彩部分（节选）和客户案例分享。希望大家会喜欢，并欢迎留言。注意：转载请注明出处。
本人介绍的是Berkeley DB 5.o以来新推出的SQL接口 &#8212; 由Oracle和SQLite同时演讲。其中BDB部分的精彩剪辑有：
1. Oracle数据库家族的构成及区分
在Oracle，我们的数据库产品线覆盖从企业数据中心到个人移动端，覆盖到几乎所有的场合。根据计算能力和技术要求，我们划分如下图一所示：

图一 Oracle数据库家庭的构成和划分
那么，针对BDB而言，我们的强项主要集中于2个方向：仪器及设备 + 企业基础架构
2. BDB的典型应用是在仪器及设备 和 企业基础架构层
具体的使用场景和优势，请参考下图二和图三所示：

图二 BDB在仪器及设备的应用

图三 BDB在企业基础架构层的应用
3. SQLite 不是和BDB竞争，而是合作
根据SQLite的作者Dr. Richard Hipp，SQLite的设计是用来替代文件系统的fopen()。SQLite面向的更多是：要求简单的数据库功能（SQL，事物等），使用简单，性能及并发要求不高的场合。
SQLite与BDB的组合（即BDB 11gR2的SQL接口）面对的是由于SQLite本身的瓶颈，而不能达到的一些问题和场合 &#8212; 比如更好的并发性，性能，加密，集群，更好的技术支持和市场推广，等等。因而说SQLite不会和BDB直接竞争，相反是合作共赢，共同推动SQLite社区和用户发展。
如下图四所示，BDB 11gR2的SQL接口是SQLite的SQL层和BDB的底层存储引擎的完美结合。
图四 BDB 11gR2的SQL接口是SQLite的SQL层和BDB的底层存储引擎的完美结合
4. SQLite的可能发展方向

图五 SQLite 目前缺失的功能
注意，这里Dr. Richard用的词是：SQLite 目前缺失的功能，并不代表说将来会提供以及什么时候以何种方式提供。

]]></description>
			<content:encoded><![CDATA[<p>从本文及后续博客，我将会为大家带来最新的，Berkeley DB在Oracle Open World 2010 (2010年9月19-23号在旧金山举行）的一系列讲座的精彩部分（节选）和客户案例分享。希望大家会喜欢，并欢迎留言。<em>注意：转载请注明出处</em>。</p>
<p>本人介绍的是Berkeley DB 5.o以来新推出的SQL接口 &#8212; 由Oracle和SQLite同时演讲。其中BDB部分的精彩剪辑有：</p>
<h3>1. Oracle数据库家族的构成及区分</h3>
<p>在Oracle，我们的数据库产品线覆盖从企业数据中心到个人移动端，覆盖到几乎所有的场合。根据计算能力和技术要求，我们划分如下图一所示：</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/1.png"><img class="aligncenter size-medium wp-image-1471" title="Oracle数据库产品划分" src="http://www.bdbchina.com/wp-content/uploads/2010/10/1-300x209.png" alt="Oracle数据库产品划分" width="300" height="209" /></a></p>
<p style="text-align: center;">图一 Oracle数据库家庭的构成和划分</p>
<p style="text-align: left;">那么，针对BDB而言，我们的强项主要集中于2个方向：<strong>仪器及设备</strong> + <strong>企业基础架构<span id="more-1470"></span></strong></p>
<h3>2. BDB的典型应用是在仪器及设备 和 企业基础架构层</h3>
<p>具体的使用场景和优势，请参考下图二和图三所示：</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/2.png"><img class="aligncenter size-medium wp-image-1472" title="BDB在仪器及设备上的应用" src="http://www.bdbchina.com/wp-content/uploads/2010/10/2-300x209.png" alt="BDB在仪器及设备上的应用" width="300" height="209" /></a></p>
<p style="text-align: center;">图二 BDB在仪器及设备的应用</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/3.png"><img class="aligncenter size-medium wp-image-1477" title="BDB在企业基础架构层的应用" src="http://www.bdbchina.com/wp-content/uploads/2010/10/3-300x210.png" alt="BDB在企业基础架构层的应用" width="300" height="210" /></a></p>
<p style="text-align: center;">图三 BDB在企业基础架构层的应用</p>
<h3 style="text-align: left;">3. SQLite 不是和BDB竞争，而是合作</h3>
<p style="text-align: left;">根据SQLite的作者Dr. Richard Hipp，SQLite的设计是用来替代文件系统的fopen()。SQLite面向的更多是：要求简单的数据库功能（SQL，事物等），使用简单，性能及并发要求不高的场合。</p>
<p style="text-align: left;">SQLite与BDB的组合（即BDB 11gR2的SQL接口）面对的是由于SQLite本身的瓶颈，而不能达到的一些问题和场合 &#8212; 比如更好的并发性，性能，加密，集群，更好的技术支持和市场推广，等等。因而说SQLite不会和BDB直接竞争，相反是合作共赢，共同推动SQLite社区和用户发展。</p>
<p style="text-align: left;">如下图四所示，BDB 11gR2的SQL接口是SQLite的SQL层和BDB的底层存储引擎的完美结合。</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/4.png"><img class="aligncenter size-medium wp-image-1479" title="BDB 11gR2的SQL接口是SQLite的SQL层和BDB的底层存储引擎的完美结合" src="http://www.bdbchina.com/wp-content/uploads/2010/10/4-300x230.png" alt="BDB 11gR2的SQL接口是SQLite的SQL层和BDB的底层存储引擎的完美结合" width="300" height="230" /></a>图四 BDB 11gR2的SQL接口是SQLite的SQL层和BDB的底层存储引擎的完美结合</p>
<h3 style="text-align: left;">4. SQLite的可能发展方向</h3>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/5.png"><img class="aligncenter size-medium wp-image-1480" title="SQLite 目前缺失的功能" src="http://www.bdbchina.com/wp-content/uploads/2010/10/5-300x216.png" alt="" width="300" height="216" /></a></p>
<p style="text-align: center;">图五 SQLite 目前缺失的功能</p>
<p>注意，这里Dr. Richard用的词是：SQLite 目前缺失的功能，并不代表说将来会提供以及什么时候以何种方式提供。</p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/10/oracle-open-world-2010%e6%97%a7%e9%87%91%e5%b1%b1-bdb-%e6%bc%94%e8%ae%b2%e7%b3%bb%e5%88%97-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>9</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[赵汝聪]]></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[赵汝聪]]></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 same as [...]]]></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-&gt;new-&gt;General-&gt;Connections-&gt;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 class="alignnone size-full wp-image-1298" title="sc2" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png" alt="" width="561" height="560" /></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 class="alignnone size-full wp-image-1299" title="sc1" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png" alt="" width="854" height="500" /></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-&gt;properties-&gt;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 class="alignnone size-full wp-image-1300" title="sc3" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png" alt="" width="700" height="503" /></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>
<tbody>
<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>
</tbody>
</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 class="alignnone size-full wp-image-1301" title="sc5" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png" alt="" width="640" height="467" /></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>
		<category><![CDATA[rtree]]></category>
		<category><![CDATA[spatial]]></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>3</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>
		<category><![CDATA[傅翠云]]></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 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>
</li>
</ul>
<p><strong>其它常用配置选项：</strong></p>
<ul>
<li><tt>只编译静态库：</tt>
<ul>
<li><tt>加上"--disable-shared"。</tt></li>
</ul>
</li>
<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>
</li>
</ul>
<h2>编译</h2>
<pre class="java:nogutter">make dbsql</pre>
<p>对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：</p>
<pre class="java:nogutter">.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)</pre>
<p>而对于静态编译方式，库文件在build_unix/目录下，文件：</p>
<pre 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 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 class="java:nogutter">        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;</pre>
</li>
<li>3. 增加关于region, country的索引</li>
<li>4. 再次打印Query Plan。我们可以看到Query Plan中的VDBE指令简化到了21条。并且只有一次向前跳转的Next指令，表示只(在索引上)出现了一次循环迭代。</li>
<li>5. 删除关于region, country的索引</li>
</ul>
<p>以下是程序输出：</p>
<pre 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 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&gt; .tables
university
dbsql&gt; 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&amp;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&gt; .quit</pre>
<h2>结束语</h2>
<p>以上我们介绍了如何在UNIX/Linux环境下编译DBSQL并运行范例。在这一版本开发中，我们为新增SQL部分增加了十个范例，可作为快速参考:</p>
<pre 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>22</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>
	</channel>
</rss>
Դ
