oracle中实现递归查询的SQL(connect by prior)
前段时间做了一个虚拟组织的创建。这个虚拟组织的创建是从现有的组织中读取数据然后进行分析保存到虚拟组织表中。保存之后写日志方便同步到其它系统中。公司使用的主要技术是SSH。由于是新人没有什么经验,加之时间比较紧迫,最后使用一般的逻辑思想通过递归在hibernate下顺利创建了。可是从现有的组织中读取10多万条的记录,然后逐条分析,保存,在写日志记录,在为每个应用写下发队列结果性能非常低。我们的系统中的数据要下发到300多个应用系统,也就是说读取10多万条记录就要分析十多万次,然后逐条写3000多万条记录,效率可想而知了。后来使用多线程来实行同步,可是保存的过程依然用十几分钟。这个过程是不能让人接受的。
之后优化性能的工作转到了我导师的手中。我导师的职位是系统架构师,年近四十,可以说是java元老级人物了。两天之后果然传出振奋人心的消息。保存工作从原来的耗时10多分钟变成了半分钟。真是大喜啊!
今早来上班,第一件事就是看看是什么实现的。第一就是不使用公司封装好的数据库连接,不适用HQL而是sql批量保存。这个当然能提高很大的性能了。也佩服导师之花了两天的时间把我十天的写出来的逻辑重新整理了一遍,真是不简单啊!最后看到一条SQL如下:select * from um_org_organization_info start with ouguid=? connect by prior ouguid=parentouguid。开始觉得很疑惑,以我之前所学习的SQ知识,不曾看见过start with ...connect by prior,疑惑之际上网看看。得知“Start with...Connect By prior 子句递归查询一般用于一个表维护树形结构的应用" 。终于大悟了。高手就是不一样,经验多见识广啊。今天又学了新知识了。嘿嘿!
相关文档:
² Oracle9i的安装,请参照官方的安装说明。
² Oracle9i安装成功以后,使用管理员(用户名:sys、密码:sys)的身份登录进去,创建一个用户ddymis,密码:ddymis,角色默认赋予dba。
² ......
在我们的日常编程中,数据库的程序基本上都要与SQL语句打交道,SQL语句的编写不可避免的成为一个头疼的工作。且因为SQL语句是STRING类型,因此在编译阶段查不出错,只有到运行时才能发现错误。
本文的解决方案,通过自动生成SQL语句,在一定程度上降低出错的概率,从而提高编程效率。 public int ......
========第一篇=========
在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句:
select data_guid from adam_entity_datas a where a.rowid > (select min(b.rowid) from adam_entity_datas b where b.data_guid = a.data_guid)
如果表中有大量数据,但是重复数据比较少,那么 ......
sql server分布式事务解决方案
适用环境
操作系统:windows 2003
数据库:sql server 2000/sql server 2005
使用链接服务器进行远程数据库访问的情况
一、 问题现象
在执行分布式事务时,在sql server 2005下收到如下错误:
消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行
无法执行该操作,因为链接服务 ......
将b表中caller列的值插入a表中call列中。
create table a
(
fid int,
call varchar(20),
age int
)
create table b
(
fid int,
caller varchar(20),
parentId int
)
select * from a
select * from b
insert into a values(1,null,19)
insert into a values(2,n ......