2016-07-26 25 views
0

假設我正在運行一個linq查詢來選擇某個表中某列DateOfCreationdatetime)在最近30天內的所有客戶,並且表中有多年的客戶。當我運行select語句並限制where子句時,Linq是否搜索整個數據庫?

在超過30天后,查詢是否繼續搜索每一行?對於此示例,假設有一個自動遞增的整數主鍵 - 可能爲CustomerID,並且行在創建時已插入,因此它們也按DateOfCreation排序。

+4

如果'DateOfCreation'字段被索引,否則不會。如果不是,它可能會。 – InBetween

+3

這取決於你的DateOfCreation是否被編入索引。如果不是,則需要全表掃描,它將讀取每一行。 –

+0

好的,謝謝你們倆。 –

回答

2

如果你有一個LINQ查詢將在過去30天的測試值相匹配的所有數據進行搜索,類似這樣的:

var result = dataContext.MyTable.Where(r => r.Value == testValue && 
             r => r.DateOfCreation > DateTime.Now.AddDays(-30)); 

這意味着下面的SQL:

select * from MyTable 
where Value = testValue 
and DateOfCreation > DATEADD(day,-30,GetDate()) 

所以查詢將不得不搜索表中的每一行以找到正確的數據,但是這樣的查詢(如果表索引正確索引DateOfCreation)將會相對較快。如果列有索引,則意味着SQL不必掃描整個表以查找滿足查詢的行。

如果您遇到問題,請使用LINQPad之類的東西將linq轉換爲SQL,然後您可以直接在數據庫上運行該程序,並使用SQL工具(執行平面,SQL Profiler)查找瓶頸位置。解決方案可能是將索引等添加到表中或最終重寫查詢。

+0

該索引使其變得很快,因爲它並不要求它掃描整個表格(你並沒有真正明確表示) – juharr

+0

除了LINQPad查看產生的SQL查詢之外,另一個選項是立即將一個斷點你填充結果(但在枚舉ToList()之前或其他)。然後你可以檢查結果的值,它應該給你SQL。 – RIanGillis

1

LINQ查詢並沒有真正與這個問題有關。當你做一個LINQ查詢,例如:

from e in db.Entities 
where DateOfCreation > startDateRange 
    && DateOfCreation < endDateRange 

LINQ將其轉換爲類似的查詢:

select 'Column1', 'Column2', '...ColumnN' from Entities 
where DateOfCreation > 'startDateRangeValue' 
    and DateOfCreation < 'endDateRangeValue' 

正如評論所說,如果你對DateOfCreation的一個索引,那麼它將不需要執行全表掃描(讀取每一行)。