2011-11-29 90 views
0

使用LINQ到MySQLC#LINQ MySQL查詢優化

MySQL的表定義

ID    binary(16) PK 
UtcTriggerTime datetime NOT NULL 
PersonID  binary(16) NOT NULL FK 
Status   int(11) NOT NULL 

我有PersonIDs的(GUID)的一個陣列,並且對於每個是PersonID的我想從表中選擇符合以下條件的記錄:

UtcTriggerTime >= PREDEFINED_DATE_TIME (e.g. UtcNow - 30days) 
AND 
Status=1 OR Status=2 

我目前是我們一個

foreach(var personID in personIDsArray){ 
     var qryResult = (from a in AlertObjects.AlertsTriggered 
           where a.PersonID == personID && 
           (a.Status == 1 || a.Status == 2) && 
           a.UtcTriggerTime >= PREDEFINED_DATE_TIME         
           select a).ToArray(); 
} 

什麼是可能的選項來優化這個性能?或者在那裏?

我試圖把一個索引上(UtcTriggerTime,是PersonID,狀態),然後用PersonIDs做一個查詢,如下所示的陣列,但它更慢,當我想到是有道理的:

 var qryResult = (from a in AlertObjects.AlertsTriggered 
           where personIDsArray.Contains(a.PersonID) && 
           (a.Status == 1 || a.Status == 2) && 
           a.UtcTimeTriggered >= PREDEFINED_DATE_TIME 
           group a by a.PersonID into alerts 
           select alerts).ToArray(); 

回答

0

在我看來,你處理的是典型的選擇N這是由

group a by a.PersonID into alerts 
select alerts 

部分引起+ 1點的問題。 你可以看看生成的SQL,看看它看起來像什麼嗎?

此外,如果沒有多少值,則不需要將狀態置於索引中,因爲性能的增加會很小。

如果我quess是正確的,你可以看看這些問題,看問題如何處理:

How to Detect Select n+1 problems in Linq to SQL?
http://www.west-wind.com/weblog/posts/2009/Oct/12/LINQ-to-SQL-Lazy-Loading-and-Prefetching

我不熟悉MySQL,但它在我看來,此鏈接可能有助於診斷哪些查詢較慢。
http://www.electrictoolbox.com/show-running-queries-mysql/

+0

謝謝你Jenea。由LINQ生成的SQL的方式太大,因爲contains子句中的ID數量太大。同樣在我的命令窗口中,它會被剪輯,儘管我猜想肯定有一種方法可以讓 – Shahid

+0

以較少的用戶ID運行。查詢計劃應該是一樣的(不確定),你將能夠看到發生了什麼。 –