簡體   English   中英

PreparedStatement非常慢,但是手動查詢很快

[英]PreparedStatement very slow, but manual query quick

我有一個如下的框架的preparedstatement:

SELECT OH.ORDER_ID, MAX(OS.STATUS_DATETIME) FROM public.ORDER_HEADER OH, public.ORDER_STATUS OS WHERE ((OH.ORDER_ID = OS.ORDER_ID AND OH.STATUS_ID = ? AND OS.STATUS_ID = ?)) GROUP BY OH.ORDER_
ID HAVING (MAX(OS.STATUS_DATETIME) <= ?) ORDER BY OH.ORDER_ID ASC

OrderHeader有30萬行,OrderStatus大約有5-6百萬。 所有查詢的字段都有索引。 數據庫是Postgres 9.1

SELECT OH.ORDER_ID, MAX(OS.STATUS_DATETIME) FROM ORDER_HEADER OH INNER JOIN ORDER_STATUS OS 
    ON ((OH.ORDER_ID = OS.ORDER_ID AND OH.STATUS_ID = 'ORDER_PARTIALLY_RECEIVED' AND OS.STATUS_ID = 'ORDER_PARTIALLY_RECEIVED'))
     GROUP BY OH.ORDER_ID HAVING (MAX(OS.STATUS_DATETIME) <= '2015-01-27 00:00:00') ORDER BY OH.ORDER_ID ASC

替換參數時,這是查詢字符串。

從Java運行查詢(作為PreparedStatement和其中設置的參數)使查詢運行幾分鍾(5-6分鍾)。 當我手動運行SQL時,需要10秒鍾。 這怎么可能,我該怎么解釋?

在不了解實際參數的情況下優化了准備好的語句。 在PostgreSQL 9.1中,僅針對大多數常用值對准備好的語句進行了優化。 當准備好的語句很慢時,則必須使用動態SQL。 PostgreSQL有很好的API-參數查詢-它介於預准備語句和常規查詢之間-可以安全地防止SQL注入,並且可以避免盲目優化的問題。

如果結果集很大-PreparedStatement的工作速度可能會變慢,因為默認的“ fetchSize”僅為10。請嘗試為此查詢設置更大的fetchSize。 此處的更多信息: http : //docs.oracle.com/cd/A97335_02/apps.102/a83724/resltse5.htm
特別適合Postgres: https//jdbc.postgresql.org/documentation/head/query.html

如果使用prepareStatements,則必須標識參數類型。 您可以解釋sql。 例如,uid類型為整數, explain analyse select * from users where uid in (200,500,800); PREPARE fooplan (int, int, int) AS select * from users where uid in ($1, $2, $3); explain analyse EXECUTE fooplan(200, 500, 800); PREPARE fooplan1 (numeric, numeric, numeric) AS select * from users where uid in ($1, $2, $3); explain analyse EXECUTE fooplan1(200, 500, 800); explain analyse select * from users where uid in (200,500,800); PREPARE fooplan (int, int, int) AS select * from users where uid in ($1, $2, $3); explain analyse EXECUTE fooplan(200, 500, 800); PREPARE fooplan1 (numeric, numeric, numeric) AS select * from users where uid in ($1, $2, $3); explain analyse EXECUTE fooplan1(200, 500, 800); 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM