2011-05-02 58 views
0

我在兩個表中有一個超過300萬行的postgresql數據庫。 有些東西會降低整體性能,所以我使用Ubuntu命令pg_top分析了一下。針對PostgreSQL的java.sql.Connection測試8.4.6

我發現總有這樣的查詢:

SELECT 1 FROM <tablename>; 

貌似從java.sql.Connection連接測試聲明,對不對?

當我在postgres命令中輸入相同的命令時,需要4秒!索引都在那裏,我檢查了。

問題: 如何更改Connection對象使用的測試語句?

非常感謝!

+0

您是直接連接每個JDBC到數據庫還是通過Hibernate(或類似的?) – 2011-05-02 07:41:00

+0

您正在使用連接池嗎?詳情請。 – MJB 2011-05-02 07:41:50

回答

0

根本原因已被發現: 我的代碼依賴的框架確實測試了表是否可用。 這是通過

SELECT 1 from TABLENAME; 

做到這實際上從該表中返回所有行和,因爲我有它的300萬行,還需要一段時間。

更好的方法(至少對於PostgreSQL)是這一個:

SELECT relname FROM pg_class WHERE relname = 'mytable'; 

感謝所有爲已發佈的評論!

請參閱source of the solution

+0

當然'select 1 from tablename'將返回所有行,因爲沒有WHERE子句。爲什麼你會期望它返回更少的行?順便說一句:有點可移植的SQL將是'SELECT table_name FROM information_schema.tables WHERE table_name ='mytable'' – 2011-05-02 10:05:18

2

您可能正在使用某種連接池,直接或間接地通過數據源或其他類似hibernate的框架。

簽入連接池的文檔並搜索術語「驗證查詢」。 Postgres的,你應該能夠設置一個查詢,如:

select version(); 

這應該是要快得多。

+0

我同意。 「連接」對象根本不做任何驗證。順便說一句:一個簡單的'SELECT 1'甚至可能(稍微)更快 – 2011-05-02 08:00:56