Оптимизация высоконагруженных asp.net приложений,...

21
Длинное название не влезло Станислав Выщепан

Upload: -

Post on 15-Jun-2015

3.054 views

Category:

Technology


5 download

DESCRIPTION

Вы разрабатываете веб-приложения и используете хранимые процедуры? Вы пишите SELECT … WITH(NOLOCK)? Вы считаете, что ORMы снижают быстродействие приложений? Тогда этот доклад для вас! В докладе будут развенчаны популярные мифы о применении библиотек Object-Relational Mapping (ORM) в ASP.NET при работе с Microsoft SQL Server. Также будут рассмотрены конкретные методики увеличения быстродействия работы с данными в веб-приложениях.

TRANSCRIPT

Page 1: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Длинное название не влезлоСтанислав Выщепан

Page 2: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Обо мне

• Консультант по архитектуре и разработке бизнес-приложений• 10 лет опыта в индустрии• 8 лет опыта в .NET и продуктах Microsoft• SharePoint Server MVP• Автор сообщества по SharePoint на Facebook

• https://www.facebook.com/groups/sharepointrussian/

• Спикер, автор, занимаюсь opensource проектами• http://gandjustas.blogspot.ru • http://sptypescript.codeplex.com• http://spcafcontrib.codeplex.com

Page 3: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Почему веб-приложения

• 99% бизнес-приложений основано на веб-технологиях• Масштабируемость• Работа в ограниченных ресурсах с высокими требованиям к

быстродействию• Соотношения чтения\записи - 98\2 в высоко инерактивных

приложениях• В 90% случаев узкое место - база данных

Page 4: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Почему Linq и Entity Framework

• Проверка запросов в момент компиляции• Декомпозиция запросов• Code-first создание базы данных• Интеграция в фреймворк

Page 5: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Хит-парад возражений

1. Linq генерирует неэффективные SQL запросы2. Нельзя написать hint3. Медленный маппинг4. Медленная генерация SQL5. Хранимые процедуры работаю быстрее

Page 6: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Linq генерирует неэффективные SQL запросы• Неэффективные SQL-запросы генерируют люди, а не Linq• Основная причина – непонимание разницы в семантике• Есть ошибки и унаследованные проблемы в генераторе SQL• Мало• Легко обойти

Page 7: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Linq генерирует неэффективные SQL запросыpublic IEnumerable<DocumentDto> GetDocumentsToday()

{

foreach (var item in Db.Documents.Where(x => x.CreatedOn.Date == DateTime.Today))

{

yield return Mapper.Map<Document, DocumentDto>(item);

}

}

Page 8: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Нельзя написать Hint

• Зачем писать Hint?

1. NOLOCK • Использовать уровни изоляции• Использовать RCSI (включено по умолчанию для code-first)

2. JOIN\INDEX HIHT • Сделать хорошие индексы, обновить статистику• Использовать plan_guide

Page 9: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Медленное ВСЕ

• Протестируем…

• Маппинг – меньше миллисекуны на объект• Генерация запроса - миллисекунды

Page 10: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Хранимые процедуры работаю быстрее• Неправда!

• В .NET используется sp_executesql для выполнения параметризованных команд• Параметризованные планы кешируются

Page 11: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

8 простых советов для повышения производительности приложения

Page 12: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№0 Отключить Lazy Load

… и никогда не включать его

Page 13: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№1 Делать проекции

• Меньше данных• Меньше чтений страниц • В случае blob и overflow полей

• Больше возможности построить покрывающий индекс• Объекты не добавляются в контекст

• Таки делать проекции!

Page 14: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№2 Ограничивать выборку

• Никогда не тянуть все записи• Использовать разбиение по страницам

• Entity Framework Profiler показывает такие места

Page 15: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№3 Использовать асинхронные запросы• Существующий синхронный код легко мигрировать• async в методах• .ToListAsync() в запросах• .SaveChangesAsync() для сохранения• await для методов

• Снижает скорость!• Но увеличивает масштабируемость

Page 16: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№4 Не использовать функции и выражения в предикатах и соединениях

• Функция в предикате ломает оптимизатор• В .NET легко сгенерировать функцию в запросе• Особенно для типа DateTime

• Проверяйте запросы, которые идут в базу

Page 17: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№5 Не держать открытым IEnumerator больше, чем надо для получения данных

• Пока открыт IEnumerator – открыт DataReader• Пока открыт DataReader – удерживаются ресурсы запроса• А если уровень изоляции Repeatable Read и выше, то и блокировки

• Всегда делать .ToListAsync() перед обходи результатов• Не отдавать IQueryable<T> в генерацию View

Page 18: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№6 Использовать mapped функции там, где Linq не хватает• Основные кандидаты:• RANKING FUNCTIONS• Full Text Search

Page 19: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

№7 Не более одного контекста на запрос• Использовать IoC – контейнеры

Page 20: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Заключение

• Основные причины медленных запросов – программисты• Учить, а не ограждать

• Скоро будет курс по оптимизации ASP.NET приложений «от и до»• Следите за анонсами на Facebook -

https://www.facebook.com/groups/144858492215825/

Page 21: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Вопросы?Станислав Выщепан

http://gandjustas.blogspot.com

@gandjustashttps://www.facebook.com/gandjustas

[email protected]