假設我正在運行一個linq查詢來選擇某個表中某列DateOfCreation
(datetime
)在最近30天內的所有客戶,並且表中有多年的客戶。當我運行select語句並限制where子句時,Linq是否搜索整個數據庫?
在超過30天后,查詢是否繼續搜索每一行?對於此示例,假設有一個自動遞增的整數主鍵 - 可能爲CustomerID
,並且行在創建時已插入,因此它們也按DateOfCreation
排序。
假設我正在運行一個linq查詢來選擇某個表中某列DateOfCreation
(datetime
)在最近30天內的所有客戶,並且表中有多年的客戶。當我運行select語句並限制where子句時,Linq是否搜索整個數據庫?
在超過30天后,查詢是否繼續搜索每一行?對於此示例,假設有一個自動遞增的整數主鍵 - 可能爲CustomerID
,並且行在創建時已插入,因此它們也按DateOfCreation
排序。
如果你有一個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)查找瓶頸位置。解決方案可能是將索引等添加到表中或最終重寫查詢。
該索引使其變得很快,因爲它並不要求它掃描整個表格(你並沒有真正明確表示) – juharr
除了LINQPad查看產生的SQL查詢之外,另一個選項是立即將一個斷點你填充結果(但在枚舉ToList()之前或其他)。然後你可以檢查結果的值,它應該給你SQL。 – RIanGillis
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
的一個索引,那麼它將不需要執行全表掃描(讀取每一行)。
如果'DateOfCreation'字段被索引,否則不會。如果不是,它可能會。 – InBetween
這取決於你的DateOfCreation是否被編入索引。如果不是,則需要全表掃描,它將讀取每一行。 –
好的,謝謝你們倆。 –