SlideShare ist ein Scribd-Unternehmen logo
1 von 21
Длинное название не влезло 
Станислав Выщепан
Обо мне 
• Консультант по архитектуре и разработке бизнес-приложений 
• 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% бизнес-приложений основано на веб-технологиях 
• Масштабируемость 
• Работа в ограниченных ресурсах с высокими требованиям к 
быстродействию 
• Соотношения чтениязаписи - 982 в высоко инерактивных 
приложениях 
• В 90% случаев узкое место - база данных
Почему Linq и Entity Framework 
• Проверка запросов в момент компиляции 
• Декомпозиция запросов 
• Code-first создание базы данных 
• Интеграция в фреймворк
Хит-парад возражений 
1. Linq генерирует неэффективные SQL запросы 
2. Нельзя написать hint 
3. Медленный маппинг 
4. Медленная генерация SQL 
5. Хранимые процедуры работаю быстрее
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. JOININDEX 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 
@gandjustas 
https://www.facebook.com/gandjustas 
stanislav.v@outlook.com

Weitere ähnliche Inhalte

Was ist angesagt?

Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоCodeFest
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаPython Meetup
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех Minsk Linux User Group
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)Ontico
 
Fabric для управления серверами
Fabric для управления серверамиFabric для управления серверами
Fabric для управления серверамиMaxim Kulsha
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть IIPython Meetup
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Badoo Development
 
Вячеслав Бахмутов
Вячеслав БахмутовВячеслав Бахмутов
Вячеслав БахмутовCodeFest
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Ontico
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)Ontico
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonMaxim Kulsha
 
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)Ilyas Salikhov
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 

Was ist angesagt? (20)

Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проекта
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Fabric для управления серверами
Fabric для управления серверамиFabric для управления серверами
Fabric для управления серверами
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
 
Вячеслав Бахмутов
Вячеслав БахмутовВячеслав Бахмутов
Вячеслав Бахмутов
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 

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

ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитикиИлья Середа
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Ontico
 
Meet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander KaigorodovMeet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander KaigorodovAmasty
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтендViacheslav Slinko
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Ontico
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsqlAnatoly Popov
 
Fors и big data appliance
Fors и big data applianceFors и big data appliance
Fors и big data applianceCleverDATA
 
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)Dmitry Degtyarev
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Ontico
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipesAlexey Ermakov
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Ontico
 
Практики масштабирования гибкой разработки
Практики масштабирования гибкой разработкиПрактики масштабирования гибкой разработки
Практики масштабирования гибкой разработкиAskhat Urazbaev
 

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

Errors Tracker
Errors TrackerErrors Tracker
Errors Tracker
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Dapper + QueryObject
Dapper + QueryObjectDapper + QueryObject
Dapper + QueryObject
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
 
Sivko
SivkoSivko
Sivko
 
Meet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander KaigorodovMeet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander Kaigorodov
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтенд
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 
Fors и big data appliance
Fors и big data applianceFors и big data appliance
Fors и big data appliance
 
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"
 
Практики масштабирования гибкой разработки
Практики масштабирования гибкой разработкиПрактики масштабирования гибкой разработки
Практики масштабирования гибкой разработки
 

Mehr von Stas Vyschepan

Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...
Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...
Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...Stas Vyschepan
 
Share point 2016 Что нового
Share point 2016 Что новогоShare point 2016 Что нового
Share point 2016 Что новогоStas Vyschepan
 
PowerBI — новые возможности анализа данных в облаке
PowerBI — новые возможности анализа данных в облакеPowerBI — новые возможности анализа данных в облаке
PowerBI — новые возможности анализа данных в облакеStas Vyschepan
 
Разработка веб-приложений с помощью TypeScript
Разработка веб-приложений с помощью TypeScriptРазработка веб-приложений с помощью TypeScript
Разработка веб-приложений с помощью TypeScriptStas Vyschepan
 
Искусство управления SharePoint
Искусство управления SharePointИскусство управления SharePoint
Искусство управления SharePointStas Vyschepan
 
SharePoint Claims Based Auth
SharePoint Claims Based AuthSharePoint Claims Based Auth
SharePoint Claims Based AuthStas Vyschepan
 
SharePoint Code Quality
SharePoint Code QualitySharePoint Code Quality
SharePoint Code QualityStas Vyschepan
 

Mehr von Stas Vyschepan (7)

Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...
Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...
Вычисление бета-коэффициента и ожидаемой ставки доходности капитала в модели ...
 
Share point 2016 Что нового
Share point 2016 Что новогоShare point 2016 Что нового
Share point 2016 Что нового
 
