Производительность Linq: два запроса, первый ответ сразу, а второй очень медленный - PullRequest
3 голосов
/ 10 марта 2012

У меня есть два очень похожих запроса, используя метод Linq ExecuteQuery, первый занимает 30 секунд, а второй - промежуточный.

Я выполняю запросы также в Microsoft SQL Server Management Studio, и оба запросавремя ответа 0 секунд.

Запрос 1 (медленный)

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
   "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB WHERE id_tank = {0} AND date >= {1} order by date", 
   new object[] { tankId, date });

Запрос 2 (быстрый)

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
   "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB WHERE id_tank = {0} AND date <= {1}     order by date desc", 
   new object[] { tankId, date });

Примечание 1: ViewDataTanksDataDevicesSB - это представление с привязкой SCHEMA, и оно имеет два индекса

  1. Индекс 1 (id_tank, дата asc)
  2. Индекс 2 (id_tank, date desc)

Примечание 2: Если я выполню первый второй запрос, результат будет идентичным: медленный Query1 и быстрый Query 2.

Примечание 3: представление имеет миллионы регистров, ирезультаты одинаковы для разных дат и танков.

Ответы [ 4 ]

3 голосов
/ 14 марта 2012

Я решил это через одну неделю, просматривая план выполнения (спасибо Yahia за предложение) !!!

В двух запросах я указал INDEX (спасибо Денису), и мне пришлось указать подсказку NOEXPAND .

Объяснение NOEXPAND можно найти по адресу: Таблица подсказок

Итак, окончательные запросы:

Запрос 1

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
   "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB with (index(IX_ViewDataTanksDataDevicesSB_TankIdDate) noexpand) WHERE id_tank = {0} AND date >= {1} order by date", 
   new object[] { tankId, date });

Запрос 2

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
   "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB with (index(IX_ViewDataTanksDataDevicesSB_TankIdDate) noexpand) WHERE id_tank = {0} AND date <= {1} order by date desc", 
   new object[] { tankId, date });
1 голос
/ 13 марта 2012

Без сравнения планов запросов и т. Д. На это трудно ответить ...

НО из вашего описания кажется, что оба запроса выполняются быстро в SSMS, и один из них медленный при запуске fron.NET - причина такого другого поведения может заключаться в настройках, используемых для сеанса БД, в SSMS есть значения по умолчанию, которые отличаются от значений по умолчанию, используемых в ADO.NET (то, что использует LINQ). здесь .

Более подробное объяснение, включая несколько советов о том, как разрешить определенные ситуации в этом отношении, пожалуйста, опубликуйте подробнее, esp.запросить планы, чтобы получить более конкретную помощь ...

0 голосов
/ 19 марта 2012

Не могли бы вы предоставить больше информации из MS SQL Server Profiler? Планы запросов предпочтительнее выяснить, если они на стороне MS SQL Server или на стороне CLR.

0 голосов
/ 13 марта 2012

Попробуйте добавить option(recompile) в конец запросов.

Обновление

Ваши Индекс 1 и Индекс 2 практически идентичны, вы можете удалить любой из них. Также возможно подсказать движок, какой индекс использовать в таблице с параметром with(index(ix_index1)), например:

SELECT TOP 1 * 
FROM ViewDataTanksDataDevicesSB with(index(ix_index1))
WHERE id_tank = 123 AND date <= '20120313'
order by date desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...