2016-09-06 71 views
0

我在使用linq和telerik模型管理大型數據集時遇到了麻煩,我無法弄清楚問題或者linq如何執行查詢。Telerik Linq在使用OrderBy查詢時極其緩慢

我使用linq查詢數據庫到300000 +記錄,似乎linq在應用take和skip參數之前執行查詢。

我使用LINQ執行這個查詢:

var result = repository.Documents.Where(p => p.TenantId = 1 && p.TipoDocumento == SriDocType && p.RucReceptor == ruc).OrderByDescending(p => p.FechaEmision).Take(20).Skip(0).ToList(); 

然後,我通過使用SQL運行相同的查詢:

var result = ((EddocumentRepository)repository).Model.ExecuteQuery<Riverminds.ShardLayer.Eddocument>("SELECT TOP 20 * FROM eddocuments WHERE TenantId = 1 and TipoDocumento = 1 and RucReceptor = '0990017514001' Order By FechaEmision Desc", (new List<System.Data.Common.DbParameter>()).ToArray()).ToList(); 

在第一查詢我得到一個超時例外,它需要超過一分鐘的查詢,如果我改變maxexecutiontime,它會工作,但會花費2分鐘。

現在,如果我運行第二個查詢基本上是相同的事情,但與SQL文本,它只需要一秒或2秒。這真的很瘋狂,但它正在發生,我需要使用linq,因爲我正在使用Kendo Asp Net Mvc並使用與Linq相同的ToDataSourceResult。執行查詢需要很長時間。

任何想法?

UPDATE

做與的投稿留言幫助一些LINQ查詢,我可以計算出,這個問題是paramenters,當我使用「中國人民大學」 paramenters LINQ查詢扔,因爲它超時異常需要花費大量時間來執行它,使用SQL的相同查詢需要1秒。

刪除ruc條件,與Linq需要與SQL相同的時間,1秒鐘,我檢查映射,它似乎沒問題,列是一個255 nvarchar爲空,所以我認爲參數ruc有些問題。我發佈了列的映射細節以及需要1秒的linq和sql。

configuration.HasProperty(x => x.RucReceptor).HasFieldName("_rucReceptor").WithDataAccessKind(DataAccessKind.ReadWrite).ToColumn("RucReceptor").IsNullable().HasColumnType("nvarchar").HasLength(255); 

var result = repository.Documents.Where(p => p.TenantId = 1 && p.TipoDocumento == SriDocType).OrderByDescending(p => p.FechaEmision).Take(20).Skip(0).ToList(); 

var result = ((EddocumentRepository)repository).Model.ExecuteQuery<Riverminds.ShardLayer.Eddocument>("SELECT TOP 20 * FROM eddocuments WHERE TenantId = 1 and TipoDocumento = 1 Order By FechaEmision Desc", (new List<System.Data.Common.DbParameter>()).ToArray()).ToList(); 

感謝您的幫助

聖地亞哥·穆尼奧斯

+1

如果使用EF6 +,可以嘗試使用Database.Log委託記錄EF生成的SQL,並查看SQL是否實際相同。 – Jure

+0

您可以使用LinqPad輕鬆查看生成的SQL。確保使用與您的應用程序中相同的數據庫提供程序。 – Phil1970

+0

我使用Linq Pad,ToString()方法和事件的Visual Studio診斷工具來查看生成的SQL,我得到了同樣的東西,生成的SQL如果我運行SQL爲1秒,並且linq結果超時。 Nikolov說,也許參數有問題,我會嘗試更改類型並查看結果。 –

回答

1

這種差異在查詢速度通常是由於下列之一:

  1. 生成的SQL語句是不最有效率,在你的情況下,我不相信這是事實,因爲你的查詢非常簡單。然而,你可以通過執行

    string sql = repository.Documents.Where(p => p.TenantId = 1 && p.TipoDocumento == SriDocType && p.RucReceptor == ruc).OrderByDescending(p => p.FechaEmision).Take(20).Skip(0).ToString() 
    
  2. 檢查生成的SQL語句可能有參數類型不匹配導致在服務器端隱式類型轉換,防止SQL服務器利用現有的索引。通常的嫌疑人是「字符串」類型的屬性。從你的例子我看到這個:RucReceptor ='0990017514001'。檢查這個列的映射,如果它是Unicode但在數據庫是varchar這肯定會影響性能的消極。修復映射中的類型以與數據庫中的類型相對應,並且應該快速運行。

希望這會有所幫助。

+1

我使用toString方法來獲得生成的SQL,結果是一樣的,我運行生成的SQL並需要1秒鐘,我執行LINQ和我有一個超時執行。我會嘗試使用參數,也許是一個很好的調查點... –