整個表的記錄數在千萬級,我的陳述句是檢索某個建過索引的列,用in關鍵字,in括號里面有20個以上的值。
中間還使用了union all,很明顯,查詢是比較費時費資源的。
我用程式執行其他比較簡單但回傳的結果集也非常大的查詢很正常。
但是,一旦執行這個查詢,等待4-5秒鐘,在任務管理器中就顯示程式狀態為“未回應”。
而且程式也無法回應我的其他操作,這是為什么?
請各位大哥幫幫忙!謝謝了!
PS:我的視窗使用了ROW TO DISK 和RetrieveASNEEDED選項。
uj5u.com熱心網友回復:
in括號里面的結果放到臨時表,再關聯!uj5u.com熱心網友回復:
二樓xuam說的是一個好辦法,但我想了解是什么原因引起這種情況發生。我在PL/SQL developer中運行得很好!
uj5u.com熱心網友回復:
in里的值可以建臨時表,或(select 1 i from dual
union all
select 2 i from dual
union all
select 3 i from dual)a
uj5u.com熱心網友回復:
用存盤程序.uj5u.com熱心網友回復:
回三樓和四樓:如果我用會話級臨時表,那么,PB的會話是不是指connect和disconnect之間呢?
如果我在PB在呼叫存盤程序,并在程序中使用臨時表,會不會存盤程序成為另一個會話啊?
另外,如果查詢時間比較長,我分批次提交事物的話,程序中間的open cursor陳述句會不會導致程式掛起呢?
uj5u.com熱心網友回復:
不知道你這個結果集有多大,另外,也不知道你的資料視窗的復雜程度,服務器端還是客戶端造成的,不好判斷。服務器端,你可以試試樓上各位的方法。客戶端可以試試多執行緒,f1,看看SharedObjectRegister及相關函式。PB是單執行緒的,時間久了肯定會失去回應的。當然,如果客戶端是單核的處理器,無論你用什么,結果都一樣。uj5u.com熱心網友回復:
回六樓:我敢肯定不是服務器端引起的,因為,程式失去回應后,我進入oracle OEM,可以看到陳述句仍然在執行。
我去看看SharedObjectRegister及相關函式。看看能不能解決問題。非常感謝!
啟動另一個執行緒專門來查詢是比較好的,因為程式在運行期間仍然可以回應用戶其他操作。
uj5u.com熱心網友回復:
繼續回六樓:回傳的結果集不大,不會超過5萬,資料視窗是動態創建的,不復雜。
uj5u.com熱心網友回復:
查詢SQL優化,不要用in,表檢索欄位加索引datawindow中retrieverow加yield()
uj5u.com熱心網友回復:
yield()方法無法解決問題,我使用了SharedObjectRegister來創建一個執行緒,但問題是,在custom class中無法呼叫主執行緒中的任何物件,這樣我就無法對資料視窗發起retrieve命令。uj5u.com熱心網友回復:
一般的用法是,創建一個執行緒進行檢索或回圈填充等費時的操作,另外還需要一個中間物件,將這個新創建執行緒的結果回傳主執行緒。像你那樣讓主執行緒執行緒來進行retrieve,不知道是為什么?如果真的需要,那也是要通過中間物件來觸發主執行緒事件,而不能直接呼叫uj5u.com熱心網友回復:
sjlion,聽您說的,感覺可以做到,能不能給一些代碼看看。主要有兩個問題:1、怎么創建一個執行緒來進行檢索。
2、這個執行緒檢索到資料以后,怎么回傳給主執行緒。
我看了共享物件的相關做法,感覺主執行緒和創建執行緒之間的通信能力十分有限,而且創建執行緒無法呼叫可視化物件,如何來執行查詢和回傳結果給主執行緒呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/79269.html
標籤:數據庫相關
上一篇:pb動態連接資料庫
