0

У меня есть следующий запрос, который занимает почти 1 минуту.Sql Select Query Performance

public static Func<Entities, string, IQueryable<string>> compiledInvoiceQuery = 
      CompiledQuery.Compile((Entities ctx, string orderNumb) => 
        (from order in ctx.SOP10100 
        where order.ORIGNUMB == orderNumb 
        select order.SOPNUMBE).Union(
               from order in ctx.SOP30200 
               where order.ORIGNUMB == orderNumb 
               select order.SOPNUMBE) 
               ); 

Он фильтрует на основе ORIGNUMB, который не является моим первичным ключом, я даже не могу помещать на него какой-либо индекс. Есть ли у нас какой-либо другой способ сделать это быстрее? Я тестировал на SQL сервере, и обнаружили, что только запрос

from order in ctx.SOP10100 
where order.ORIGNUMB == orderNumb 
select order.SOPNUMBE 

или

select SOPNUMBE 
from SOP10100 
where ORIGNUMB = @orderNumb 

занимает более 55 секунд. Пожалуйста, предложите.

+0

Поскольку «ORIGNUMB» является единственным элементом ваших критериев выбора, нет никакой возможности индексировать этот столбец для повышения производительности. – dasblinkenlight

+0

Если вы не можете создавать индексы, то, по-вашему, ваш единственный выбор - переписать запрос, возможно, быть более избирательным (но маловероятным без индекса). –

+1

почему вы не можете его проиндексировать? – HLGEM

ответ

1

Если на сервере ушло 55 секунд, то теперь это связано с linq. Почему у вас нет указателя на нем, потому что вам нужно его ...

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

0

Одна из больших проблем с LINQ to SQL заключается в том, что у вас очень мало контроля над генерируемым SQL.

Поскольку вы используете объединение, а не соединение, это должен быть довольно простой SQL. Что-то вроде этого:

SELECT * 
FROM SOP10100 
WHERE ORIGNUMB = 'some number' 
UNION 
SELECT * 
FROM SOP30200 
WHERE ORIGNUMB = 'some number' 

Вы можете использовать SQL Server Profiler для просмотра операторов SQL, которые в настоящее время работают с базой данных, чтобы увидеть, если SQL, как это или что-то более сложное. Затем вы можете запустить SQL, сгенерированный в SQL Server Management Stuido, и включить «Включить статистику клиентов» и включить «Фактический план выполнения», чтобы узнать, что именно вызывает проблему производительности.