2010-08-28 44 views
6

我正在編寫一個軟件,它需要我準備語句並設置值,執行查詢並在循環中獲取結果。這個循環可能有超過7,000個週期。如果我使用簡單的語句而不是預先準備好的語句,執行速度是否會發生很大變化準備好的語句顯着減慢程序嗎?

這裏是僞代碼

  1. 從某處
  2. 迭代準備的語句
  3. 獲取列表通過列表
  4. 得到預處理語句,並做一些數據庫查詢和關閉新的資源,如結果集。
  5. 填充使用的結果和值從初始列表

由於地圖。

+4

預處理語句通常是* *速度比普通的查詢,如果你重複運行相同的查詢。 – Amber 2010-08-28 07:59:57

+3

性能不錯,但PreparedStatements的真正勝利是參數綁定可以通過API完成,而不是通過字符串連接完成。這對日期類型特別有用。還可以防止SQL注入攻擊。 – 2010-08-28 08:15:04

+0

@amber,有一個準備開銷,可能需要一段時間才能在準備好的報表在牆上時間更快之前回購。 – 2010-08-28 08:39:26

回答

8

預處理語句是快於非預處理語句,如果你重複使用相同的語句,多組數據。我不知道這是不正確的情況。

一旦你準備的聲明,其送往然後只有在每次調用時接受數據的DB服務器 - 它不會在每次綁定新數據時重新處理的語句。

所以簡單的答案是:

不,他們不。

+2

其實,如果你只執行一次或兩次語句,準備好的語句的設置時間可能會超過執行過程中的增益:) – extraneon 2010-08-28 08:12:38

+0

我的意思是在他的情況下。他提出的方案是「迭代列表」。我的回答不清楚。爲了清晰起見,編輯了我的原始帖子 – Erik 2010-08-28 08:28:50

4

只是彈出一些東西:確保你沒有在你的循環中創建準備好的語句。涉及到一些開銷,但是在第三次查詢之後還是會自己支付的。實際上,對於大型參數列表,單個查詢甚至可能會更快。

一些東西,確實加快東西相當是運行在一個單一的所有查詢(或幾個大的)交易。如果它是大數據集,則可能每個事務有1000個查詢或類似的東西。 (當然,你的領域模型的語義必須允許這個,但以我的經驗來說,幾乎總是如此)。

查詢的數量,你可以在一個單一的交易成一團有點取決於數據庫所以一些實驗和閱讀也許需要。

1

你也可以考慮每條語句檢索多個值:

SELECT id, value FROM table WHERE id IN (?, ?, ?, ?, ?, ?)

這將是比個人的查詢速度更快。

+0

這正是我所做的。 – mwangi 2010-09-17 08:16:59

+0

我的觀點是你可以遍歷每個數據庫調用10個左右項目的列表。 – 2010-09-18 02:49:02