gdufo

 

id工作流任务分配的一个序列图

id工作流任务分配的一个序列图

posted @ 2012-05-19 11:12 gdufo 阅读(572) | 评论 (0)编辑 收藏

VisualSVN 管理

http://blog.csdn.net/happyjiang2009/article/details/5719988

以前使用官方Subversion搭建SVN版本控制环境,感觉很繁琐,需要手动该文件,很麻烦,今天在网上看到了VisualSVN搭建版本控制环境的方法,写出来和大家分享一下。欢迎提出问题O(∩_∩)O~

1、下载安装文件(服务器端和客户端)

服务器端采用VisualSVN,一个可用的下载地址是:http://idc218b.newhua.com/down/VisualSVN-Server-2.1.2.zip,如果链接失效,从百度谷歌搜索就可以了,很多下载地址。

客户端采用大家熟悉的Tortoisesvn,没错,就是那个小乌龟,官方下载地址是:http://tortoisesvn.net/

服务器端用来存放提交的文件,客户端用来连接服务器端,提交和下载服务器端的文件,(这个不用我多说了吧,下一话题^_^)

2、安装服务器端,解压缩下载的文件VisualSVN-Server-2.1.2.zip,双击VisualSVN-Server-2.1.2.msi进行安装

安装过程中有一个界面是选择安装的组件,选择第一个“VisualSVN Server and Management Console”就可以了。如图

下一个界面的设置如图:

可以更改目录,也可以更改端口,注意,端口不要和已经使用的端口冲突,去掉“use secure connnection https://”的选项

这里的C:/Repositories是服务器文档目录,也就是我们提交到SVN里的文档的存放目录,这个目录大家可以更改

点击下一步,默认安装完成即可。

3、安装客户端软件TortoiseSVN-1.5.3.13783-win32-svn-1.5.2.msi,双击默认安装就可以了,安装完成可能要重启,重启即可。

4、配置服务器端

点击开始-->程序->VisualSVN-->VisuaSVN Server Manager启动服务器管理器,右键选择VisualSVN Server(Local),选择Properties,在弹出窗口中选择NetWork标签,在ServerName处输入本机的IP地址,我的地址为 192.168.158.129,端口我选择8080.,确定保存,再点击VisualSVN Server可以看到右面的界面,我们的访问地址就是Sever URL http://192.168.158.129:8080/svn/

 

现在我们新建两个目录,右键选择Repositories,选择Create new Repository,输入名字document,保存

新建用户,右键选择 Users,选择Create User,输入用户密码test,test,这个口令将在客户端连接SVN服务器时使用

为刚才创建的document  Repository添加用户,右键选择document,选择Properties,点击Add按钮,选择刚才添加的用户,保存,如图

 

这样,服务器端就配置好了,回到客户端

 

因为已经安装了客户端软件Tortoisesvn,在D盘下,新建文件夹testsvn,打开文件夹,右键选择check out(检出),

在弹出窗口的版本库URL处输入,http://192.168.158.129:8080/svn/document

如图

 

确定,保存。注意上面的检出至目录是D:/testsvn,

在testsvn中新建一个文本文档,新建文本文档.txt,在testsvn空白处,点击右键,选择提交,(commit),则文件会被传到文档服务器,其他人就可以下载了。

posted @ 2012-05-17 15:06 gdufo| 编辑 收藏

VSTO outlook视频教程

VSTO实战开发-Outlook add-ins开发(5) 

下载课程 WMV MP4 MP3 PDF 


VSTO实战开发-Outlook add-ins开发(4) 
下载课程 WMV MP4 MP3 代码 PDF 


VSTO实战开发-Outlook add-ins开发(3) 
下载课程 WMV MP4 MP3 代码 PDF Q&A 


VSTO实战开发-Outlook add-ins开发(2) 
下载课程 WMV MP4 MP3 代码 PDF Q&A 


VSTO实战开发-Outlook add-ins开发(1) 
下载课程 WMV MP4 MP3 代码 PDF Q&A

参考资料:

