2015-11-23 75 views
2

我正在使用ASP.Net4.5.1 & EF6.0代碼優先的方法。如何在EF Code-First中預編譯sql查詢?

我意識到查詢需要花費大量時間來執行。我已經使用EF Profiler來檢查查詢&的查詢。

我使用Google搜索&來了解編譯Linq。

這些是我得到的鏈接。

但他們都不是解決我的問題。

假設我有下面的查詢。

public IEnumerable<Student> GetStudents() 
{ 
    using(DbContext db = new DbContext() 
    { 
    IQueryable<Student> query = (from c in db.Students 
           where c.Hobby== "Hockey" 
           select c); 
    IEnumerable<Student> students= query.toList<Student>(); 

    return students; 
    } 
} 

現在如何緩存查詢計劃或編譯這個Linq來提高性能?

這裏要問的另外一件事,是EF比原生SQL慢嗎?

我更喜歡使用EF/ORM,這是正確的選擇嗎?

+0

我們是在談論第一個查詢執行(通常包括視圖生成時間)還是一般的查詢執行? – tschmit007

+0

@ tschmit007 查詢執行 –

+0

此代碼是否與您的應用程序或示例代碼無關?根據你的一些回覆,似乎你還沒有發佈真實的代碼。如果是這樣的話,很難提供幫助。 –

回答

8

是的,EF比SQL慢。這是ORM的任何。 ORM必須將基於代碼的「查詢」轉換爲真正的SQL查詢,然後它必須使用結果來實例化對象圖。但是,這些一般都是你想要的的一個ORM。手動做這種類型的東西會更困難,更容易出錯。

您是否使用ORM完全取決於您的應用程序的需求。通常情況下,建議使用ORM,但如果您需要極高的性能,則可能需要使用純SQL。 ORM在個人表現上也有很大的不同。 EF被認爲是一個特別慢的ORM。這是使用和使用最簡單的方法之一,但如果性能是一個問題,那麼最好用Dapper之類的東西。您還可以混合使用ORM和SQL。使用EF作爲標準CRUD並且然後利用存儲過程進行復雜查詢並不是異常。

所有這一切說,你有的查詢是非常基本的。如果遇到類似這樣的性能問題,您的SQL Server實例可能沒有足夠的資源可用,網絡速度非常慢,或者表中有大量數據,而且您沒有正確使用索引。

關於最後一點,文本搜索,在一般情況下,是最慢與SQL執行之中。如果您打算查詢特定的基於文本的列,例如Hobby,那麼您應該在其上添加一個索引。您可以在數據庫手動執行此操作,也可以使用屬性上的[Index]數據註釋。請記住,只有固定長度的基於文本的列才能被索引。默認情況下,EF將生成字符串屬性NVARCHAR(MAX)。如果您想在列上使用索引,則需要將[Index][MaxLength(N)]結合使用。

+0

謝謝.. :) 我已經添加了適當的唯一索引..你可以請在這裏建議我一件事..我的應用程序是關於網上預訂你說什麼,我應該使用EF或本機SQL –

+2

這不僅僅是基本目的你的申請。你期望什麼樣的負載?它會被數百,數千甚至數百萬人使用嗎?您運行的查詢有多複雜?還有一百萬個其他問題可以提出。我並不期待真正的答案;我只是說,*你*必須做出決定。此外,staight SQL應該被視爲最後的手段。在你走這條路線之前,你應該在數據庫和網絡服務器上投擲不合要求的RAM和處理內核。 –

+0

1k-2.5k每天擊中.. 查詢不是太複雜..現在應該如何使用EF或原生SQL –

3

如果你想更快的數據訪問代碼,您應該考慮使用它使用SqlCommandSqlDataReaderExecuteReader方法SQL查詢執行純ADO.NET代碼。但是現在您需要編寫一些額外的代碼來創建SqlCommand,傳遞查詢和參數並讀取SqlDataReader中的行。

你應該考慮一些迷你ORM的像Dapper。它比EF更快。如上所述,您不需要編寫太多的代碼。 Dapper將執行您的查詢並將結果集映射到您的DTO。

使用Dapper的快速示例。

var con= new SqlConnection("YourConnectionStringGoesHere"); 
var posts = con.Query<Post>("SELECT ID,Name from Post"); 

小巧玲瓏載體讀取來自多個表(JOIN)和將數據映射到與導航屬性的對象。

在他們的性能數字 enter image description here

EF/NHibernate的會幫助你做快速的發展,因爲它是容易溝通與他們的API /方法的數據庫看看。但你付出的表現。

還要記住的重要事情是優化您的SQL查詢。即使使用純ADO.NET,如果您的sql查詢未經優化,您的性能可能會很差。爲表/列添加適當的索引也可能有所幫助。

我對您的應用程序並不完全確定,但您應該閱讀有關緩存數據的信息,以便您的數據庫不會始終處於打開狀態。這通常會改善你的表現。

+0

@ Shyju..many謝謝... :)我的應用程序是在線預訂系統..你可以請建議我應該與EF或本機SQL?因爲我們處於非常初級的階段......我覺得這是決定它的正確階段.. FYI性能是我第一個擔心的問題 –

+1

您總是可以使用Dapper/Pure ADO.NET與EF的混合。您應該能夠確定自己項目的哪個部分需要最佳性能。 – Shyju