仓酷云

标题: MYSQL网页编程之Oracle 的 in 和 not in DD功能理论 [打印本页]

作者: 再见西城    时间: 2015-1-16 22:31
标题: MYSQL网页编程之Oracle 的 in 和 not in DD功能理论
一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。oracle|功能
Oracle的in和notinDD功能理论



在良多软件体系中,体系的功能很打水平上无数据库的功能决意。之前也已经做过良多次关于功能方面的各类测试,出格是关于oracle的,我想到也应当纪录上去一部分,为人人共享。

事变产生在我们的体系从sqlserver移植到oracle,用户在一个查询的操纵上守候的工夫没法忍耐了,我们关于这个查询的处置与本来的体例一下,岂非sqlserver同oracle有甚么中央纷歧样么,让我们来看看oracle有甚么中央有成绩,大概是我们利用的有成绩?

营业成绩也许能够如许形貌,一个父表,一个子表,查询的了局是找到子表中没有利用父表id的纪录,这类情形估量良多体系城市扳连失掉。让我们来举一个例子:



表一:父表parent

编号

字段

范例

申明

1.

Id

Varchar2(10)

主键

2.

Name

Varchar2(100)

称号



表二:子表childen

编号

字段

范例

申明

1.

Id

Varchar2(10)

主键

2.

Pid

Varchar2(10)

主表的暗示

3.

Name

Varchar2(100)

称号



父表存储父亲,子表存储孩子,然后经由过程pid和父表联系关系,查询必要的了局是找到还没有有孩子的父亲。



我们来看一下查询语句的写法:

select*fromparentwhereidnotin(selectpidfromchilden)



这类尺度的写法在子表存在50万条的纪录的时分,查询工夫凌驾了10秒,远宏大于本来的sqlserver服务器的一秒。我在办理的时分想到了一个办法:

select*fromparentwhereidin

(selectidfromparentminusselectpidfromchilden)

一般了解下,这个语句应当加倍费时,可是现实完整出人意料,这条语句不单单在子表存在大批纪录的情形下速率优秀,在子表大批数据的情形下速率也十分的好,基础在1秒内完成。

这个了局能够很分明的证实oracle在子查询的外部处置的时分,利用in和notin的伟大区分,但愿用到这类体例的用户注重,也等候有人注释个中的成绩。





附录:测试数据的语句



--createparenttable
droptableparent;
createtableparent(idvarchar(10),namevarchar(100),primarykey(id));


--createchildentable
droptablechilden;
createtablechilden(idvarchar(10),pidvarchar(10),namevarchar(100),primarykey(id));
--Create/Recreateprimary,uniqueandforeignkeyconstraints
altertableCHILDEN
addconstraintfk_123foreignkey(PID)
referencesparent(ID);

--addtestdateforparent
--Createdon2004-11-29byGUIP
declare
--Localvariableshere
iinteger;
begin
--Teststatementshere
i:=0;
deletefromparent;
loop
i:=i+1;
dbms_output.put_line(i);
insertintoparent(id,name)values(i,name||i);
if(imod100=0)then
commit;
endif;
exitwheni>1000;
endloop;
commit;
end;

--addtestdateforchilden
--Createdon2004-11-29byGUIP
declare
--Localvariableshere
iinteger;
jinteger;
begin
--Teststatementshere
i:=0;
deletefromchilden;
loop
j:=0;
loop
i:=i+1;
j:=j+1;
insertintochilden(id,pid,name)values(i,j,name||j);
if(imod100=0)then
commit;
endif;
exitwhenj>=50;
endloop;

exitwheni>=10000*50;
endloop;
commit;
end;


无疑希望员工得到系统、有深度的培训,显然MySQL在这一点上还做得很不够。
作者: 简单生活    时间: 2015-1-19 16:10
只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
作者: 飘灵儿    时间: 2015-1-27 19:07
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
作者: 冷月葬花魂    时间: 2015-2-5 11:09
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
作者: 仓酷云    时间: 2015-2-11 11:21
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
作者: 分手快乐    时间: 2015-3-2 11:50
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
作者: 海妖    时间: 2015-3-11 03:36
大侠们有推荐的书籍和学习方法写下吧。
作者: 第二个灵魂    时间: 2015-3-17 20:08
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 金色的骷髅    时间: 2015-3-24 23:35
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2