http://technet.microsoft.com/zh-cn/ms269110.aspx

http://www.c-sharpcorner.com/uploadfile/satisharveti/outlook-add-in-to-read-a-mail/

http://msdn.microsoft.com/zh-cn/library/bb386094.aspx (MSDN)

posted @ 2012-05-04 16:43 gdufo 阅读(833) | 评论 (0)编辑 收藏

eclipse下SVN subclipse插件

subversion程序,和mysql很类似,是c/s结构的,有客户端和服务器端。服务器端和客户端都是通过命令行方式启动和执行的。本文只会使用到客户端的命令。

第三方提供了各种图形界面的客户端工具,比如eclipse插件subclipse,windows图形界面工具tortoiseSVN。这些后面会提到它们的基本使用。

subversion资源

安装subversion

有关subversion和subclise的安装暂略,因为目前提供的虚拟机开发环境已经安装和配置。

tortoiseSVN,可到官方网站上下载最新版本的windows安装包,默认安装,不需要做其他设置,安装后需要重启计算机。能在资源管理器中鼠标右键菜单看到如下图所示条目,就说明安装成功。

image

使用subversion

日常工作中使用subversion仅仅是几个命令或者操作,并不复杂。但是它内部的一些机制需要逐渐去理解。

检出代码

在刚开始进入一个开发队伍的时候,已经有版本控制和软件项目,使用的第一个命令往往是检出(checkout)代码。或者当使用和研究开源软件的时候,也是第一个要用到这个命令。这个命令的作用是把项目的源代码下载到用户本地,并且带有版本控制信息。

比如,执行以下命令获取一个项目的源代码:

svn co http://easymorse.googlecode.com/svn/trunk/vfs.demo/

这个命令将在本地当前目录建vfs.demo目录并将该服务器目录下的所有文件下载到本地,并且,会生成隐藏文件.SVN目录,用于记录版本控制信息。

tortoiseSVN有图形界面的检出操作,但是命令行方便快捷,建议使用命令行。

如果使用eclipse并安装了subclipse插件,可以通过插件导入项目。

image

然后,

image

选择或者新建资源库位置,

image

选择资源库中的项目目录。

image

然后,就可以完成(finish)了。

image

初始导入

何时使用初始导入,比如,对于java开发人员来说,在eclipse中编写了一个项目,并决定把项目共享到版本控制器上,这时就需要初始导入操作了。

以下以subclipse为例说明初始导入的步骤。

第一步,选择share project,共享你的项目:

image

选择通过svn共享项目:

image

填写svn提交的url:

image

这个url,需要subversion的管理员告知你,还有用户名和密码。如果想练习一下,google提供了免费的svn,你可以通过:http://code.google.com 申请项目,这样就会有类似我上面的url和权限。

然后可以直接点击finish,完成初始提交。选择next,可以做定制模块名和初始提交的信息,一般不需要。

如果你的svn服务器使用了https协议,需要接受一个数字证书,一般选择永久接受。

image

之后,会要求输入用户名和密码。建议勾选保存密码,否则会很麻烦。

image

这样,再看项目,会发现条目上多了问号,这时需要选择哪些目录和文件需要提交,哪些需要忽略,比如生成的class文件等。

image

选择需要忽略的文件或者目录,这时需要切换到导航视图下才能看到所有文件和目录:

image

从导航视图看到的情况:

image

选中需要忽略的目录和文件,操作svn:

image

然后提交整个项目即可。有关提交的操作见下文。

更新项目

项目在提交前,应该先做更新项目操作。比如有一个文件a.txt,已经提交到svn中,这样,可能有其他用户提交了新的改动到a.txt,你现在又 修改了a.txt,准备提交你的改动。先操作更新a.txt,这样如果该文件在svn服务器已经改动,会将改动加入到当前本地的a.txt中。

在subclipse中的操作:

image

提交代码

提交代码,一般会级联当前目录下所有改动的内容。

image

删除代码

