使用游標會更好
左直拳有兩個表,乙個比較巨大,大約
1千萬條記錄(表
big),另乙個只有
5000
條(表**all
)。現在需要根據表
**all
來更新表
big。
update
big set bf1=0 where bigid in(
select bigid from **all where sf1>0)
但是這樣執行下來,速度非常慢,並且連線使用這台
db伺服器的程式也都慢了下來,幾近不可用。
分析這條
sql語句,使用了
in。據說
in是會分拆成乙個個
or表示式的,而
or語句將不會使用索引,所以有時候遇到
or,會用
union all
來代替。
當然在這裡用
union all
是不行的。
這樣我猜這條
sql語句,大概會用上全表搜尋,大表
1千萬條記錄,那麼至少比較
1千萬次,怎麼會不慢呢。
於是改用游標,先將小表的記錄提取出來,然後一條條的跟大表結合執行。
declare
curt cursor
forselect bigid from **all where sf1>0;
declare
@id int
;
open
curt;
fetch
next from curt into @id;
while
@@fetch_status
= 0
begin
update big set bf1=0 where bigid=@bigid;
fetch next from curt into @id;
end
close
curt;
deallocate
curt;
這樣游標裡的記錄數量充其量也只有
5000
條,bidid
在大表裡又有索引,分成
5000
次執行,雖然連線,編譯花了一點時間,但與恐怖的巨大表全表搜尋比較,實在算不了什麼。
事實證明,以上語句在大約
4分鐘執行完畢,期間使用此資料庫的應用程式不受影響,速度很快。
使用游標會更好
使用游標會更好 左直拳 有兩個表,乙個比較巨大,大約1千萬條記錄 表big 另乙個只有5000條 表small 現在需要根據表small來更新表big。update big set bf1 0 where bigid in select bigid from small where sf1 0 但是...
使用游標 引數游標
參游標是指帶有引數的游標。在定義了引數游標之後,當使用不同引數值多次開啟游標時,可以生成不同的結果集。定義引數游標的語法如下 cursor cursor name parameter name datetype is select statement 注意,當定義引數游標時,游標引數只能指定資料型別...
使用游標 游標FOR迴圈
游標for迴圈是在pl sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for迴圈時,oracle會隱含的開啟游標,提取游標資料並關閉游標。例子 顯示emp表所有雇員名及其工資 declare cursor emp cursor isselect ename,sal from emp...