使用游標會更好
左直拳
有兩個表,乙個比較巨大,大約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...