对于不再使用的代码,可以直接删除掉,比如通过windows删除文件,通过ubuntu的rm命令或者通过eclipse的delete功能,然后提交项目,subclipse会知道哪个文件被删除了,并将这个变化通知给svn服务器。

还原代码

如果代码做了改动,可以是多个文件,也可以删除了文件或者新增了文件,但是没有提交到svn服务器,可以通过还原功能恢复到改动前的样子。

image

版本的分支与合并

版本的分支和合并,是版本控制的核心功能。

比如,软件通过版本的分支,将项目分配给多人做分工开发,通过版本合并,将这些分工实现的代码合并到新的版本中;或者,修改代码bug的时候,可以 先打出一个版本分支,保留出现bug的版本,比如分支版本名称为pre_fix_bug_2201,这里2201表示bug的代号,然后针对这个分支做修 改fix这个bug,再将修改后的内容提交到一个新的分支版本,比如post_fix_bug_2201,再到适当时候将这个分支合并到代码主干中去。

以上说了一下版本分支与合并的用途,这里简单说一下svn版本分支合并的基本原理。

首先是版本分支,实际上是将当前版本“copy”到分支上,非常类似windows下,将某个目录的快捷方式复制到其他路径。这种copy,可以说 是轻量级copy或者叫廉价copy,不是复制版本内容,而是做一个内部的引用。这样的copy很快,对服务器也没有空间上的开销。

版本的合并,是svn开发中的难点,当做版本合并的时候,服务器会试图智能的合并同一个文件的不同版本,可能会带来版本冲突,这需要操作者做手工的处理,消除版本冲突。合理分工的项目应该可以通过管理手段尽量避免这种情况。

以下是通过subclipse演示版本分支的操作。首先,项目文档应该已经全部提交,然后,选择

image

然后,填写url,一般是在tags/目录下:

image

然后默认选项,next即可,然后选择finish按钮。在svn的相应路径下就会有一个同名的项目。

image

打分支,实际上就是建立了一个项目的轻量级copy。

如何从版本的一个分支切换到另外一个分支,这也是很重要的,它能帮助你轻松在不同的项目版本中自动切换,而不必在eclipse里维持多个项目。

image

选择要切换的项目版本路径,或者直接输入亦可。

image 

然后点击ok后,项目即可切换到该版本下。

在分支上做了改动,并且已经提交(一般tags目录下的项目约定是只读的,不建议改动,这里是为了举例方便),那么,可以将这个版本合并到trunk(主干)代码中,让主干也拥有最新的代码。

image 

选择需要合并的源,比如从tags上面一个版本,合并到主干(trunk)代码中。

image

之后,需要设置一些合并的特性,这里默认配置即可。

image

执行完毕后,会有一个合并报告,可见没有出现冲突情况。

image

这时候看源代码,可以发现有改动,这些改动就是合并过来的代码。

image

改动如果没有问题,就可以提交,这样就完成了一次版本的合并工作。

 

 

“还原”已经提交的改动

如果文档没有提交,还原是很容易的,只需执行还原(revert)就可以了。有时候,已经提交了代码,结果发现了问题,需要回退到之前提交的版本,就不是很容易了。

这时候的还原,其实是将以前的某个修订本(revision)覆盖当前的本地工作拷贝。然后再提交这些改动,成为新的修订本。

下面演示一下。

首先提交了一个版本的改动,这是以后需要还原回来,这里,为了以后还原方便,要在提交的消息中说明改动了什么。(这一步在开发中是必须的,是纪律)

image

下面,再修改一下项目,然后提交一次,这里故意增加一个文件。

image

提交以后,后悔了,想恢复到前一个修订版。虽然可以通过版本号进行覆盖还原,但是一般人是无法记忆这个版本号的,另外就是实际情况往往更复杂,不会像示例中那样是相邻的两个修订版。

所以提交修订版时的注解消息就显得特别重要。

这时可以通过svn的日志功能查看到这些版本和它们的注释消息。

image

看到历次版本的消息内容。

image

这样,根据注释,我们很容易找到需要还原到以前的那个修订版。如果不放心,我们还可以根据上下文菜单,对比两个修订版的区别。

