Оптимизация высоконагруженных asp.net приложений,...
DESCRIPTION
Вы разрабатываете веб-приложения и используете хранимые процедуры? Вы пишите SELECT … WITH(NOLOCK)? Вы считаете, что ORMы снижают быстродействие приложений? Тогда этот доклад для вас! В докладе будут развенчаны популярные мифы о применении библиотек Object-Relational Mapping (ORM) в ASP.NET при работе с Microsoft SQL Server. Также будут рассмотрены конкретные методики увеличения быстродействия работы с данными в веб-приложениях.TRANSCRIPT
Длинное название не влезлоСтанислав Выщепан
Обо мне
• Консультант по архитектуре и разработке бизнес-приложений• 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
Почему веб-приложения
• 99% бизнес-приложений основано на веб-технологиях• Масштабируемость• Работа в ограниченных ресурсах с высокими требованиям к
быстродействию• Соотношения чтения\записи - 98\2 в высоко инерактивных
приложениях• В 90% случаев узкое место - база данных
Почему Linq и Entity Framework
• Проверка запросов в момент компиляции• Декомпозиция запросов• Code-first создание базы данных• Интеграция в фреймворк
Хит-парад возражений
1. Linq генерирует неэффективные SQL запросы2. Нельзя написать hint3. Медленный маппинг4. Медленная генерация SQL5. Хранимые процедуры работаю быстрее
Linq генерирует неэффективные SQL запросы• Неэффективные SQL-запросы генерируют люди, а не Linq• Основная причина – непонимание разницы в семантике• Есть ошибки и унаследованные проблемы в генераторе SQL• Мало• Легко обойти
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);
}
}
Нельзя написать Hint
• Зачем писать Hint?
1. NOLOCK • Использовать уровни изоляции• Использовать RCSI (включено по умолчанию для code-first)
2. JOIN\INDEX HIHT • Сделать хорошие индексы, обновить статистику• Использовать plan_guide
Медленное ВСЕ
• Протестируем…
• Маппинг – меньше миллисекуны на объект• Генерация запроса - миллисекунды
Хранимые процедуры работаю быстрее• Неправда!
• В .NET используется sp_executesql для выполнения параметризованных команд• Параметризованные планы кешируются
8 простых советов для повышения производительности приложения
№0 Отключить Lazy Load
… и никогда не включать его
№1 Делать проекции
• Меньше данных• Меньше чтений страниц • В случае blob и overflow полей
• Больше возможности построить покрывающий индекс• Объекты не добавляются в контекст
• Таки делать проекции!
№2 Ограничивать выборку
• Никогда не тянуть все записи• Использовать разбиение по страницам
• Entity Framework Profiler показывает такие места
№3 Использовать асинхронные запросы• Существующий синхронный код легко мигрировать• async в методах• .ToListAsync() в запросах• .SaveChangesAsync() для сохранения• await для методов
• Снижает скорость!• Но увеличивает масштабируемость
№4 Не использовать функции и выражения в предикатах и соединениях
• Функция в предикате ломает оптимизатор• В .NET легко сгенерировать функцию в запросе• Особенно для типа DateTime
• Проверяйте запросы, которые идут в базу
№5 Не держать открытым IEnumerator больше, чем надо для получения данных
• Пока открыт IEnumerator – открыт DataReader• Пока открыт DataReader – удерживаются ресурсы запроса• А если уровень изоляции Repeatable Read и выше, то и блокировки
• Всегда делать .ToListAsync() перед обходи результатов• Не отдавать IQueryable<T> в генерацию View
№6 Использовать mapped функции там, где Linq не хватает• Основные кандидаты:• RANKING FUNCTIONS• Full Text Search
№7 Не более одного контекста на запрос• Использовать IoC – контейнеры
Заключение
• Основные причины медленных запросов – программисты• Учить, а не ограждать
• Скоро будет курс по оптимизации ASP.NET приложений «от и до»• Следите за анонсами на Facebook -
https://www.facebook.com/groups/144858492215825/
Вопросы?Станислав Выщепан
http://gandjustas.blogspot.com
@gandjustashttps://www.facebook.com/gandjustas