當前位置:首頁 » 服務存儲 » 程序調用存儲過程很慢
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

程序調用存儲過程很慢

發布時間: 2022-12-09 23:54:45

存儲過程比sql語句慢的問題,痛苦中.....

1首先存儲過程是預編譯,按理說應該會比程序運行的語句效率高,如果時間反而長的話,可能是統計信息沒有及時更新導致優化器給存儲過程與單語句生成了不同的查詢計劃,而用片面的統計信息生成的查詢計劃會導致索引利用率低效,試試更新統計信息或者重建/重組索引
2一次提交查詢6、7百次?這樣的系統我還未見過,如果可以的話,現將需要的表數據緩存到伺服器或者本地內存中,在內存中進行數據的操作,當然存儲過程對復雜的查詢會有一定的優化效果的

② c# 調用oracle存儲過程時快時慢 請各位路過的大俠幫忙解解

原因很多,可能是負荷問題,鎖表問題或者其他。。總之出現多次幾分鍾出不來的情況,你就先考慮優化它。。。
分步執行你的存儲過程,看看慢在哪個SQL上。。一般給報表寫存儲過程,要在第一步提取出最小范圍的數據放到臨時表,之後全部的處理過程都對該臨時表操作,不再涉及任何實表,先看看這一點你做到了沒有。。
如果做到了,問題基本就是在第一步提取數據的時候慢,那就專門對那個SQL看看有沒有走索引,需要的情況下拆分SQL,分步提取數據

③ oracle存儲過程執行速度很慢是什麼原因

解決辦法:你需要對你的表根據查詢條件設計相應的索引,有時候根據需要可能一個表你需要建立好幾個索引都是有可能的。然後再執行,你會發現原來要30幾秒的現在零點幾秒就可以搞定了,這跟使用游標沒什麼關系。游標的使用完全由你的應用需要決定,我相信能不用的你肯定不會選擇使用游標處理,一般是實在沒辦法的情況下才選擇游標去做。 你查詢慢的原因是你在存儲過程中執行的話,沒有索引時,他會一條一條查知道把80幾萬條數據全部掃描一遍直到查完了你才看到一個結果,但是你在外面單獨執行很快的原因是plsql他會首先去查查到幾條數據就先給你返回來,所以你馬上就看到結果了,但實際上查詢也並沒有結束,你要是數據很多的情況下你往下拉,你會發信很慢,其實查詢過程根本就還沒有結束。 總之寫存儲過程第一步是會寫,第二步是要做好優化,否則當你的數據量很大的時候你的過程寫的不好的話問題會馬上暴露出來

④ 同樣一個存儲過程,為什麼第一次快,第二次就很慢

sql是高級語言,資料庫系統執行sql之前要將sql語句進行解析(相當於編譯),這個過程叫硬解析;資料庫系統每次執行sql之前都會檢查共享池中是不是存在已經解析過的語句,如果有就拿來直接用,這叫軟結息。軟解析比硬解析效率高,這是影響因素之一;
二、第一次執行可能沒有走索引,第二次執行使用第一次執行的執行計劃
三、看你的存儲過程做了些什麼,有可能第一次把活幹完了,導致第二次執行沒什麼活干
以上回答基於oracle體系結構

⑤ 單獨執行很快,為什麼在存儲過程裡面執行很慢

慢的原因是你在對List的循環中使用了List的get函數.
典型的"Shlemiel噴塗演算法",所以越跑越慢啊.
List里是一個鏈表,get方法會從頭一個個地數,越到後面,數的時間就越長.所以會慢..
你應該修改方式,用下面的方法進行循環:
for(Iterator it = list.iterator(); it.hasNext() ;){
Map map = (Map)it.next();
// ...
}

⑥ 三菱plc讀取程序為何勾選了軟元件存儲器很慢

三菱plc讀取程序勾選了軟元件存儲器很慢的原因為內存過大。PLC程序由指令和軟元件組成,指令的功能是發出命令,軟元件是指令的執行對象。

⑦ 為什麼存儲過程比直接執行sql語句要慢很多

因為存儲過程只需要編譯一次
之後運行這個存儲過程就不需要在編譯了
但是SQL語句每次都要編譯
在程序里
使用存儲過程
可以減少網路傳輸量

⑧ SQL2000的資料庫附加到SQL2005後,前台程序調用存儲過程速度非常慢

2000和2005有些地方兼容性不是很好,除非是簡單的信息,一般直接升級都會有問題,需要查到問題點,手動解決,不能期望他自己解決。

⑨ JDBC執行存儲過程異常慢

1.connection不知道你是採用什麼方式獲取的,如果不是從連接池裡取,你每connection.close()一次,下次get的時候會重新建立實際物理鏈接,這樣會相當耗時。所以你檢查一下是在獲取connection時耗的時間多,還是在execute的時間多。代碼:
long startTime = System.currentTimeMillis();
conn = getConnection(); // execute();
long endTime = System.currentTimeMillis();
System.out.println("獲取鏈接的時間:" + (endTime - startTime));
執行的類似;

2.從你的存儲過程的邏輯來說,要條件查詢,更新某個欄位的值,和入庫,這三個步驟應該有輸入參數的,那麼你的這個參數是怎麼傳入的?
個人覺得你的這個存儲過程可以優化成SQL來執行,效率應該會更好:
首先,你把輸入參數放入一個臨時表;
比如結構是:
_id _field
查詢的條件 更新的欄位

// 更新_table中存在的記錄的_field欄位,並且只更新_table與_tmp鍵值相等的記錄
UPDATE _table t SET _field=(SELECT MAX(_field) FROM _tmp WHERE _id=t._id) WHERE EXISTS (SELECT 'X' FROM _tmp WHERE _id=t._id);

// 選擇_table與_tmp鍵值不相等的記錄(即_table中不存在的記錄)插入_table
INSERT INTO _table (_id,_field) (SELECT _id,_field FROM _tmp t WHERE NOT EXISTS (SELECT 'X' FROM _table WHERE _id=t._id));

這樣的話,每次都是兩個批量操作,而且不需要輸入參數,直接調用就可以,唯一需要多做的工作就是做臨時表。