2013-04-23 33 views
1

我們的應用程序中使用SimpleJdbcTemplate的Oracle SQL查詢永遠不會(幾乎)出現。查詢非常長,連接近15個表格,選擇大約100個字段等等。Oracle SQL Query在JdbcTemplate和SimpleJdbcTemplate中花費太長時間

該查詢將近8500個字符,使用MapSqlParameterSource實例向其添加6個綁定變量)。我已經在Row Mapper方法調用中放置了足夠的日誌消息,儘管這些消息從不被打印。

在SQL * Plus & SQL Developer中,用實際值替換綁定變量後的相同SQL查詢會在5-7秒內產生結果。因爲我使用邏輯在SQL查詢本身中實現分頁支持,結果只有15條記錄。

我試過JDBCTemplate & SimpleJdbcTemplate。 任何想法可能會出錯?

更新::

我能夠縮小問題的範圍。我的查詢包含一個同義詞作爲LEFT OUTER JOIN(引用不同的模式表)正在減慢整個查詢。當我將這個連接與綁定變量一起使用時,發生了這種情況。當我在SQL Developer & SQL * Plus中硬編碼綁定變量的值時,查詢運行正常。但是當我使用綁定變量時,這些工具中也發生了同樣的情況(掛起情況)。

目前,我指的是下面的鏈接繼續糾正我的DBLINK /同義詞使用, Getting a ResultSet/RefCursor over a database link

感謝,

回答

1

如果您有兩種不同的連接方法之間的不同性能,確保他們不改變會話優化器設置。

也許你的jdbc代碼以某種方式指定了optmizer模式,因此當你通過sqlplus進行連接時是不同的形式。

alter session set OPTIMIZER_MODE = RULE; 
alter session set OPTIMIZER_MODE = choose; 

我在我們的環境中也有這樣的問題,所以我確保所有連接都使用相同的優化設置。

+0

創建連接時沒有具體的JDBC配置參數。我使用DriverManager.createConnection調用完成了使用簡單JDBC連接(不帶DataSource/Spring)測試相同的SQL。同樣的行爲也針對此連接重複。我在同一連接中嘗試了兩種優化器模式,並重復執行了SQL語句。但沒有運氣! – 2013-04-23 09:36:37

+0

如果您有權限,可以運行「從v $參數中選擇值,其中name ='optimizer_mode';」看看你的兩個會話是否有相同的設置。如果您沒有權限,則仍然可以使用alter語句在sql開發者中手動設置優化器模式。如果查詢以選定模式快速運行,則在JDBC連接中使用相同的alter語句,並查看它是否仍然執行緩慢。 – Devolus 2013-04-23 10:17:31

+0

您也可以嘗試在聲明中使用提示。也許oracle爲這些語句使用不同的執行計劃。 – Devolus 2013-04-23 10:23:52