Как улучшить производительность запросов LinqToSql, использующих свойства EntitySet? - PullRequest
2 голосов
/ 21 мая 2010

Я использую LinqToSql для запроса небольшой простой базы данных SQL Server CE.

Я заметил, что любые операции, связанные с под-свойствами, удручающе медленны.

Например, если у меня есть таблица Customer, на которую ссылается таблица Order, LinqToSql автоматически создаст свойство EntitySet<Order>. Это приятное удобство, позволяющее мне делать что-то вроде Customer.Order.Where(o => o.ProductName = "Stopwatch"), но по какой-то причине SQL Server CE довольно плохо зависает, когда я пытаюсь сделать что-то подобное. Один из моих запросов, который не так уж и сложен, занимает 3-4 секунды.

Я могу получить скорость до приемлемой, даже быстрой, если я просто возьму две таблицы по отдельности и преобразую их в List<Customer> и List<Order>, а затем соединю их вручную с моим собственным запросом, но это требует много дополнительный код LinqToSql генерирует эти EntitySet<T> свойства автоматически - я бы хотел их использовать.

Итак, как я могу улучшить производительность? Например, есть ли варианты DataContext, которые могут помочь?

Примечание. Моя база данных в исходном состоянии составляет всего около 250 КБ, и я не ожидаю, что она увеличится до более чем 1-2 МБ. Так что не так много записей.


Обновление

Вот определения таблиц для примера, который я использовал в своем вопросе:

create table Order
(
    Id int identity(1, 1) primary key,
    ProductName ntext null,
    Quantity int null
)

create table Customer
(
    Id int identity(1, 1) primary key,
    OrderId int null references Order (Id)
)

1 Ответ

2 голосов
/ 21 мая 2010

Я раньше не использовал SQL Server CE с Linq to SQL, но с такой маленькой БД моя интуиция подсказывает мне, что проблема с производительностью больше связана с плохой оптимизацией запросов, чем с доступом к диску.

Попробуйте получить запрос SQL от объектов Linq to SQL, чтобы увидеть, что может происходить. Возможно, запустите эти запросы вручную к базе данных CE, чтобы увидеть, как они работают.

Вполне возможно, что простое добавление правильных индексов решит проблему.

Вы также можете попробовать LinqToSQL Profiler. http://l2sprof.com/

...