PowerBI — новые возможности анализа данных в облаке
PowerBI — новые возможности анализа данных в облакеPowerBI — новые возможности анализа данных в облаке
PowerBI — новые возможности анализа данных в облаке
 
Разработка веб-приложений с помощью TypeScript
Разработка веб-приложений с помощью TypeScriptРазработка веб-приложений с помощью TypeScript
Разработка веб-приложений с помощью TypeScript
 
Искусство управления SharePoint
Искусство управления SharePointИскусство управления SharePoint
Искусство управления SharePoint
 
SharePoint Claims Based Auth
SharePoint Claims Based AuthSharePoint Claims Based Auth
SharePoint Claims Based Auth
 
SharePoint Code Quality
SharePoint Code QualitySharePoint Code Quality
SharePoint Code Quality
 

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

  • 1. Длинное название не влезло Станислав Выщепан
  • 2. Обо мне • Консультант по архитектуре и разработке бизнес-приложений • 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
  • 3. Почему веб-приложения • 99% бизнес-приложений основано на веб-технологиях • Масштабируемость • Работа в ограниченных ресурсах с высокими требованиям к быстродействию • Соотношения чтениязаписи - 982 в высоко инерактивных приложениях • В 90% случаев узкое место - база данных
  • 4. Почему Linq и Entity Framework • Проверка запросов в момент компиляции • Декомпозиция запросов • Code-first создание базы данных • Интеграция в фреймворк
  • 5. Хит-парад возражений 1. Linq генерирует неэффективные SQL запросы 2. Нельзя написать hint 3. Медленный маппинг 4. Медленная генерация SQL 5. Хранимые процедуры работаю быстрее
  • 6. Linq генерирует неэффективные SQL запросы • Неэффективные SQL-запросы генерируют люди, а не Linq • Основная причина – непонимание разницы в семантике • Есть ошибки и унаследованные проблемы в генераторе SQL • Мало • Легко обойти
  • 7. 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); } }
  • 8. Нельзя написать Hint • Зачем писать Hint? 1. NOLOCK • Использовать уровни изоляции • Использовать RCSI (включено по умолчанию для code-first) 2. JOININDEX HIHT • Сделать хорошие индексы, обновить статистику • Использовать plan_guide
  • 9. Медленное ВСЕ • Протестируем… • Маппинг – меньше миллисекуны на объект • Генерация запроса - миллисекунды
  • 10. Хранимые процедуры работаю быстрее • Неправда! • В .NET используется sp_executesql для выполнения параметризованных команд • Параметризованные планы кешируются
  • 11. 8 простых советов для повышения производительности приложения
  • 12. №0 Отключить Lazy Load … и никогда не включать его
  • 13. №1 Делать проекции • Меньше данных • Меньше чтений страниц • В случае blob и overflow полей • Больше возможности построить покрывающий индекс • Объекты не добавляются в контекст • Таки делать проекции!
  • 14. №2 Ограничивать выборку • Никогда не тянуть все записи • Использовать разбиение по страницам • Entity Framework Profiler показывает такие места
  • 15. №3 Использовать асинхронные запросы • Существующий синхронный код легко мигрировать • async в методах • .ToListAsync() в запросах • .SaveChangesAsync() для сохранения • await для методов • Снижает скорость! • Но увеличивает масштабируемость
  • 16. №4 Не использовать функции и выражения в предикатах и соединениях • Функция в предикате ломает оптимизатор • В .NET легко сгенерировать функцию в запросе • Особенно для типа DateTime • Проверяйте запросы, которые идут в базу
  • 17. №5 Не держать открытым IEnumerator больше, чем надо для получения данных • Пока открыт IEnumerator – открыт DataReader • Пока открыт DataReader – удерживаются ресурсы запроса • А если уровень изоляции Repeatable Read и выше, то и блокировки • Всегда делать .ToListAsync() перед обходи результатов • Не отдавать IQueryable<T> в генерацию View
  • 18. №6 Использовать mapped функции там, где Linq не хватает • Основные кандидаты: • RANKING FUNCTIONS • Full Text Search
  • 19. №7 Не более одного контекста на запрос • Использовать IoC – контейнеры
  • 20. Заключение • Основные причины медленных запросов – программисты • Учить, а не ограждать • Скоро будет курс по оптимизации ASP.NET приложений «от и до» • Следите за анонсами на Facebook - https://www.facebook.com/groups/144858492215825/
  • 21. Вопросы? Станислав Выщепан http://gandjustas.blogspot.com @gandjustas https://www.facebook.com/gandjustas stanislav.v@outlook.com