﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-gyn-随笔分类-postgres</title><link>http://www.cnitblog.com/gyn/category/2737.html</link><description>Win32下的Perl，无用的select，停滞的Tk，结束吧....</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 09:06:13 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 09:06:13 GMT</pubDate><ttl>60</ttl><item><title>Postgresql8.1的索引</title><link>http://www.cnitblog.com/gyn/archive/2006/08/01/14496.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Tue, 01 Aug 2006 00:35:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/08/01/14496.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/14496.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/08/01/14496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/14496.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/14496.html</trackback:ping><description><![CDATA[
		<h1 style="margin: 17pt 0cm 16.5pt;">
				<span lang="EN-US">Postgresql8.1</span>
				<span style="font-family: 宋体;">的索引</span>
		</h1>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">索引是提高数据库性能的常用方法。索引可以大大加速对特定字段机器组合的检索或查找速度，但与此同时又会增加数据库的负荷，所以如何有效的利用索引成为了一名</span>
				<span lang="EN-US">DBA</span>
				<span style="font-family: 宋体;">必须掌握的技术。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">介绍</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">对于下面这样一个表：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create table test1(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Id integer,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Content varchar</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在该表上将大量采用如下查询：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select content from test1 where id=constant;</span>
				<span style="font-family: 宋体;">（</span>
				<span lang="EN-US">constant</span>
				<span style="font-family: 宋体;">表示一个常熟）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">通常数据库不得不一行一行地扫描整个</span>
				<span lang="EN-US">test1</span>
				<span style="font-family: 宋体;">表来寻找所有匹配的数据。如果，最终得到的数据只占</span>
				<span lang="EN-US">test1</span>
				<span style="font-family: 宋体;">中很小的一部分，那么使用如上的方法显然很低效。如果我们在</span>
				<span lang="EN-US">id</span>
				<span style="font-family: 宋体;">列上维护一个索引用于定位匹配的行，那么数据库将只需通过检索搜查树上的若干层就可以得到所需的结果。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">下面的命令将在</span>
				<span lang="EN-US">id</span>
				<span style="font-family: 宋体;">上建立索引：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create index test1_id_index on test1(id);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">当然，我们可以自由地给索引取一个名字，只要之后可以方便地想起来就行。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">删除索引地命令：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Drop index test1_id_index;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">很大程度上，一个有效的索引是建立在事前分析的基础上的，一旦建立了一个索引，就不需要再有太多地干预了，不过也可以定期使用</span>
				<span lang="EN-US">analyze</span>
				<span style="font-family: 宋体;">命令来更新统计数据，使数据库查询规划器能做出有效的判断。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">除了需要避免不必要的索引对系统带来过多的负荷，索引无论使对查找、删除还是更新，都将带来一定程度上性能的提升。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">索引的类型</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 宋体;">关键字：操作符集</span>
				<span style="color: red;">
				</span>
				<span style="color: red; font-family: 宋体;">一定类型的索引只能在相关操作符集中触发</span>
				<span style="color: red;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Postgresql8.1</span>
				<span style="font-family: 宋体;">提供</span>
				<span lang="EN-US">b-tree</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">r-tree</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">hash</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">gist</span>
				<span style="font-family: 宋体;">这几种索引类型。每一种索引，因为所使用的算法不同，所以适用的场合也有所不同。缺省的情况下，系统将使用</span>
				<span lang="EN-US">b-tree</span>
				<span style="font-family: 宋体;">索引，它也可以适用于大多数的情况。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">b-tree</span>
				<span style="font-family: 宋体;">可以处理按照某种顺序排列的数据的等值或范围查询，当索引所在列使用一下几种比较符号时，查询规划器将考虑使用索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">&gt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&lt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&gt;=</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&lt;=</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">=</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">构造等效于这些符号的组合也将会启动索引，如</span>
				<span lang="EN-US">between</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">in</span>
				<span style="font-family: 宋体;">等。需要注意的使</span>
				<span lang="EN-US">is null</span>
				<span style="font-family: 宋体;">不等于</span>
				<span lang="EN-US">=</span>
				<span style="font-family: 宋体;">，所以不会启动索引。当匹配模式是一个常量并且常量位于开头处时，如：</span>
				<span lang="EN-US">col like ‘foo%’</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">col ~ ‘^foo’</span>
				<span style="font-family: 宋体;">，也将启动索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">r-tree</span>
				<span style="font-family: 宋体;">适用与处理二维空间的数据时，要创建一个</span>
				<span lang="EN-US">r-tree</span>
				<span style="font-family: 宋体;">索引可以使用如下命令：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">create indes INDEX_NAME on TABLE_NAME using rtree (COLUMN_NAME);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">当一个索引了的列涉及到使用下列操作符之一进行比较的时候，</span>
				<span lang="EN-US">PostgreSQL </span>
				<span style="font-family: 宋体;">的查询规划器都会考虑使用</span>
				<span lang="EN-US">R-tree </span>
				<span style="font-family: 宋体;">索引∶</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">&lt;&lt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&amp;&lt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&amp;&gt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&gt;&gt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&lt;&lt;|</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&amp;&lt;|</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">|&gt;&amp;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">|&gt;&gt;</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">~</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">@</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">~=</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">&amp;&amp;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">散列（</span>
				<span lang="EN-US">hash</span>
				<span style="font-family: 宋体;">）索引只能处理简单的等值查询。就目前而言，由于</span>
				<span lang="EN-US">hash</span>
				<span style="font-family: 宋体;">索引的性能不比</span>
				<span lang="EN-US">b-tree</span>
				<span style="font-family: 宋体;">的好，再加上它的尺寸较大、制作时间较长，并且不支持</span>
				<span lang="EN-US">wal</span>
				<span style="font-family: 宋体;">日志，所以不建议使用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Gist</span>
				<span style="font-family: 宋体;">不是一种单独的索引类型，而是一种架构，可以在这种架构上实现不同的索引策略。根据策略的不同，可以使用使用</span>
				<span lang="EN-US">gist</span>
				<span style="font-family: 宋体;">索引的操作符也不尽相同。需要注意的是，</span>
				<span lang="EN-US">gist</span>
				<span style="font-family: 宋体;">上有实现</span>
				<span lang="EN-US">r-tree</span>
				<span style="font-family: 宋体;">的一组操作符，而且支持</span>
				<span lang="EN-US">wal</span>
				<span style="font-family: 宋体;">日志，因此比</span>
				<span lang="EN-US">r-tree</span>
				<span style="font-family: 宋体;">更加适用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">多字段日志</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 宋体;">关键字：前导字段</span>
				<span style="color: red;">
				</span>
				<span style="color: red; font-family: 宋体;">索引的前导字段对查询性能起着至关重要的作用</span>
				<span style="color: red;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一个索引可以定义在表中的多个字段上。比如，你有如下的表：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create table test2(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Major int,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Minor int,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Name varchar</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">并且经常使用如下的查询语句：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from test2 where major=X and minor=Y;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">那么在</span>
				<span lang="EN-US">major</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">mino</span>
				<span style="font-family: 宋体;">上定义一个索引会比较合适，</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create index multi_index on test2(major,minor);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">目前只有</span>
				<span lang="EN-US">b-tree</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">gist</span>
				<span style="font-family: 宋体;">支持多字段索引，缺省只有</span>
				<span lang="EN-US">32</span>
				<span style="font-family: 宋体;">个字段。可以在编译</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">之前，通过修改</span>
				<span lang="EN-US">pg_config_manual.h</span>
				<tt>
						<span style="font-size: 12pt; color: black;">
								<font face="宋体">中的相关参数来改变。<span lang="EN-US"><o:p></o:p></span></font>
						</span>
				</tt>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">只要在查询条件中包含了多字段索引的子集或者全部，那么就有可能触发索引，但是只有在查询条件中使用索引的最前端字段（前导字段）时，索引才最为有效。准确的规则是在索引的前导字段中使用等值约束，再在第二个字段上加上一个非等值查询，这样将限制需要扫描索引的范围。在这两个字段之后的条件将在索引中查询，这样就减少了对表的操作，但这不会减少需要扫描的索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">比如：有一个建立在</span>
				<span lang="EN-US">(a,b,c)</span>
				<span style="font-family: 宋体;">上的索引，有一个查询的条件：</span>
				<span lang="EN-US">a=5 and b&gt;44 and c&lt;=77</span>
				<span style="font-family: 宋体;">。索引将从符合</span>
				<span lang="EN-US">a=5 and b=44</span>
				<span style="font-family: 宋体;">条件的第一个条目开始扫描，直到所有符合</span>
				<span lang="EN-US">a=5</span>
				<span style="font-family: 宋体;">条件的条目。此时，将跳过对</span>
				<span lang="EN-US">c&gt;=77</span>
				<span style="font-family: 宋体;">的条目的扫描，但之后还是会扫描的。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这个索引也可以用在没有对</span>
				<span lang="EN-US">a</span>
				<span style="font-family: 宋体;">进行约束的查询上，但这势必会大大降低性能，因为这将扫描整个索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">只有当前导字段出现在查询条件中时，才会启用</span>
				<span lang="EN-US">gist</span>
				<span style="font-family: 宋体;">索引。附加的条件将限制返回的索引条目，但前导字段还是起了决定性的作用，它决定需要扫描字段的数量。如果前导索引相应的字段中有较多的相同值，那么即使在附加索引字段上添加查询条件，查询的整体性能依然将不太理想。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">必须很谨慎地使用多字段索引。在大多数情况下，单字段索引已足够了，而且还节省了生成时间和数据库空间。除非对某个表的查许非常固定，一般不要使用多余</span>
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">个字段的索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">多个索引的组合</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 宋体;">关键字：</span>
				<span style="color: red;" lang="EN-US">bitmap bitmap</span>
				<span style="color: red; font-family: 宋体;">保存按物理位置排序的表中行的入口</span>
				<span style="color: red;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">总结上面两节，单个索引只有适用于以下这种情况：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">查询语句中使用了与索引相关的操作符，并且包含索引对应字段的子集字段的交集。举例说就是，如（</span>
				<span lang="EN-US">a</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">b</span>
				<span style="font-family: 宋体;">）的索引可以在如查询条件</span>
				<span lang="EN-US">where a=50 and b=70</span>
				<span style="font-family: 宋体;">的情况下使用，但如果查询条件时</span>
				<span lang="EN-US">where a=50 or b=70</span>
				<span style="font-family: 宋体;">就无法使用该索引了。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">从</span>
				<span lang="EN-US">8.1</span>
				<span style="font-family: 宋体;">版本开始，</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">就增加了组合多索引的功能来解决单个索引无法处理的情况。如</span>
				<span lang="EN-US">where x=44 or x=88 or x=43 or x=12</span>
				<span style="font-family: 宋体;">这样的查询，可以分解为</span>
				<span lang="EN-US">4</span>
				<span style="font-family: 宋体;">个单独的查询，</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">将</span>
				<span lang="EN-US">4</span>
				<span style="font-family: 宋体;">个单独查询的结果用</span>
				<span lang="EN-US">or</span>
				<span style="font-family: 宋体;">运算组合在一起得到最终的结果。再来一个例子是，</span>
				<span lang="EN-US">where x=45 and y=46</span>
				<span style="font-family: 宋体;">，如果再</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">上各有一个索引，那么</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">将分别在这两个索引上扫描，然后将得到的进行与运算，得到最终的结果。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">为了合并多个索引，</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">扫描需要的索引，将符合索引条件的表中行标识在内存中的</span>
				<span lang="EN-US">bitmap</span>
				<span style="font-family: 宋体;">中，</span>
				<span lang="EN-US">bitmap</span>
				<span style="font-family: 宋体;">进行与、或运算得到最终的结果。</span>
				<span lang="EN-US">Bitmap</span>
				<span style="font-family: 宋体;">中记载了按照磁盘顺序排序的表中行的物理位置（查询的结果将对行进行标识），这就意味着任何使用合并的查询将丢失在索引上的排序。如果有</span>
				<span lang="EN-US">order by</span>
				<span style="font-family: 宋体;">这样的排序语句，那么排序的行为将在查询的最后进行，这就降低了性能。所以，有时候规划器会忽略多索引的存在，而只使用单索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在大多数最简单的应用中，可能会有多种索引的组合可供使用，数据库的开发员必须作出合理的选择以优化数据库的性能。有时候，使用多字段索引会很有效，但有时候建立单字段索引再将它们组合起来会更灵活。例如在一表上有对</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">、以、</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">的三种查询。可以分别在</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">上建立单独的索引，利用索引组合可以实现对三种查询的优化。也可以使用一个（</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">）的多字段索引，单它对</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">的查询无能为力。综合两种方法，可以建立一个（</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">）多字段索引，再加上一个建立在</span>
				<span lang="EN-US">y</span>
				<span style="font-family: 宋体;">字段上的索引，唯一的缺点是在</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">上的查询性能将弱于建立在</span>
				<span lang="EN-US">x</span>
				<span style="font-family: 宋体;">上的单独索引。最后一种选择是，建立三种查询的各个索引，只是这会降低更新数据库的性能，因此只能用在查询远多于更新，且三种查询都很普遍的情况下。如果其中有一个字段的索查询量远大于其它的字段及其组合，那么建立单独的两个索引会比较合适。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">唯一索引</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 宋体;">关键字：实现唯一性的细节</span>
				<span style="color: red;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">索引可以强制其所对应字段或字段集合的唯一性。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create unique index NAME on TABLE (COLUMN…)</span>
				<span style="font-family: 宋体;">；</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">目前，只有</span>
				<span lang="EN-US">b-tree</span>
				<span style="font-family: 宋体;">支持唯一索引。一旦索引被声明为唯一，那么所对应的字段（集合）就不允许存在重复的值。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Postgresql</span>
				<span style="font-family: 宋体;">在用户为一字段声明唯一或主约束时，自动生成一个唯一索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">事实上，应当只将唯一索引当作一种实现唯一性的细节，一般情况下使用如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Alter table …add constraint…</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">来实现唯一性约束，而不直接创建唯一索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">建立在表达式上的索引</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 宋体;">关键字：计算值</span>
				<span style="color: red;">
				</span>
				<span style="color: red; font-family: 宋体;">索引中存储计算值，与单索引的查询速度相同</span>
				<span style="color: red;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">索引不仅可以建立在对印表的某些字段上，还可以建立在以某些字段的值为参数的函数和表达式上。这个特性对于优化以计算值为查询条件的搜索很有效。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">例如，查询一个与大小写无关的比较</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from test1 wherelower(clo1)=’value’;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">相应的，可以建立如下的索引：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create index test_lower_col1_idx on test1(lower(col1));</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">如果我们将这个索引声明为唯一索引，那么就可以实现与大小写无关的唯一性约束了。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">另一个例子是，如果经常使用如下的查询：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from people where ( first_name||’’||last_name)=’jone smith’;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">可以建立如下的索引：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create index full_name_idx on people((first_name || ‘’ || lastname));</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">create index</span>
				<span style="font-family: 宋体;">语法中，除了单个函数外，对应的字段表达式都要有圆括号包起来。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">维护表达式索引的代价相对较大，因为索引中存储的是真正的计算值而不是在查询中计算，虽然这大大提升了相关的查询速度（与单字段索引的速度相同），但每次执行更新或者插入都需要计算出相应的值。所以，这种索引只用在追求查询速度，而对插入和更新不太计较的情况下。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<h3 style="margin: 13pt 0cm;">
				<span style="font-family: 宋体;">
						<font size="5">部分索引</font>
				</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: red; font-family: 宋体;">关键字：索引条件</span>
				<span style="color: red;">
				</span>
				<span style="color: red; font-family: 宋体;">查询只有在匹配索引条件时才可能被触发</span>
				<span style="color: red;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">部分索引是建立在表的子集上的索引，该子集有索引中的条件表达式决定。只有符合表达式条件的表的行才会被建立索引。部分索引是一种特殊的特征，但在一些特定的场合中会很有用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">建立部分索引的主要理由是避免对普便的数据建立索引。因为一个重复的普遍数据可能在表中占据较可观的比例，在其上建立索引不会起到优化性能的结果，事实上规划器甚至不会启动索引。建立部分索引，不但减小了索引的大小，从而提高了查询的速度，而且加速了更新的速度。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">假设，在数据库中存储了网络服务器的登陆记录。大多数的记录显示来自于内网的访问。如果我们需要检索的仅仅是来自外网的记录，那么就不必在整张表上建立索引，只需建立部分索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create table access_log(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">url varchar,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">client_ip inet,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">…</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">可建立如下的部分索引：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create index access_log_client_ip_idx on access_log (client_ip) </span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Where not (client_ip &gt; inet ‘192.168.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="100" unitname="’" w:st="on">100.0’</st1:chmetcnv> and client_ip &lt; inet ‘192.168.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="100.255" unitname="’" w:st="on">100.255’</st1:chmetcnv>);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一个典型的可以使用以上索引的查询是：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from access_log where url = ‘/index.htm’ and client_ip = ‘212.78.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="10.32" unitname="’" w:st="on">10.32’</st1:chmetcnv>::inet;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一个不能使用该索引的例子：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from access_log where client_ip = inet ‘192.168.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="100.23" unitname="’" w:st="on">100.23’</st1:chmetcnv>;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">注意到像这样的部分索引需要可预计的普遍数值。如果数值的分布因为应用程序的性质而是固定的，或者是不随时间变化的静态值，那么建立这样的部分索引并不困难。但如果普遍数据来自于不固定的大量一致性数据（拥有相同的索引对应字段的值）装载，那么就需要管理员不断地修改索引。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">另一个部分索引地应用是剔除某些典型查询不感兴趣的数据。在能收到于以上情况相同的效果的同时，它还避免进入不干兴趣的数据，即使索引对访问这些不感兴趣的数据有好处。建立这种索引必须很小心，应该事先做大量的试验。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">例子：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">如果有这么一个表，包含了已付款和未付款的订单，未付款的订单只占总数据很小的一部分，但却被很频繁地访问，为优化性能，可以在该表上建立为付款订单的部分索引。索引如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create index orders_unbilled_index on orders(order_nr)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Where billed is not true;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一个可能启动该索引的查询是：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from orders where billed is not true and order&lt;10000;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">然而，该索引还可以被不涉及到</span>
				<span lang="EN-US">order_nr</span>
				<span style="font-family: 宋体;">的查询触发：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from orders where billed is not true and amount&gt;500.00;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">该查询显然不会比直接建立在</span>
				<span lang="EN-US">amount</span>
				<span style="font-family: 宋体;">上的索引高效，因为这相当于在检索一个表，但如果</span>
				<span lang="EN-US">unbilled</span>
				<span style="font-family: 宋体;">的数据量较少的话，它还是一个不错的选择。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这样的查询将不会使用以上的索引：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Select * from orders where order_nr=3501;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这个例子说明了索引字段不必于条件中涉及的字段相同。</span>
				<span lang="EN-US">Postgresql</span>
				<span style="font-family: 宋体;">支持任意条件字段的部分索引，只要这些字段出现在表中。要记住的一点是，只有在索引中的条件符合查询条件时，部分索引才会触发。更准确地说，只有在查询条件中，以数学上地意义包含了部分索引的条件，该索引才会起效。至今，</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">还没有一套复杂的理论来保证系统可以识别形式不同、但却有相同意义的数学表达式。（这样功能的实现过于复杂，而且在真正应用中会很慢。）系统可以自动识别简单的不等式包含，比如：“</span>
				<span lang="EN-US">x&lt;1</span>
				<span style="font-family: 宋体;">”包含在“</span>
				<span lang="EN-US">x&lt;2</span>
				<span style="font-family: 宋体;">”中，除此之外必须提供精确匹配索引条件的查询条件。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">第三种情况不需要部分索引被查询使用，主要用于在字段的部分数据上建立唯一约束。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create table tests(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Subject text,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">target text,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">success Boolean,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">…..</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Create unique index tests_success_constraint on tests (subject, target) where success;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">最后，部分索引可以重载系统的查询规划选择。这发生在因为数据分布较为特殊，而使系统在不该使用索引的时候使用了索引。这时可以建立部分索引使得它在此类查询中不可用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">需要注意的是，建立部分索引意味着索引建立者必须知道查询，特别是要知道索引在什么情况下是有用的。要完全掌握需要丰富的经验，并且要理解</span>
				<span lang="EN-US">postgresql</span>
				<span style="font-family: 宋体;">索引的工作原理。大多数情况下，部分索引不比一个普通的索引更显优势。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/14496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-08-01 08:35 <a href="http://www.cnitblog.com/gyn/archive/2006/08/01/14496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>postgres8.1字符串常函数概述</title><link>http://www.cnitblog.com/gyn/archive/2006/07/20/13873.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 20 Jul 2006 01:21:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/07/20/13873.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/13873.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/07/20/13873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/13873.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/13873.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span lang="EN-US">Char_length(string)</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">character_length(string)</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">length(string)</span>
				<span style="font-family: 宋体;">地作用是一样地，都用来得到字符串地长度。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span lang="EN-US">Lower(string)</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">upper(string)</span>
				<span style="font-family: 宋体;">用来转换字符串地大小写</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">3.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span lang="EN-US">Overlay(string1 placing string2 from number1 for number2)</span>
				<span style="font-family: 宋体;">用来将</span>
				<span lang="EN-US">string1</span>
				<span style="font-family: 宋体;">中</span>
				<span lang="EN-US">number1</span>
				<span style="font-family: 宋体;">开始地</span>
				<span lang="EN-US">number2</span>
				<span style="font-family: 宋体;">个字符替换为</span>
				<span lang="EN-US">string2</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">4.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span lang="EN-US">Substring(string1 from num/string2 [for num])</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">substring</span>
				<span style="font-family: 宋体;">地用法比较复杂，但基本上可分为两种：按位置取词；按正则表达式取词。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">5.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span lang="EN-US">Trim(leading | trailing | both [characer] from string)</span>
				<span style="font-family: 宋体;">用于在三种位置删除指定的最长字符。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">6.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span lang="EN-US">Initcap(string)</span>
				<span style="font-family: 宋体;">用于将单词首字大写化，事实上它就类似于：</span>
				<span lang="EN-US">overlay(string placing upper(substring(string from 1 for 1)) from 1 for 1)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">7.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span style="font-family: 宋体;">相对于</span>
				<span lang="EN-US">overlay</span>
				<span style="font-family: 宋体;">的按位置替换，</span>
				<span lang="EN-US">replace(string,from text,to text)</span>
				<span style="font-family: 宋体;">则是按词替换</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">8.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">         </span></span>
				</span>
				<span style="font-family: 宋体;">最后一个较常用的字符函数是</span>
				<span lang="EN-US">translate</span>
				<span style="font-family: 宋体;">（</span>
				<span lang="EN-US">string,from text, to text</span>
				<span style="font-family: 宋体;">），它将</span>
				<span lang="EN-US">from text</span>
				<span style="font-family: 宋体;">中的字符集按照一对一的关系替换为</span>
				<span lang="EN-US">to text</span>
				<span style="font-family: 宋体;">中的字符集。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/13873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-07-20 09:21 <a href="http://www.cnitblog.com/gyn/archive/2006/07/20/13873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用来建立“局”文中数据库的脚本</title><link>http://www.cnitblog.com/gyn/archive/2006/05/15/10567.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 15 May 2006 13:25:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/05/15/10567.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/10567.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/05/15/10567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/10567.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/10567.html</trackback:ping><description><![CDATA[create table net_top(switch_pos int, floor int);<br />create table net_port(room int primary key, port1 int default 0, port2 int default 0);<br />create table net_mac_addr(room int references net_port(room),<br />mac_addr varchar(30) unique check (mac_addr ~ '^(00)[0-9A-F]{10}$'), <br />ip_addr varchar(30) check (ip_addr ~ '[0-9]{3}(\.[0-9]{1,3}){3}$'),<br />owner varchar(20)<br />);<br />create view net_room_view as<br />select * from net_top t left outer join net_port p <br />on (p.room/100=t.floor or p.room=t.floor);<br />create view net_owner_view as<br />select n.room, n.mac_addr, n.ip_addr, n.owner, p.port1, p.port2<br />from net_mac_addr n left outer join net_port p<br />on (n.room=p.room);<br /><br />存在'E:\dbase_related\net_mgr.sql'中，然后在命令行中执行<br />psql -U postgres -f e:\dbase_related\net_mgr.sql<br />就行了。<img src ="http://www.cnitblog.com/gyn/aggbug/10567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-05-15 21:25 <a href="http://www.cnitblog.com/gyn/archive/2006/05/15/10567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>局域网电脑管理系统之一：信息数据库的架构</title><link>http://www.cnitblog.com/gyn/archive/2006/05/11/10374.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 11 May 2006 13:37:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/05/11/10374.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/10374.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/05/11/10374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/10374.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/10374.html</trackback:ping><description><![CDATA[
		<h1 style="margin: 12pt 0cm 3pt; text-align: center;" align="center">
				<span style="font-family: 宋体;">
						<font size="5">局域网电脑管理系统之一</font>
				</span>
		</h1>
		<h3 style="margin: 12pt 0cm 3pt; text-align: center;" align="center">
				<span style="font-family: 宋体;">信息数据库的架构</span>
		</h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">使用</span>
				<span lang="EN-US">postgresql8.1</span>
				<span style="font-family: 宋体;">建立信息数据库。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">建立三张表：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">      </span></span>
				<span style="font-family: 宋体;">交换机分布表：</span>
				<span lang="EN-US">net_top</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">      </span></span>
				<span style="font-family: 宋体;">办公室与井道端口对应表：</span>
				<span lang="EN-US">net_port</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">      </span></span>
				<span lang="EN-US">mac</span>
				<span style="font-family: 宋体;">地址表：</span>
				<span lang="EN-US">net_mac_addr</span>
				<br />
				<br />
				<img style="width: 448px; height: 218px;" alt="o_dp.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_dp.jpg" width="553" border="0" height="274" />
				<br />
				<br />
				<span style="font-family: 宋体;">建立的程序如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>create table net_top(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>switch_pos integer,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>floor integer</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>create table net_port(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>room integer,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>port1 integer,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>port2 integer</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>create table net_mac_addr(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>room integer,</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>mac_addr varchar(30),</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>ip_addr varchar(30),</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>owner varchar(20)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">建立视图</span>
				<span lang="EN-US">net_room_port</span>
				<span style="font-family: 宋体;">，将表</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">连接起来。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">create view net_room_view as</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">
						<span style="">  </span>select * from net_top t left outer join net_port p </span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 72pt; text-indent: 36pt;">
				<span lang="EN-US">on (p,room/100=t.floor);</span>
				<br />
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<br />
						<img style="width: 467px; height: 219px;" alt="o_net_room_port.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_net_room_port.jpg" width="553" border="0" height="274" />
						<br />
						<br /> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">给</span>
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">张表添加约束，使之能正确得存储。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">net_port</span>
				<span style="font-family: 宋体;">中，将</span>
				<span lang="EN-US">room</span>
				<span style="font-family: 宋体;">设为主键：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>alter table net_port add constraint room_prim primary key (room);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">net_mac_addr</span>
				<span style="font-family: 宋体;">中将</span>
				<span lang="EN-US">room</span>
				<span style="font-family: 宋体;">设为</span>
				<span lang="EN-US">net_port.room</span>
				<span style="font-family: 宋体;">的外键：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>alter table net_mac_addr </span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 72pt; text-indent: 36pt;">
				<span lang="EN-US">add foreign key (room) references net_port;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">net_mac_addr</span>
				<span style="font-family: 宋体;">中设置</span>
				<span lang="EN-US">mac_addr</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">ip_addr</span>
				<span style="font-family: 宋体;">的检查：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>alter table net_mac_addr add constraint mac_check check</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 72pt; text-indent: 36pt;">
				<span lang="EN-US">(mac_addr ~ ‘^(00) [0-9A-Z]{10 }$’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>alter table net_mac_addr add constraint ip_check</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">                     </span>check (ip_addr ~ ‘[0-9]{3}(\.[0-9]){1,3}$’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">表建立以后，就要进行数据输入。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">：输入表</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">的数据：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">新建一个文本文键</span>
				<span lang="EN-US">e:\switch.txt</span>
				<span style="font-family: 宋体;">，在其中输入数据，如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">2<span style="">       </span>1</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">2<span style="">       </span>2</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">2<span style="">       </span>3</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">6<span style="">       </span>4</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">6<span style="">       </span>5</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">6<span style="">       </span>6</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">8<span style="">       </span>7</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">8<span style="">       </span>8</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">8<span style="">       </span>9</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">8<span style="">       </span>10</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">12<span style="">     </span>11</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">12<span style="">     </span>12</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">12<span style="">     </span>13</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">12<span style="">     </span>14</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">12<span style="">     </span>15</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span style="font-family: 宋体;">保存后，将该文本内容拷贝至表</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">中。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">copy net_top from ‘e:/switch.txt’;</span>
				<br />
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<br />
						<img style="width: 465px; height: 214px;" alt="o_net_top.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_net_top.jpg" width="553" border="0" height="274" />
						<br /> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">：输入表</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">的内容</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">新建一个文本文键</span>
				<span lang="EN-US">e:\room.txt</span>
				<span style="font-family: 宋体;">，编写一个脚本用来输入房间号：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">open(FILE,'&gt;e:/switch.txt');</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">for($init=1; $init&lt;=15; $init++){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>for($temp=1; $temp&lt;=15; $temp++){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>$sum=$init*100+$temp;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>print FILE "$sum"."\n";</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>} </span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">close FILE;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">
						<span style="">  </span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">然后根据大楼井道分布图所示，将端口填入，以下是其中的一部分：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>101<span style=""></span>104<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">102<span style="">   </span>116<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">103<span style="">   </span>105<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">104<span style="">   </span>103<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">105<span style="">   </span>106<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">106<span style="">   </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">107<span style="">   </span>107<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">108<span style="">   </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">109<span style="">   </span>108<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">110<span style="">   </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">11<span style="">     </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">112<span style="">   </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">113<span style="">   </span>109<span style=""></span>110</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">114<span style="">   </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">115<span style="">   </span>0<span style="">     </span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">201<span style="">   </span>204<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">202<span style="">   </span>201<span style=""></span>0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span style="font-family: 宋体;">总共</span>
				<span lang="EN-US">228</span>
				<span style="font-family: 宋体;">个数据。需要提醒的是，以上所有数据行中的数据都用制表符</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span style="font-family: 宋体;">分割。保存后，将该文本内容拷贝至表</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">中。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 36pt;">
				<span lang="EN-US">copy net_port from ‘e:/room.txt’;</span>
				<br />
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<br />
						<img style="width: 449px; height: 211px;" alt="o_net_port.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_net_port.jpg" width="553" border="0" height="274" />
						<br /> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">：输入表</span>
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">的内容</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span style="font-family: 宋体;">这是最艰巨的，需要一台电脑接着一台得打入</span>
				<span lang="EN-US">ipconfig –all</span>
				<span style="font-family: 宋体;">，然后在逐一输入。为了简化操作，写了一组采集程序。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span style="font-family: 宋体;">服务器端的程序如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$in_buffer=undef;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$PF_INET=2;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$port=2345;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$local_addr=pack('SnC4x8',$PF_INET,$port,192,168,138,105);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$SOCK_DGRAM=2;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">socket(UDP_SERVER,$PF_INET,$SOCK_DGRAM,getprotobyname('udp')) or die("$!");</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">bind(UDP_SERVER,$local_addr) or die("$!");</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">listen(UDP_SERVER,100);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">print("waiting for connection...\n");</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$count=0;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">while(1){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>print $count." connection..\n";</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>$count++;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>if(recv(UDP_SERVER,$in_buffer,100,0)){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>open(FILE,'&gt;&gt;e:/mac_addr.txt');</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>chomp($in_buffer);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>print FILE $in_buffer."\n";</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>close FILE;<span style="">   </span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>else{next;}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">close(UDP_SERVER);</span>
				<br />
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<br />
						<img style="width: 434px; height: 245px;" alt="o_net_mgr_serv.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_net_mgr_serv.jpg" width="553" border="0" height="357" />
						<br /> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span style="font-family: 宋体;">客户端的程序如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">@stack=();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$mac_addr=undef;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$ip_addr=undef;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">print('</span>
				<span style="font-family: 宋体;">请输入您的办公室门牌号码：</span>
				<span lang="EN-US">');</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$room_num=&lt;STDIN&gt;;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">chomp($room_num);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">print('</span>
				<span style="font-family: 宋体;">请输入您的姓名拼音：</span>
				<span lang="EN-US">');</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$name=&lt;STDIN&gt;;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">chomp($name);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">open(FOO,'-|',"ipconfig -all");</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">while(&lt;FOO&gt;){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>chomp();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>if($_=~s/(.*)(00(\-[0-9A-Z]{2}){5})(.*)/$2/){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>$mac_addr=join('',split(/-/,$_));</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>if($_=~/IP Address/){</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>$_=~s/(.*)([0-9]{3}(\.[0-9]{1,3}){3})(.*)/$2/;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">         </span>$ip_addr=$_;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">
						<span style="">  </span>}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">close FOO;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">push(@stack, $room_num);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">push(@stack, $mac_addr);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">push(@stack, $ip_addr);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">push(@stack, $name);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$out_buffer=join("\t",@stack);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">print $out_buffer."\n";</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$PF_INET=2;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$port=2345;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$remote_addr=pack('SnC4x8',$PF_INET,$port,192,168,138,105);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">$SOCK_DGRAM=2;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">socket(UDP_CLIENT,$PF_INET,$SOCK_DGRAM,getprotobyname('udp'));</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">send(UDP_CLIENT,$out_buffer,0,$remote_addr);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">close(UDP_CLIENT);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US">exit;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;">
				<span lang="EN-US"> <o:p></o:p></span> <span lang="EN-US"> <o:p></o:p></span></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
				<br />
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<img style="width: 467px; height: 287px;" alt="o_net_mgr_cli.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_net_mgr_cli.jpg" width="553" border="0" height="357" />
						<br /> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">采集的数据被记录到服务器中：<br /></span>
				<br />
				<img style="width: 465px; height: 279px;" alt="o_mac_addr.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_mac_addr.jpg" width="553" border="0" height="387" /> </p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">然后将数据导入数据库：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">copy net_mac_addr from ‘e:/mac_addr.txt’;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
				<br />
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<img style="width: 465px; height: 192px;" alt="o_net_mac_addr.jpg" src="http://www.cnitblog.com/images/cnitblog_com/gyn/2736/o_net_mac_addr.jpg" width="553" border="0" height="274" />
						<br /> <o:p></o:p></span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/10374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-05-11 21:37 <a href="http://www.cnitblog.com/gyn/archive/2006/05/11/10374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>