2016-11-08 102 views
1

我們有一個Sybase數據庫,我們用一個非常簡單的查詢來查詢。Sybase/hibernate數據庫性能

Select * from ts_logs where time_sheet_id = 1234 

表有大約110萬條記錄,並直到4天前就已經進行大約半秒鐘一個非常快速的查詢。

我們的應用程序使用hibernate和sql輸出顯示完全相同的查詢。截至三天前,我們注意到性能下降了很多,查詢現在需要9到11秒才能執行。

我們嘗試在NetBeans數據庫可視化工具中運行查詢,發現相同的性能問題。我們最初開始確定這是一個數據庫性能問題,並決定在dbvisualizer中進一步診斷問題,但令我們意外的是dbvisualizer在不到半秒的時間內執行了同樣的確切查詢。

我們在每個環境中都使用jtds 1.3。

在所有環境中都有相同的數據庫。

在所有環境中都有相同的查詢。

什麼可能導致在hibernate/netbeans中的性能瓶頸,但不是dbvisualizer?想看下一個地方的任何想法?

CREATE TABLE ts_log (id numeric identity(19) NOT NULL GENERATED ALWAYS AS IDENTITY, log_comment varchar(2500), log_entry varchar(2500) NOT NULL, time_sheet_id numeric(19) NOT NULL, PRIMARY KEY (id)); 
+1

查詢返回多少行?也許DbVisualizer不顯示它們和NetBeans。或DbVisualizer不顯示所有內容。請[編輯]你的問題,併爲有問題的表添加'create table'語句。在所有四種環境中,您是否使用**完全相同的**參數作爲連接URL? –

+0

用create語句更新了問題。 NetBeans上的默認值爲1000行,返回的實際行總數爲2.所有環境中的相同url。 –

回答

1

可能發生的情況是查詢計劃發生了變化,可能是由於行數增加。您應該運行UPDATE STATISTICS,並檢查查詢計劃。如果搜索參數沒有足夠的選擇性來檢索所需的行,則應該重新考慮表/查詢設計。

+0

我們昨晚運行了更新統計,發現它解決了我們的問題。我們最終發現的是,在某些機器上,dbvisualizer會使用表索引來查詢表,但在使用dbvisualizer的其他機器上,即使使用相同的驅動程序,它也不會使用表索引。我打算髮佈一個問題,詢問什麼會導致索引不總是被使用?這似乎是在不同機器中非常一致的行爲。你有沒有對此有任何想法?它已經運行了近3年,突然成爲一個問題。 –

+0

當數據內容發生變化或者表格被分割時,查詢計劃總是有可能在某個時間點翻轉。因此,定期運行UPDATE STATISTICS(如果可能,更新INDEX STATISTICS)是正常數據庫維護的一部分。 – RobV