仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 698|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页编程之Oracle 的 in 和 not in DD功能理论

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:31:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。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:12 来自手机 | 只看该作者
只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-27 19:07:08 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-5 11:09:22 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
5#
发表于 2015-2-11 11:21:47 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
分手快乐 该用户已被删除
6#
发表于 2015-3-2 11:50:56 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
海妖 该用户已被删除
7#
发表于 2015-3-11 03:36:25 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
第二个灵魂 该用户已被删除
8#
发表于 2015-3-17 20:08:23 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
金色的骷髅 该用户已被删除
9#
发表于 2015-3-24 23:35:33 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-4 01:53

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表