[英]EF and LINQ query to database speed
我只是想知道我是在浪費時間還是有什么我可以改進此查詢的方法,從而可以提高性能。
在存儲庫中,我正在嘗試獲取10個最新商品
public List<entity> GetTop10
{
get
{
return m_Context.entity.Where(x => x.bool == false).OrderByDescending(x => x.Created).Take(10).ToList();
}
}
但這要花費很長時間,因為其查詢表中有超過11000行。 所以我的問題是,無論如何我是否可以加快這種查詢的速度?
我正在嘗試在性能方面使用SQL帽子,我知道順序會降低它的速度,但是如何獲得相同的結果?
謝謝
您發布的特定查詢是使用篩選索引的潛在候選者。 假設您有一個SQL表:
CREATE TABLE Employees
(
ID INT IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(100),
IsAlive BIT
)
您可以想象,一般來說,您只想查詢尚未死亡的員工,因此最終會出現如下SQL:
SELECT Name FROM Employees WHERE IsAlive = 1
因此,為什么不創建過濾索引:
CREATE INDEX IX_Employees_IsAliveTrue
ON Employees(IsAlive)
WHERE IsAlive = 1
因此,現在查詢表時,它將使用該索引,該索引可能只占表的一小部分,尤其是如果您最近有一次僵屍入侵,而現在90%的員工已經死了。
但是,這樣的實體框架:
var nonZombies = from e in db.Employees
where e.IsAlive == true
select e;
可能無法使用索引(SQL在過濾索引和參數化查詢方面存在問題)。 為了解決這個問題,您可以在數據庫中創建一個視圖:
CREATE VIEW NonZombies
AS
SELECT ID, Name, IsAlive FROM Employees WHERE IsAlive = 1
現在,您可以將其添加到框架中(操作方式將取決於您是否首先使用代碼/模型/數據庫而有所不同),並且現在您可以決定哪些雇員值得緊急關注(例如優先獲得食物和武器) :
var nonZombies = from e in db.NonZombies
select e;
從您的LINQ查詢中將創建類似於以下內容的SQL SELECT:
SELECT TOP(10) * FROM entity
WHERE bool = 0
ORDER BY Created DESC
之所以類似,是因為服務器將選擇具體的列而不是'*'來將它們映射到實體對象。
如果這對您來說太慢了。 該錯誤在數據庫中,而不在EntityFramework中。 因此,嘗試向表中添加一些索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.