2014-10-31 50 views
1

我只是想知道我是在浪費時間,還是有什麼可以改進這個查詢,從而提高性能。EF和LINQ查詢數據庫的速度

裏面一個倉庫,我試圖讓最近的10項

public List<entity> GetTop10 
    { 
     get 
     { 
      return m_Context.entity.Where(x => x.bool == false).OrderByDescending(x => x.Created).Take(10).ToList(); 
     } 
    } 

但這需要很長的時間,它的查詢中有超過11000行的表。所以我的問題是,無論如何我可以加快這種查詢?

我想讓我的SQL帽子關於性能,我知道命令會減慢它,但我怎麼能達到相同的結果?

感謝

+2

在桌子上放一些索引。在不瞭解表格結構的情況下,沒有其他建議。 – DavidG 2014-10-31 11:33:22

+2

添加索引怎麼樣? http://technet.microsoft.com/en-us/library/jj835095(v=sql.110).aspx – 2014-10-31 11:33:53

+0

好喊的傢伙,更專注於代碼而不是數據庫方面!謝謝 – user3428422 2014-10-31 11:35:39

回答

1

您發佈的特定查詢是使用過濾索引的潛在候選對象。假設你有一個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; 
+0

輝煌,得到迴應。我實際上要問的是爲這種查詢更好地使用存儲過程嗎?由於我的查詢不能使用過濾器索引? – user3428422 2014-10-31 12:03:20

+0

您可以使用太多的存儲過程,我已經做了,在過去的。 – DavidG 2014-10-31 12:48:39

0

從您的LINQ查詢將創建SQL SELECT與此類似:

SELECT TOP(10) * FROM entity 
WHERE bool = 0 
ORDER BY Created DESC 

類似的原因而不是「*」將服務器選擇混凝土柱將它們映射到實體對象。

如果這對你來說太慢了。錯誤在數據庫中,而不在EntityFramework中。 所以嘗試添加一些索引到你的表。

+1

這不完全正確。它將創建一個參數化查詢。所以不是'bool = 0',它會說'bool = @ p1'。這很重要,因爲它可能意味着像過濾索引這樣的東西將無法工作。 – DavidG 2014-10-31 11:41:33

+0

好吧,你是對的。 – Gh61 2014-10-31 14:11:18