使用游標會更好

2021-08-22 15:40:14 字數 984 閱讀 8717

使用游標會更好

左直拳

有兩個表,乙個比較巨大,大約1千萬條記錄(表big),另乙個只有5000條(表small)。

現在需要根據表small來更新表big。

update

big set bf1=0 where bigid in(

select bigid from small where sf1>0)

但是這樣執行下來,速度非常慢,並且連線使用這台db伺服器的程式也都慢了下來,幾近不可用。

分析這條sql語句,使用了in。據說in是會分拆成乙個個or表示式的,而or語句將不會使用索引,所以有時候遇到or,會用union all來代替。

當然在這裡用union all是不行的。

這樣我猜這條sql語句,大概會用上全表搜尋,大表1千萬條記錄,那麼至少比較1千萬次,怎麼會不慢呢。

於是改用游標,先將小表的記錄提取出來,然後一條條的跟大表結合執行。

declare

curt cursor

forselect bigid from small where sf1>0;

declare

@id int

;open

curt;

fetch

next from curt into @id;

while

@@fetch_status

= 0begin

update big set bf1=0 where bigid=@bigid;

fetch next from curt into @id;

endclose

curt;

deallocate

curt;

這樣游標裡的記錄數量充其量也只有5000條,bidid在大表裡又有索引,分成5000次執行,雖然連線,編譯花了一點時間,但與恐怖的巨大表全表搜尋比較,實在算不了什麼。

事實證明,以上語句在大約4分鐘執行完畢,期間使用此資料庫的應用程式不受影響,速度很快。

使用游標會更好

使用游標會更好 左直拳有兩個表,乙個比較巨大,大約 1千萬條記錄 表 big 另乙個只有 5000 條 表 all 現在需要根據表 all 來更新表 big。update big set bf1 0 where bigid in select bigid from all 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...