❶ sql Server中,存儲過程執行速度比較慢,有優化的方案嗎
主要有兩種方法
1、優化SQL的邏輯,使得邏輯越簡單越好。
2、使用到的表結構要建索引
❷ oracle資料庫存儲過程執行慢時如何優化
在oracle中
不關是執行sql還是存儲過程,當你第一次執行的時候需要對相關語句進行相關許可權、對象等分析,這個過程會產生執行計劃,叫做硬解析,如果分析通過,之後將語句轉化成ascii等效數字碼,再通過hash演算法得到散列值,然後檢查庫緩存中是否存在同樣hash值的語句。
如果存在,就是軟解析.然後就執行語句得出結果.所以第一次執行的時候要是硬解析,速度較慢,而第二次已經以後多次執行的時候是軟解析,速度較快.大概就這樣
如果要詳細說
這東西幾個鍾頭都說不完的.
❸ 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));
這樣的話,每次都是兩個批量操作,而且不需要輸入參數,直接調用就可以,唯一需要多做的工作就是做臨時表。
❹ 單獨執行很快,為什麼在存儲過程裡面執行很慢
慢的原因是你在對List的循環中使用了List的get函數.
典型的"Shlemiel噴塗演算法",所以越跑越慢啊.
List里是一個鏈表,get方法會從頭一個個地數,越到後面,數的時間就越長.所以會慢..
你應該修改方式,用下面的方法進行循環:
for(Iterator it = list.iterator(); it.hasNext() ;){
Map map = (Map)it.next();
// ...
}
❺ mysql 存儲過程執行太慢怎麼優化
1.當我們請求mysql伺服器的時候,MySQL前端會有一個監聽,請求到了之後,伺服器得到相關的SQL語句,執行之前(虛線部分為執行),還會做許可權的判斷
2.通過許可權之後,SQL就到MySQL內部,他會在查詢緩存中,看該SQL有沒有執行過,如果有查詢過,則把緩存結果返回,說明在MySQL內部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啟的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因為查詢緩存要求SQL和參數都要一樣,所以這個命中率是非常低的(沒什麼卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對應的結果,那麼就到了解析器,解析器主要對SQL語法進行解析
4.解析結束後就變成一顆解析樹,這個解析樹其實在Hibernate裡面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因為在Hibernate裡面有HQL,它就是通過這個工具轉換成SQL的,我們編程語言之所以有很多規范、語法,其實就是為了便於這個解析器解析,這個學過編譯原理的應該知道.
5.得到解析樹之後,不能馬上執行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經過任何優化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什麼地方,如果有計算的東西,把計算的結果算出來等等...
6.預處理完畢之後,此時得到一棵比較規范的樹,這棵樹就是要拿去馬上做執行的樹,比起之前的那棵樹,這棵得到了一些優化
7.查詢優化器,是MySQL裡面最關鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎麼去執行?它是先執行username = toby還是password = 1?每一條SQL的執行順序查詢優化器就是根據MySQL對數據統計表的一些信息,比如索引,比如表一共有多少數據,MySQL都是有緩存起來的,在真正執行SQL之前,他會根據自己的這些數據,進行一個綜合的判定,判斷這一次在多種執行方式裡面,到底選哪一種執行方式,可能運行的最快.這一步是MySQL性能中,最關鍵的核心點,也是我們的優化原則.我們平時所講的優化SQL,其實說白了,就是想讓查詢優化器,按照我們的想法,幫我們選擇最優的執行方案,因為我們比MySQL更懂我們的數據.MySQL看數據,僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據這些信息選了一個它自認為最優的方案,但是這個方案可能和我們想像的不一樣.
8.這里的查詢執行計劃,也就是MySQL查詢中的執行計劃,比如要先執行username = toby還是password = 1
9.這個執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行這一份傳過來的計劃,到磁碟中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什麼?就是硬碟的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據這個時間的IO來確定的.那怎麼執行IO又是什麼來確定的?就是傳過來的這一份執行計劃.(優化就是制定一個我們認為最快的執行方案,最節省IO,和執行最快)
10.如果開了查詢緩存,則返回結果給客戶端,並且查詢緩存也放一份。