image

看比较结果。可以看出,增加了一个文件,另外一个文件中有一处差异。

image

那么,可以确定是从125修订版恢复(还原)。

image

更改后的项目,相当于用125修订版还原了126修订版。

image

可以看到126版本添加的文件不见了,另外VfsDemo.java文件也还原到125版本的内容。这时提交将成为127版本,这个版本其实就是125版本。算是还原了主干(trunk)上的代码。

image

刷新历史,可以看到修订版已经生效。

image

posted @ 2012-04-28 21:09 gdufo| 编辑 收藏

Windows下安装SVN(Subversion)独立服务器步骤:

参考:
http://blog.ofriend.cn/post/95.html

Windows下安装SVN(Subversion)独立服务器步骤:

安装之前需要准备的软件:

1、Setup-Subversion-1.7.0.msi
2、TortoiseSVN-1.7.0.22068-win32-svn-1.7.0.msi
3、LanguagePack_1.7.0.22068-win32-zh_CN.msi

下载地址:

1、http://sourceforge.net/projects/win32svn/files/ 
2、http://sourceforge.net/projects/tortoisesvn/files/

安装步骤及简要配置:

1、安装Setup-Subversion-1.7.0.msi
2、安装TortoiseSVN-1.7.0.22068-win32-svn-1.7.0.msi
3、安装LanguagePack_1.7.0.22068-win32-zh_CN.msi

4、添加subversion环境变量:c:\program files\subversion\bin

5、创建版本库:
a、svnadmin create c:\svn\repository
b、创建空目录repository->右键->TortoiseSVN->Create Repository here...

6、配置用户和认证:
 Svnserve.conf:核心配置文件:
  # password-db = passwd >password-db = passwd
  # authz-db = authz >authz-db = authz
 Authz:配置用户权限的文件
 Passwd:新加用户名和密码的文件

启动subversion:

在dos命令下,输入:> svnserve exe -d -r d:\svn_repo(这行自己加的)

7、运行Subversion:c:\svn\repository>svnserve --daemon
 或者:c:\svn\repository>svnserve --daemon --root c:\svn
注:运行的时候不能关闭命令行窗口,关闭服务就退出了!因此可以添加到系统服务项随机启动即可!

8、添加系统服务,随系统启动:
sc create svnservice  binpath= "c:\program files\subversion\bin\svnserve.exe --service --root c:\svn" displayname= "Subversion" depend= tcpip start= auto

9、删除服务:
sc delete svnservice


注:在Windows XP SP3下测试通过!其他平台暂未测试!

posted @ 2012-04-28 18:41 gdufo| 编辑 收藏

在idempiere增加自己的插件

http://www.vogella.com/articles/OSGi/article.html#OSGi_firstbundle
http://www.vogella.com/articles/OSGi/article.html#exportbundle

http://wiki.eclipse.org/Gemini/Web

值得说明一点:

网页的目录不会放在webapps(tomcat)目录下的,是根据MANIFEST.MF

Web-ContextPath: /osgi-web-app的属性来访问的,http://domain:port/osgi-web-app

 

 

Install file: plugins/myplugins.jar

 

Osgi> start xx

 

让你的plugin自安装

C:\adempiere\configuration\org.eclipse.equinox.simpleconfigurator 目录下的bundles.info

最后一行增加

osgi.web.app,0.0.1,plugins/osgi.web.app.war,4,false(名字,版本号,路径,启动优先级)


有些情况下,bundle没有能自启动,状态不是active,要在

要在config.ini设置bundle @start,就可以了

==

另如果自己写了一个plugin,想通过buckminster来自动打包,要在cspec文件中增加,仿wstore样式。

posted @ 2012-04-28 15:38 gdufo| 编辑 收藏

idempiere 安装相关文档

http://www.globalqss.com/wiki/index.php/IDempiere

http://kenai.com/projects/hengsin/pages/Building

 

下载Eclipse 3.6以上版本

Eclipse IDE for Java EE Developers 3.6+

