使用游標會更好

2021-04-16 20:54:57 字數 1225 閱讀 7469

使用游標會更好

左直拳有兩個表,乙個比較巨大,大約

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...