2010-06-29 36 views
4

我的同事最近一個提出,我不應該使用是「喜歡?」比LIKE '%' ||?|| '%' 更高效

LIKE '%' 評論||?|| '%'

而使用

什麼樣的?

在SQL中,然後替換LIKE?在執行SQL之前使用LIKE'%'||?||'%'。他指出,使用單個參數標記,DB2數據庫將始終緩存該語句,從而減少SQL準備時間。

但是,我不確定它是否準確。對我來說,它應該是另一種方式,因爲我們通過在每次執行查詢時對SQL執行字符串替換來進行更多處理。

有誰知道一個標記是否真的能加快執行速度?僅供參考 - 我使用Spring 2.5 JDBC框架,DB2版本爲9.2。

我的問題是 - DB2是否對待「LIKE?」就像緩存和準備一樣,與「LIKE'%'||?||'%'」不同。

+2

爲什麼不運行一些基準測試?這些數字取決於許多因素,這個特殊情況(可能或可能)甚至可能不會在總體上產生變化。 – 2010-06-29 16:10:54

+0

是否在Java Prepared Statement中指定/提供了通配符? – 2010-06-29 16:14:42

+1

我不確定我是否瞭解其中的差異。你是什​​麼意思「,然後在執行SQL之前用LIKE'%'||?||'%'替換LIKE?標記」?這不是最終相同的查詢? – Kobi 2010-06-29 16:14:54

回答

2

'LIKE?'是一個PreparedStatement。 Prepared語句是JDBC驅動程序級別的優化。思想是數據庫分析查詢來決定如何最有效地處理它們。然後數據庫可以緩存結果查詢計劃,並在完整的語句上鍵入。重複使用相同的語句會重用查詢計劃。所以基本上,如果您使用不同的比較字符串多次運行相同的查詢,並且查詢計劃保持緩存,那麼是的,使用'LIKE?'。會更快。

一些有用的(雖然有點過時),在PreparedStatements信息:

+0

不是LIKE'%'||?||'%'也是動態參數嗎?或者你不這麼認爲,因爲引號中的百分比? – CoolBeans 2010-06-29 16:50:36

+0

不,在這種情況下,這不是一個動態參數。你不需要使用帶參數的引號(這是他們幫助防止SQL注入問題的原因之一),你絕對不希望與意圖成爲佔位符的東西進行連接。 – Jeff 2010-06-29 17:01:36

1

我沒有做過太多的DB2,而不是自90年代以來,我不確定我是否理解你的根本問題是什麼。回過頭來,我接到了DBA團隊負責人的電話。 「你和我們的其他程序員有什麼不同?」提醒你,這是我職業生涯的早期階段,所以暫時我回答說:「沒事......」,想象它是一種嘶啞的聲音。 「那麼,爲什麼你的查詢需要其他人的50%的cpu資源?」。我對所有其他人進行了快速調查,發現我是唯一一個使用準備好的陳述。現在,在Spring的基礎上,Spring自動生成預處理語句,並且這些年來他們已經改進了數據庫中的語句緩存,但是如果使用得當,則可以在那裏獲得加速,並且會使語句緩存把東西換掉的次數少。這真的取決於你的用例,如果你只打一次查詢,那麼就沒有區別,如果它有幾千次,顯然它會產生更大的差異。

1

在SQL中,然後替換LIKE?在執行SQL之前使用LIKE'%'||?||'%'標記。他指出,使用單個參數標記,DB2數據庫將始終緩存該語句,從而減少SQL準備時間。

除非DB2是某種奇怪的外部SQL數據庫,或者如果它的驅動程序做了一些瘋狂的事情,那麼數據庫服務器將永遠不會看到你準備好的語句,直到你真正執行它。因此,您可以整天將PreparedStatement中的子句進行交換,並且只有在您執行它時將其發送到服務器纔會生效。

+0

我也這麼認爲。我自己對DB2不太瞭解 - 所以我把它作爲一個問題發佈,看看是否有DB2專家可以幫助我清除它。 – CoolBeans 2010-06-29 16:34:24

+0

當您創建PreparedStmt對象時,數據庫是否知道它,或者僅當您完成執行查詢時才知道它? – CoolBeans 2010-06-29 16:40:29

+0

我一直以爲後者。您可以通過設置構建PS的測試程序來進行非常簡單的測試,在執行PS之前等待10秒鐘,然後使用WireShark檢查機器和數據庫之間的流量。 – 2010-06-29 16:41:37

相關問題