2016-09-06 5 views
0

У меня возникли проблемы с управлением большим набором данных с помощью модели linq и telerik, я не могу понять проблему или как linq работает для выполнения запроса.Telerik Linq Extremly Slow при использовании запроса с OrderBy

Я запрашиваю базу данных, используя linq, для записей 300000+, и кажется, что linq выполняет запрос перед применением блоков принятия и пропуска.

Я выполнения этого запроса с помощью 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(); 

На первом запросе я получаю исключение тайм-аут, это занимает больше, чем в минуту запроса, если я изменю максимальное время выполнения, он будет работать, но займет около 2 минут.

Теперь, если я запускаю второй запрос, который в основном является тем же, но с текстом sql, он занимает всего секунду или 2 секунды. Это действительно сумасшествие, но это происходит, и мне нужно использовать linq, потому что я работаю с Kendo Asp Net Mvc и используя ToDataSourceResult, это то же самое, что и linq. Выполнение запроса занимает много времени.

Любая идея ?.

UPDATE

Выполнение некоторых Linq запросов с помощью опубликованных комментариев, я могу понять, что проблема заключается в Paramenters, когда я использую «ККО» Paramenters запрос LINQ бросить исключение тайм-аут, потому что он занимает много времени, чтобы выполнить его, Тот же запрос с SQL занимает 1 секунду.

Удаление условия ruc, с Linq выполняется в то же время, что и SQL, 1 секунда, я проверяю сопоставления, и кажется, что это нормально, столбец имеет значение 255 nvarchar, поэтому я считаю, что что-то не так с параметром ruc. Я отправляю детали отображения столбца и linq и sql, которые занимают 1 секунду.

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 +, вы можете попробовать выполнить регистрацию SQL-запросов, которые EF создает с помощью делегирования Database.Log, и посмотреть, действительно ли SQL-файлы являются одинаковыми. – Jure

+0

Вы можете легко увидеть сгенерированный SQL с помощью LinqPad. Обязательно используйте тот же поставщик баз данных, что и в вашем приложении. – Phil1970

+0

Я использовал Linq Pad, метод ToString() и события Visual Studio Diagnostic Tools, чтобы увидеть Сгенерированный SQL, и я получил то же самое, сгенерированный sql, если я запускаю как SQL, он занимает 1 секунду, а результат linq - это таймаут. Николов сказал, что, возможно, проблема с параметрами, я попробую изменить типы и увидеть результат. –

ответ

1

Эта разница в скорости запроса обычно связано с одним из следующих способов:

  1. Сгенерированный SQL заявление не самый эффективный, в вашем случае я не считаю, что это так, так как ваш запрос довольно прямолинейный. Однако вы можете проверить сгенерированный оператор 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, чтобы использовать существующие индексы. Обычными подозреваемыми являются «строковые» типы свойств. Из ваших примеров я вижу следующее: RucReceptor = '0990017514001'. Проверьте сопоставление для этого столбца, если это Unicode, но в db - varchar, это определенно повлияет на производительность отрицательно. Исправьте типы в сопоставлении, соответствующие тем, которые находятся в БД, и должны работать быстро.

Надеюсь, это поможет.

+1

Я использовал метод toString для получения Сгенерированного SQL, результат тот же, я запускаю сгенерированный SQL и занимает 1 секунду, я выполняю как LINQ и i Got Time Exeption. Я попытаюсь с параметрами, возможно, это хороший момент для расследования ... –