оптимизировать запрос linq с помощью нескольких операторов включения - PullRequest
0 голосов
/ 17 июня 2019

Запрос linq занимает около 20 секунд для выполнения некоторых данных. При преобразовании linq в sql существует 3 вложенных объединения, для выполнения которых может потребоваться больше времени. Можем ли мы оптимизировать запрос ниже.

var query = (from s in this.Items 
             where demoIds.Contains(s.Id)      
             select)
             .Include("demo1")
             .Include("demo2")
             .Include("demo3")
             .Include("demo4");

return query;

Ожидается, что запрос будет выполнен за 3-4 секунды, что сейчас занимает около 20 секунд для 100 демо-идентификаторов.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Советую ленивую загрузку или присоединиться к запросу.

Вероятно, вывод SQL - это запрос;

(SELECT .. FROM table1 WHERE ID in (...)) AS T1
   (INNER, FULL) JOIN (SELECT .. FROM table2) AS T2 ON T1.PK = T2.FOREIGNKEY
   (INNER, FULL) JOIN (SELECT .. FROM table3) AS T3 ON T1.PK = T3.FOREIGNKEY
   (INNER, FULL) JOIN (SELECT .. FROM table4) AS T4 ON T1.PK = T4.FOREIGNKEY

Но если вы можете использовать отложенную загрузку, нет необходимости использовать функцию Include (). И ленивая загрузка решит вашу проблему.

Другие, вы можете написать с запросом присоединения,

var query = from i in this.Items.Where(w=>demoIds.Contains(w.Id))
            join d1 in demo1 on i.Id equals d1.FK
            join d2 in demo2 on i.Id equals d2.FK
            join d3 in demo3 on i.Id equals d3.FK
            select new ... { };

Эти два решения решают все ваши проблемы. Если проблема не исчезнет, ​​я настоятельно рекомендую сохранить процедуру.

0 голосов
/ 17 июня 2019

Что касается вашего кода, похоже, это лучший способ получить то, что вы хотите (Предположим, Include ing "demo3" дважды - опечатка для этого примера.).

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

...