現(xiàn)在在一個(gè)Session連接里邊就可以實(shí)現(xiàn)聯(lián)合查詢了,即解決了“in”的限制,又提升了查詢的速度。
做網(wǎng)站、網(wǎng)站建設(shè),成都做網(wǎng)站公司-創(chuàng)新互聯(lián)公司已向成百上千企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。
在很多軟件系統(tǒng)中 系統(tǒng)的性能很打程度上有數(shù)據(jù)庫的性能決定 以前也曾經(jīng)做過很多次關(guān)于性能方面的各種測試 特別是關(guān)于oracle的 我想到也應(yīng)該記錄下來一部分 為大家共享 事情發(fā)生在我們的系統(tǒng)從sqlserver移植到oracle 用戶在一個(gè)查詢的操作上等待的時(shí)間無法忍受了 我們關(guān)于這個(gè)查詢的處理與原來的方式一下 難道sqlserver 同oracle有什么地方不一樣么 讓我們來看看oracle有什么地方有問題 或者是我們使用的有問題?業(yè)務(wù)問題大概可以這樣描述 一個(gè)父表 一個(gè)子表 查詢的結(jié)果是找到子表中沒有使用父表id的記錄 這種情況估計(jì)很多系統(tǒng)都會(huì)牽涉得到 讓我們來舉一個(gè)例子 表一 父表 parent 表二 子表 childen 父表存儲(chǔ)父親 子表存儲(chǔ)孩子 然后通過pid和父表關(guān)聯(lián) 查詢需要的結(jié)果是找到尚未有孩子的父親 我們來看一下查詢語句的寫法 select * from parent where id not in (select pid from childen)這種標(biāo)準(zhǔn)的寫法在子表存在 萬條的記錄的時(shí)候 查詢時(shí)間超過了 秒 遠(yuǎn)遠(yuǎn)大于原來的sql server服務(wù)器的一秒 我在解決的時(shí)候想到了一個(gè)方法 select * from parent where id in( select id from parent minus select pid from childen )正常理解下 這個(gè)語句應(yīng)該更加費(fèi)時(shí) 但是事實(shí)完全出乎意料 這條語句不僅僅在子表存在大量記錄的情況下速度良好 在子表少量數(shù)據(jù)的情況下速度也非常的好 基本在 秒內(nèi)完成 這個(gè)結(jié)果可以很明顯的證明oracle 在子查詢的內(nèi)部處理的時(shí)候 使用 in 和 not in 的巨大區(qū)別 希望用到這種方式的用戶注意 也期待有人解釋其中的問題 附錄 測試數(shù)據(jù)的語句 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()是拼接函數(shù),將兩個(gè)字符串拼接在一起
select
concat(first_name,last_name)
from
employees
||
是字符串連接符,用與連接字符串
select
first_name||last_name
from
employees
兩者很相似但也有不同的地方
||可以在字符串中間添加自定義的字符,而concat不行
如果你是要連接兩個(gè)字段可以用concat()也可以用||
,用concat
可讀性好
如果3個(gè)以上的連接字段就推薦||
可以根據(jù)你的需要來設(shè)置.
這樣使用的:
for
xx
in
(select
語句)
這是隱式游標(biāo),這個(gè)結(jié)構(gòu)中不能帶參數(shù),或者說普通的游標(biāo),隱式或顯式的都不能帶參數(shù),使用參數(shù)游標(biāo)或引用(動(dòng)態(tài))游標(biāo)。
例如:
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
擴(kuò)展資料:
注意事項(xiàng)
使用for循環(huán)實(shí)現(xiàn)
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語句直接幫做了游標(biāo)的打開關(guān)閉,以及判斷工作,所以比較常用。
1、在對表結(jié)構(gòu)進(jìn)行約束的時(shí)候,一般建立的約束都是系統(tǒng)自定義的約束。
2、但是這種方式創(chuàng)建的約束,在查看約束定義的時(shí)候并不直觀。而且它的約束命名也是根據(jù)系統(tǒng)定義的。
3、如果一個(gè)表中有多個(gè)約束,那就很難區(qū)分出來約束具體指定到哪個(gè)字段。特別是一張表存在兩個(gè)同一約束的時(shí)候。
4、所以創(chuàng)建約束的時(shí)候建議使用constraint關(guān)鍵字來創(chuàng)建自定義約束。這樣創(chuàng)建出來的約束通過查看的時(shí)候可以很清楚的看出約束作用在哪個(gè)字段上。
5、但通過constraint來自定義約束別名的時(shí)候要記住,constraint?約束別名;要跟在字段類型的后面,不能寫在其它位置否則會(huì)報(bào)如下圖的錯(cuò)誤。
給你
copy一段:
項(xiàng)目中使用到了oracle中where
語句中的in條件查詢語句。in(,,,,,,),括號(hào)內(nèi)的數(shù)據(jù)個(gè)數(shù)比較多(此處是區(qū)域查詢的情況),北京市下屬有7000多個(gè)區(qū)、街道、社區(qū)。解決此問題有幾個(gè)途徑
1,編寫一個(gè)方法將條件更換成
in(,,,,,,,)
or
in
(,,,,,,,,,)
or
in
(,,,,,,,,,,,,,,).......
保證每個(gè)in內(nèi)部的數(shù)據(jù)個(gè)數(shù)不超過一千,就可以。問題是這么處理的時(shí)候執(zhí)行效率比較低下。首先的查詢出那么多的條件數(shù)值,然后在in
查詢中有了那么的or
條件。。。
2,建立一個(gè)中間的temp表存在查詢條件,在數(shù)據(jù)庫內(nèi)部進(jìn)行直接查詢
select
*
from
table_1
where
column_1
in
(
select
column_2
from
table_2_temp
)
ps:這種方式我沒有使用。。。。。。。。。。
3,摒棄那種先查出查詢條件,然后再把條件放在查詢目標(biāo)結(jié)果集的sql語句中,直接編寫sql語句
select
*
from
table_1
,。。。。
where
column_1
in
(
select
column_2
from
table_2
,。。。。。。。。
)
達(dá)到業(yè)務(wù)效果的同時(shí),提高了執(zhí)行效率。
想想一個(gè)sql語句執(zhí)行數(shù)分鐘的時(shí)候是個(gè)什么效果。。。。。。。