重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
现在在一个Session连接里边就可以实现联合查询了,即解决了“in”的限制,又提升了查询的速度。
做网站、网站建设,成都做网站公司-创新互联公司已向成百上千企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。
在很多软件系统中 系统的性能很打程度上有数据库的性能决定 以前也曾经做过很多次关于性能方面的各种测试 特别是关于oracle的 我想到也应该记录下来一部分 为大家共享 事情发生在我们的系统从sqlserver移植到oracle 用户在一个查询的操作上等待的时间无法忍受了 我们关于这个查询的处理与原来的方式一下 难道sqlserver 同oracle有什么地方不一样么 让我们来看看oracle有什么地方有问题 或者是我们使用的有问题?业务问题大概可以这样描述 一个父表 一个子表 查询的结果是找到子表中没有使用父表id的记录 这种情况估计很多系统都会牵涉得到 让我们来举一个例子 表一 父表 parent 表二 子表 childen 父表存储父亲 子表存储孩子 然后通过pid和父表关联 查询需要的结果是找到尚未有孩子的父亲 我们来看一下查询语句的写法 select * from parent where id not in (select pid from childen)这种标准的写法在子表存在 万条的记录的时候 查询时间超过了 秒 远远大于原来的sql server服务器的一秒 我在解决的时候想到了一个方法 select * from parent where id in( select id from parent minus select pid from childen )正常理解下 这个语句应该更加费时 但是事实完全出乎意料 这条语句不仅仅在子表存在大量记录的情况下速度良好 在子表少量数据的情况下速度也非常的好 基本在 秒内完成 这个结果可以很明显的证明oracle 在子查询的内部处理的时候 使用 in 和 not in 的巨大区别 希望用到这种方式的用户注意 也期待有人解释其中的问题 附录 测试数据的语句 create parent tabledrop table parent;create table parent(id varchar( ) name varchar( ) primary key (id) ); create childen tabledrop table childen;create table childen(id varchar( ) pid varchar( ) name varchar( ) primary key (id) ); Create/Recreate primary unique and foreign key constraintsalter table CHILDENadd constraint fk_ foreign key (PID)references parent (ID); add test date for parent Created on by GUIPdeclare Local variables herei integer;begin Test statements herei := ;delete from parent;loopi := i + ;dbms_output put_line(i);insert into parent(id name) values(i name || i);if (i mod = ) thenmit;end if;exit when i ;end loop;mit;end; add test date for childen Created on by GUIPdeclare Local variables herei integer;j integer;begin Test statements herei := ;delete from childen ;loopj := ;loopi := i + ;j := j + ;insert into childen(id pid name) values(i j name || j);if (i mod = ) thenmit;end if;exit when j= ;end loop;exit when i = * ;end loop;mit;end; lishixinzhi/Article/program/Oracle/201311/17959
concat()是拼接函数,将两个字符串拼接在一起
select
concat(first_name,last_name)
from
employees
||
是字符串连接符,用与连接字符串
select
first_name||last_name
from
employees
两者很相似但也有不同的地方
||可以在字符串中间添加自定义的字符,而concat不行
如果你是要连接两个字段可以用concat()也可以用||
,用concat
可读性好
如果3个以上的连接字段就推荐||
可以根据你的需要来设置.
这样使用的:
for
xx
in
(select
语句)
这是隐式游标,这个结构中不能带参数,或者说普通的游标,隐式或显式的都不能带参数,使用参数游标或引用(动态)游标。
例如:
declare
cursor cur(C_value number) is select col_A,col_B from tableA where col_C=C_value
;
begin
for xx in cur loop
--处理
end loop;
end
扩展资料:
注意事项
使用for循环实现
declare
cursor
cur
is
select
*
from
tablename;
aw_row
tablename%rowtype;
begin
for
raw_row
in
cur
loop
dbms_output.put_line('test');
end
loop;
end;
for语句直接帮做了游标的打开关闭,以及判断工作,所以比较常用。
1、在对表结构进行约束的时候,一般建立的约束都是系统自定义的约束。
2、但是这种方式创建的约束,在查看约束定义的时候并不直观。而且它的约束命名也是根据系统定义的。
3、如果一个表中有多个约束,那就很难区分出来约束具体指定到哪个字段。特别是一张表存在两个同一约束的时候。
4、所以创建约束的时候建议使用constraint关键字来创建自定义约束。这样创建出来的约束通过查看的时候可以很清楚的看出约束作用在哪个字段上。
5、但通过constraint来自定义约束别名的时候要记住,constraint 约束别名;要跟在字段类型的后面,不能写在其它位置否则会报如下图的错误。
给你
copy一段:
项目中使用到了oracle中where
语句中的in条件查询语句。in(,,,,,,),括号内的数据个数比较多(此处是区域查询的情况),北京市下属有7000多个区、街道、社区。解决此问题有几个途径
1,编写一个方法将条件更换成
in(,,,,,,,)
or
in
(,,,,,,,,,)
or
in
(,,,,,,,,,,,,,,).......
保证每个in内部的数据个数不超过一千,就可以。问题是这么处理的时候执行效率比较低下。首先的查询出那么多的条件数值,然后在in
查询中有了那么的or
条件。。。
2,建立一个中间的temp表存在查询条件,在数据库内部进行直接查询
select
*
from
table_1
where
column_1
in
(
select
column_2
from
table_2_temp
)
ps:这种方式我没有使用。。。。。。。。。。
3,摒弃那种先查出查询条件,然后再把条件放在查询目标结果集的sql语句中,直接编写sql语句
select
*
from
table_1
,。。。。
where
column_1
in
(
select
column_2
from
table_2
,。。。。。。。。
)
达到业务效果的同时,提高了执行效率。
想想一个sql语句执行数分钟的时候是个什么效果。。。。。。。