我这这里下的是3.7

 

安装Mecurial插件

1.)打开Mercurial Eclipse Plugin 1.6+

 (2.)复制红色方框中的地址

  (3.)EclipseHelp->Install New Software

4.)如果你不懂怎么安装插件,请看这里

 

http://download.eclipse.org/tools/buckminster/updates-3.7

 

 

安装Mercurial 2.1.1客户端

Mercurial Client

http://mercurial.selenic.com/downloads/

因我的操作系统是XP的,所以下载X86, 如果是win7 就要下载X64的。

 

安装完成后,下载原代码:

cd D:\idempiere\
hg clone https://bitbucket.org/idempiere/idempiere

 

 

1. 从 adempiere的根目录 下面搜索一下 Test.sql
2. 在 adempiere的根目录 下面新建 utils\oracle\ 文件夹。
3. 将搜索到的Test.sql放到 utils\oracle\ 文件夹下就可以。

 

 

启动server/client 参考:

http://www.adempiere.com/OSGI_HengSin

 

posted @ 2012-04-21 09:01 gdufo 阅读(2513) | 评论 (0)编辑 收藏

SQLServer跨服务器查询,添加Server Link

exec sp_addlinkedserver 'PA_EHR','','SQLOLEDB','10.110.8.41'
exec sp_addlinkedsrvlogin 'PA_EHR','false',null,'sa','123456'
exec sp_dropserver 'PA_EHR' 如果删除不了,去企业管理器中删除。

select * from PA_EHR.tongxehr.dbo.AdvQueryProject

posted @ 2012-04-05 10:15 gdufo| 编辑 收藏

Hibernate Tools Eclipse 插件安装

     摘要: Hibernate Tools 简介:    Hibernate Tools是由JBoss推出的一个Eclipse综合开发工具插件,该插件可以简化ORM框架Hibernate,以及JBoss Seam,EJB3等的开发工作。Hibernate Tools可以以Ant Task以及Eclipse插件的形式运行。 Mapping Editor(映射文件编辑器):...  阅读全文

posted @ 2012-03-18 13:23 gdufo 阅读(10593) | 评论 (0)编辑 收藏

Using Oracle Blocks Efficiently

 

1、DB的存储层次(在其他文章中已经介绍过了,这里只是简述)
1)blocks:是data file I/O的最小单位,也是空间分配的最小单位。一个Oracle block是由一个或多个连续的OS blocks组成。
2)extents:是由多个连续的data blocks组成的拥有存储空间分配的逻辑单位。一个或多个extents组成了一个segment。当在一个segment中的所有空间都被用完时,Oracle server会给segment分配新的extent。
3)segments:一个segment是一个extents的集合,存放了tablespace中具体的逻辑存储结构的所有数据。例如,每个 table,Oracle server会分配一个或多个extents用于组成该table的data segments。对于indexes,Oracle server分配一个或多个extents用于组成index segment。

2、extents的分配:为了尽可能降低动态分配extent的弊端,应该如下:
*  使用本地管理表空间的方法。
*  适当的评估segments的大小:确定object的最大size;创建object时,选择恰当的存储参数用于分配足够的空间给相应的data。
*  监控segments的动态extend的情况。
select owner, table_name, blocks, empty_blocks from dba_tables where empty_blocks/(blocks+empty_blocks)<.1;
alter table hr.employees allocate extent;
①创建本地管理extents的tablespace,其实自9i以来,系统默认的表空间都是本地管理的表空间。
create tablespace tsp_name datafile ‘/path/datafile.dbf’ size nM
    extent management local uniform size mM;
