我正在使用C#(sharpdevelop)來訪問Firebird 2.5服務器。這工作得很好。但是,我遇到了性能問題。 我有兩個表,會員和交易存儲誰買什麼時候。看看誰在當我運行下面的複合查詢沒有被激活:C#上的火鳥:FbCommand.ExecuteReader()性能
SELECT * FROM members M
WHERE exists (select 1 from transactions WHERE taDateTime >= '30.06.2013' and Memberid = M.ID)
因此,會員制表上域ID和內幕交易的主要指標有兩個taDateTime和MEMBERID的indeces。
myConnection = new FbConnection(myConnectionString);
Connection.Open();
// property of a helper class, uses myConnection
// Then when I press the Search button:
// create the sql command, because the cut-off date is passed as a dbParam
IDbCommand aCmd = new FbCommand(sql, Connection);
IDataReader aReader = aCmd.ExecuteReader();
我現在有幾個10'000條目在成員和幾個100'000條目在交易。如果我在flamerobin中運行此查詢,則需要大約2.6秒的時間才能運行。這並不令人興奮,但足夠。但是,如果我在C#中運行此查詢,則需要3分鐘才能從調用 FbCommand.ExecuteReader(sql)返回。 我還沒有打開結果集,這純粹是對ExecuteReader()
的調用。那要花多久呢?
我已經嘗試了其他幾件事情,通過添加ROWS
或FIRST
子句來限制結果數量,兩者都沒有任何影響。所以這不是重要的結果數量。 我試圖將呼叫拆分爲2個查詢:首先找到DISTINCT(Transaction.MemberID)
,然後找到適合的成員,但是有太多ID合理地傳遞到第二個查詢中。 我甚至編寫了一個循環,它首先找到MemberID,然後爲每個結果運行一個"SELECT * FROM Members where ID = xx"
,這比單個語句快。那麼,什麼使得對ExecuteReader的調用延遲這麼久?
請幫忙,我在這裏真的很茫然。
親切的問候, 漢納斯
您使用哪種事務隔離? –
在等待結果的同時,您是否查看了[MON $ tables](http://ibexpert.net/ibe/index.php?n=Doc.SystemObjects#MONSystemTables)以查看數據庫中發生了什麼?您可以在MON $ STATEMENTS中看到當前正在執行和閒置的語句。 – nater
Hiya,我一次只運行一次交易,所以我希望這不重要,因爲我從來沒有看過那:)如果我錯了,請糾正我。關於MON $表:他們看起來很有趣,我可以從他們身上學到什麼?閒置聲明?什麼時候會發生?是否有可能看到我通過的優化聲明?我很想看看flamerobin如何優化我的陳述,也許這解釋了該代碼的性能與代碼之間的差異... – user1766553