本地管理表空间在其datafile内部创建一个位图用于记录每个block的使用状态。当extent被分配或释放重用,bitmap的相应值会被修 改,用于显示其中blocks的新状态。这些修改不会产生rollback information,因为没有修改data dictionary。
②大extents的优点:DBA应该分配适当的size给segments和extents,一般原则是大extents优于小extents,主要表现在:
*  large extents在一定程度上降低了segments动态的分配extents的可能性
*  large extents可以稍微的提高I/O的性能,因为Oracle server从磁盘读取一个连续的large extent的多个blocks应该比从几个small extents不连续的blocks的速度快。为了避免分离的multiblock的读取,可以考虑将extents设置为 5*DB_FILE_MULTIBLOCK_READ_COUNT。但是对于不经常进行全表扫描的table,这种设置不会有太大的性能改观。
*  对于非常large的tables,OS在文件大小上的限制可能使DBA不得不将object分配到multiple extents。
*  使用index查找的性能不会受到index是否在一个或多个extents中的影响。
*  Extent maps存放了某个segment中所有extents的信息。如果MAXEXTENTS设置为UNLIMITED,这些maps可以存放在多个 blocks中,从性能角度讲,应该尽可能在一次I/O中读取该extent map。此外多个extents也会降低dictionary的性能,因为每个extent都会占用dictionary cache的少量空间。
附注:①在ASSM表空间中,每个segment的 segment header都有一个extent map,记录着segment所属的所有extents的第一个块的位置和区的大小,如果segment header中容纳不下所有的extents信息,oracle会另外添加专门的extents map块,保存segment中extents的位置大小信息。全表扫描时oracle会根据extents map中所记录的信息,扫描高水标记之下的所有extents的所有blocks.每个extents map block都有一个指向下一个extents map block的地址,segment header中的extents map信息也有指向第一个extents map block的地址.也就是说所有的extents map block构成了一个链表.全表扫描时就依据这个链表中所记录的block的位置信息进行扫描.extents map的主要作用是用于全表扫描.
②FLM段(Free List Managed Segment),其段头存放着段中Extent的信息,包括Extent的起始地址,Extent的长度。如果由于segment扩展过 多,segment header不能容下所有EXTENT的信息,则会用新的称之为EXTENT MAP BLOCK的块来专门存放EXTENT的信息。段头与各Extent Map Block之间用链表形式连接起来。它与ASSM中的extent map链表作用不同。
③large extents的缺点:因为需要更多连续的blocks,Oracle server可能很难找到足够的连接的空间用于对其的分配。

3、高水位线(High-Water Mark)
在空间分配中,有两类空闲blocks:曾经被占用过,但相应的数据被删除了,这些blocks将被记录到相应的free list中,当有insert操作时进程reuse,在high-water mark以下;另一类是自分配给相应的segment后,从来没有被使用过的,所以在high-water mark之上。
①high-water mark:被记录在segment header block中;在segment被创建时设置:当插入rows时,每次增加five-block;truncate tables会重置high-water mark,但delete不会。
②在table level,可以将high-water 玛瑞咖之上的空间收回:
alter table t_name deallocate unused …
全表扫描中,Oracle server会读取high-water mark以下的所有blocks,high-water mark以上的空闲blocks不会影响性能。
③在cluster中,空间是为所有的cluster keys分配的,无论其是否含有data。分配的空间依靠cluster在创建时参数size指定的大小和cluster的类型:
*  在hash cluster中,因为hash keys的数量在cluster被创建是已经被确定了,所以每个hash key所占用的空间都在high-water mark之下。
*  在index cluster中,空间被分配给每个cluster index。

4、table statistics
可以使用analyze语句或是dbms_stats对table的当前状况进行统计并保存在数据字典中,随后通过查看dba_tables获得相关信息。
eg:
analyze table t_name compute statistics;
select num_rows, blocks, empty_blocks as empty, avg_space, chain_cnt, avg_row_len from dba_tables where table_name=’T_NAME’;
其中dba_tables中不同的字段具体含义如下:
Num_Rows – Number of rows in the table
Blocks – Number of blocks below the high-water mark of the table
Empty_blocks – Number of blocks above the high-water mark of the table
Avg_space – Average free space in bytes in the blocks below the highwater mark
Avg_row_len – Average row length, including row overhead
Chain_cnt – Number of chained, or migrated, rows in the table
Avg_space_freelist_blocks – The average freespace of all blocks on a freelist
Num_freelist_blocks – The number of blocks on the freelist

5、DBMS_SPACE包:可用于获得segments中的space的状态信息,常用的有以下两个procedures:
*  UNUSED_SPACE:用于获得分配给object未使用的space。
*  FREE_BLOCKS:用于获得object的空闲的space。在运行时,必须提供相应的FREELIST_GROUP_ID,一般使用1,除非你使用的是Oracle Parallel server。
该DBMS_SPACE包是由dbmsutil.sql创建的。

6、恢复表空间:
1)对于在high-water mark以下的空间:
方法一:export the table;drop or truncate the table;import the table
  在选择是drop还是truncate的时候,要考虑:drop将table在data dictionary中的所有information删除,并且space被收回;而truncate没有,并保留了相应已经分配的space等待 reused;如果使用的是data dictionary管理tablespace,则影响空间收回与分配的时间开销的主要因素是extents的数量(而不是size);如果使用的是 drop方法,则考虑在import时使用compress选项,因为整个空间的分配可能不是在一个连续的大空间上。
方法二:alter table t_name move;此方法执行之后,所有相关的indexes都为unusable状态,必须rebuild。
2)对于在high-water mark之上的unused block可使用:alter table t_name deallocate unused语句进行收回。

7、DB的block size设置
1)减少访问block的数量,这是DB tuning的一个目标。DBA对此调节的方法主要有:增大block size;尽可能紧凑的将rows放在block中,避免row的迁移现象。
2)database block size是在DB创建时由参数DB_BLOCK_SIZE指定的,是I/O读取datafile的最小单元。当前有些OS允许block size达到64KB,可以查看相应的OS,从而调整DB的block size。block size一旦设置就不能改变,除非对DB重建或是duplicate,在9i中已经进行了相应的改进,可以使用多中block sizes,但是对于base data size仍不可变。DB的block size应该是OS的整数倍。如果application中有大量的全表扫描,可以考虑增大block size,但不要超过OS的I/O size。
3)小block size的优劣:
* 优:降低了block 的冲突;有利于small rows;有利于随机访问,因为可以在一定程度上提高buffer cache的利用率,特别是在内存资源不足的情况下。
* 劣:small blocks管理所用的空间开销大;每个block存放的row较少,也会加大I/O的开销;可能造成更多的index blocks被读入。
在OLTP环境中,经常存在large object的随机访问时,small blocks相对更好。
4)large block size的优劣:
* 优:所用的管理空间开销小,更多的空间可用于存放具体的data;有利于顺序的读取;有利于large rows;改善了index读取的性能,因为大的block可以降低index的level数量,从而减少I/O的次数。
* 劣:在OLTP环境中不利于index blocks,可能会引起index leaf blocks的争用冲突;如果存在大量随机访问可能会造成buffer cache的浪费。
在DSS环境中,连续读取大量数据操作较多,使用large block更好。

8、PCTREE和PCTUSED(具体内容在其他文章中介绍过了,这里不累述了)
只有两类DML语句可以影响free blocks和used blocks的数量:delete和update。
释放的空间在一个block中很可能不是连续的,Oracle server只在下面情况同时出现时进行free space的合并:insert或update操作试图向一个有足够空间的block中插入数据;free space存在碎片,以至于row piece无法被写入。
具体设置:
①PCTFREE:默认情况下是10;如果不存在update操作,可以使用0;PCTFREE = 100 * UPD / (Average row length)
②PCTUSED:默认是40;PCTUSED = 100 – PCTFREE – 100 * Rows * ( average row length) / block size
其中:
UPD = update操作平均增加的bytes数量。
average row length和rows都可以在analyze之后从dba_tables表中获得。
当对一个已经存在的表进行这两个参数的修改,不会有马上的影响,只是在后续的DML操作中才发生作用。

9、migration和chaining(具体原因也在其他的文章中介绍过了)
①migration和chaining对性能的影响:一方面,引起这两种现象的insert和update本身性能比较差;另一方面,在查询此类记录的操作会因为额外的I/O造成性能较差。
migration现象过的,主要是由于PCTFREE参数设置过低引起的,对此可以考虑增大该值。
②对两者的检测,主要是通过analyze相应的表,随后从dba_tables表中观察其chain_cnt字段。此外可以从v$sysstat视图或 是statspack report中的“instance activity stats for DB”获得“table fetch continued row”的值。
还可以收集每个表中发生了migration和chaining的具体的rows:首先执行utlchain.sql脚本创建chained_rows统计表,随后执行语句:
analyze table t_name list chained rows;
③消除migration rows:
*  export/import
*  alter table t_name move
*  执行迁移脚本,具体见Oracle 9i Performance Tuning SG的P398
• Find migrated rows using ANALYZE.
• Copy migrated rows to new table.
• Delete migrated rows from original table.
• Copy rows from new table to original table.
此方法执行时,必须注意与original table相关的外键约束,应将其disable。

10、索引的重组
在经常发生DML的table上,indexes往往是带来性能问题的原因。
在data blocks中,Oracle server会将delete row释放的空间重新分配给insert rows,但是对于index blocks,Oracle server的应用时连续的。即使一个index block中只有一个index,也要维护该block。如果删除了block中的所有index,该block才会被送入free list。因此,必要时需要进行index的rebuild。
①对index space的监控:
*  analyze index i_name validate structure;
*  select name, (del_lf_rows_len / lf_rows_len) * 100 as wastage from index_stats;
在index_stats视图中,各字段含义如下:
 • Lf_rows – Number of values currently in the index
• Lf_rows_len – Sum of all the length of values, in bytes
• Del_lf_rows – Number of values deleted from the index
• Del_lf_rows_len – Length of all deleted values
note:index_stats视图只保存最近一次analyze的结果,并且当前session只能看到当前session的分析结果。
*  alter index emp_name_ix rebuild;
*  alter index emp_name_ix coalesce;
如果如果已删除的index 记录超过20%,则应该选用rebuild。
rebuild会以原有的index作为基础,重建索引,可以重新指定STORAGE, TABLESPACE, INITRANS参数,同时可以用下面的参数加快重建的效率:
*  PARALLEL/NOPARALLEL(NOPARALLEL是默认值)
*  RECOVERABLE/UNRECOVERABLE ( RECOVERABLE是默认的):当使用unrecoverable时速度将更快,因为它不产生redo log,只在index创建是起作用,而不是设置参数,不记录到dictionary中。它使用隐含式的logging参数,意味着在index创建结束 后插入index项时,仍然会记录redo log。
*  LOGGING/NOLOGGING:如果设置为NOLOGGING,该参数表明在index运行使用期间,将不产生任何redo log。它将记录到dictionary中。可以用alter index 进行修改。
注意:unrecoverable和logging是不兼容的。
alter index rebuild要快于index的drop后re-create,因为它使用了full scan的方法。
②监控index的使用情况
* EXECUTE DBMS_STATS.GATHER_INDEX_STATS(‘SECHMA_NAME’, ‘T_NAME’);
* create index … compute statistics;
* alter index .. rebuild compute statistics;
③此外,还可以用下面的方法查看没有使用的index:
从9i开始,对index的使用情况可以被收集到视图v$object_usage中。辅助DBA删除未使用的index,提高性能:
* 打开监控:alter index i_name monitoring usage;
* 停止监控:alter index i_name nomonioring usage;
随后查看v$object_usage:select index_name, used from v$object_usage;
在v$object_usage中各个字段的意义:
• index_name – The index name
• table_name – The corresponding table
• monitoring – Indicates whether monitoring is “ON or OFF”
• used – Indicates (YES or NO) the index has been used during the monitoring time
• start_monitoring – Time at which monitoring began on index
• stop_monitoring – Time at which monitoring stopped on index

posted @ 2010-01-12 12:33 gdufo| 编辑 收藏

仅列出标题
共19页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last 

导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Hibernate

友情链接

搜索

最新评论

阅读排行榜

评论排行榜