Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
Всем привет! Сделал сайт на ASP MVC + MS SQL + EF6 (DB first подход). Все работает, но скорость не айс, смотрю чтобы оптимизировать... спецы подскажите пж. Однозначно кривое решение: Основная таблица - записи. Есть Поле просмотры. При входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были) Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры": ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут. Может апдейт делать через такую схему: var obj = new Article { ArticleId = 1 }; context.Articles.Attach(obj); obj.Title = "123"; context.SaveChanges(); чтобы без процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 10:42 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
Sputnick, общий принцип высокой производительности веб-приложений 1. кеширование страниц (результатов действий контроллеров) на клиенте 2. кеширование страниц (результатов действий контроллеров) на сервере 3. кеширование данных на сервере (получаемых из БД) 4. кеширование инфрастуктуры 5. чё там по оптимизации ASP.NET MVC / MS SQL ) и ещё. «скорость не айс» лучше подтверждать какими-то данными, типа средняя скорость загрузки разных страниц, где больше работы с БД и где меньше. тогда можно будет профилировать и смотреть где затык. также, если сервак дохлый и/или памяти мало, то тут ничего уже не поделаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 12:30 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
hVosttSputnick, общий принцип высокой производительности веб-приложений 1. кеширование страниц (результатов действий контроллеров) на клиенте 2. кеширование страниц (результатов действий контроллеров) на сервере 3. кеширование данных на сервере (получаемых из БД) 4. кеширование инфрастуктуры 5. чё там по оптимизации ASP.NET MVC / MS SQL ) и ещё. «скорость не айс» лучше подтверждать какими-то данными, типа средняя скорость загрузки разных страниц, где больше работы с БД и где меньше. тогда можно будет профилировать и смотреть где затык. также, если сервак дохлый и/или памяти мало, то тут ничего уже не поделаешь.Ты забыл в начале тестирование и мониторинг :) Например SQL Server Activity Monitor может показать тяжёлые запросы и предложить создать индексы. И этого будет достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 13:30 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
SputnickВсем привет! Сделал сайт на ASP MVC + MS SQL + EF6 (DB first подход). Все работает, но скорость не айс, смотрю чтобы оптимизировать... спецы подскажите пж. Однозначно кривое решение: Основная таблица - записи. Есть Поле просмотры. При входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были) Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры": ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут. Может апдейт делать через такую схему: var obj = new Article { ArticleId = 1 }; context.Articles.Attach(obj); obj.Title = "123"; context.SaveChanges(); чтобы без процедуры.расставьте вопросительные знаки по своему вкусу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 13:32 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
SputnickПри входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были) Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры": ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут.Ни фига не понял. " При входе в запись идет выборка значений с табл "записи" " - это что значит? Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи? Плюс выполняется UPDATE одной строки по этому же идентификатору? ИМХО можно это в хранимку занести. Приведите структуру таблицы "записи" и конкретные выполняемые запросы. Какие индексы на таблице созданы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 13:36 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
hVosttSputnick, общий принцип высокой производительности веб-приложений 1. кеширование страниц (результатов действий контроллеров) на клиенте 2. кеширование страниц (результатов действий контроллеров) на сервере 3. кеширование данных на сервере (получаемых из БД) 4. кеширование инфрастуктуры 5. чё там по оптимизации ASP.NET MVC / MS SQL ) и ещё. «скорость не айс» лучше подтверждать какими-то данными, типа средняя скорость загрузки разных страниц, где больше работы с БД и где меньше. тогда можно будет профилировать и смотреть где затык. также, если сервак дохлый и/или памяти мало, то тут ничего уже не поделаешь. ------------- 1, 2. Это делаю - [OutputCache(Duration = 360, Location = System.Web.UI.OutputCacheLocation.ServerAndClient)] и для дочерних [OutputCache(Duration = 280)] 3. Ты имеешь в виду когда результат запроса сохраняется в контексте, а потом - context.Orders.Find(id); ? Если нет можно этот момент пж подробней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2015, 15:33 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
skyANASputnickПри входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были) Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры": ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут.Ни фига не понял. " При входе в запись идет выборка значений с табл "записи" " - это что значит? Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи? Плюс выполняется UPDATE одной строки по этому же идентификатору? ИМХО можно это в хранимку занести. Приведите структуру таблицы "записи" и конкретные выполняемые запросы. Какие индексы на таблице созданы? Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи? Плюс выполняется UPDATE одной строки по этому же идентификатору? -- да. Таблица "записи" Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. таблица СЕО Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Выборка одиночной записи + апдейт кол-ва просмотров (поле [Views]): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. процедура: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ---- думаю нужно для поля [DateTimePublish] datetime NOT NULL, индекс тоже сделать, так как в архиве по дате выборка идет очень долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2015, 15:47 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
Sputnick3. Ты имеешь в виду когда результат запроса сохраняется в контексте, а потом - context.Orders.Find(id); ? Если нет можно этот момент пж подробней. нет, за пределами контекста, в своём кеширующем блоке. например, достаёшь много данных, чтобы сформировать сложную структурную модель и кешируешь её в своём сервисе, чтобы не лазить в БД каждый раз, и продумываешь механизм для инвалидации данных в кеше при их изменений, чтобы всегда получать актуальные данные. некоторые данные можно полностью кешировать: часто используемые справочники, таблица пользователей и прав, и другие таблицы, к которым идёт частое обращение, и там данных относительно немного. только требуется качественный механизм инвалидации, иначе начнутся проблемы с рассинхроном. также надо учитывать объёмы доступной памяти, которую можно эксплуатировать. возможен вынос кеша в оперативную БД на стороне сервера приложений, тут всё зависит от самих данных и требований к нагрузкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 06:14 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
я мож с утра подтупливаю, но скорость чего не айс? внесения изменения? или хождение по сайту? тут разговоры пошли о кеше и все дела но блин ТС ты профилировал сайт чем либо ? или бездумно воткнул кеш на авойсь прокатит? хоть какая то статистика есть? все что хвост говорит правильно, я не спорю, но опять ж я не понял из прочитанного нагрузки на приложение, мож там 10 человек + кеш и все тормозит тогда я больше склоняюсь к тому что кривое сделано, а может у тс там десятки тысяч людей, а мы тут играем в гадалку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 09:27 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
Sputnick3. Ты имеешь в виду когда результат запроса сохраняется в контексте, а потом - context.Orders.Find(id); ? Если нет можно этот момент пж подробней.Про кэш второго уровня он говорит. У EF6 с этим проблемы, тупо не поддерживает, надо самому пилить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 09:40 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
SputnickskyANAпропущено... Ни фига не понял. " При входе в запись идет выборка значений с табл "записи" " - это что значит? Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи? Плюс выполняется UPDATE одной строки по этому же идентификатору? ИМХО можно это в хранимку занести. Приведите структуру таблицы "записи" и конкретные выполняемые запросы. Какие индексы на таблице созданы? Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи? Плюс выполняется UPDATE одной строки по этому же идентификатору? -- да. Таблица "записи" Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Таблица СЕО Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Выборка одиночной записи + апдейт кол-ва просмотров (поле [Views]): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. процедура: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В запросе JOIN 5 таблиц, индексы на внешние ключи есть? План запроса смотрели? Sputnick---- думаю нужно для поля [DateTimePublish] datetime NOT NULL, индекс тоже сделать, так как в архиве по дате выборка идет очень долго. Тут не гадать надо, а план выполнения смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 09:49 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
skyANAПро кэш второго уровня он говорит. У EF6 с этим проблемы, тупо не поддерживает, надо самому пилить :) неправда! https://www.nuget.org/packages/EntityFramework.Cache ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 10:05 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
hVosttskyANAПро кэш второго уровня он говорит. У EF6 с этим проблемы, тупо не поддерживает, надо самому пилить :) неправда! https://www.nuget.org/packages/EntityFramework.Cache Какой-то moozzyk запилил типа Second Level Cache for Entity... Выложил в NuGet больше года назад, обновлений с тех пор не было. И ты предлагаешь этим пользоваться в продакшн? ИМХО лучше самостоятельно запилить под свои нужды, оттестировать, счётчики навесить и знать как оно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 10:10 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
skyANAИ ты предлагаешь этим пользоваться в продакшн? ИМХО лучше самостоятельно запилить под свои нужды, оттестировать, счётчики навесить и знать как оно работает. я не предлагаю пользоваться этим в продакшене, по крайне мере без изучения исходников, которые имеются в наличии: https://efcache.codeplex.com/ я утверждаю, что поддержка 2LC есть, но нет собственной реализации, а это скорее плюс, чем минус. так неизвестно, какое именно кеширование нужно именно тебе, а для всех не угадаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 10:13 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
hVosttskyANAИ ты предлагаешь этим пользоваться в продакшн? ИМХО лучше самостоятельно запилить под свои нужды, оттестировать, счётчики навесить и знать как оно работает. я не предлагаю пользоваться этим в продакшене, по крайне мере без изучения исходников, которые имеются в наличии: https://efcache.codeplex.com/ я утверждаю, что поддержка 2LC есть, но нет собственной реализации, а это скорее плюс, чем минус. так неизвестно, какое именно кеширование нужно именно тебе, а для всех не угадаешь.Вот это и называется: не поддерживает. Output Cache в ASP.NET можно тупо заюзать, а можно реализовать свой CustomCacheProvider. Подобный подход и в NHibernate: Chapter 25. NHibernate.Caches . А в EF этого нет. А то что поверх можно навернуть, так это понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 14:52 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
hVostt, ты кстати сам-то код https://efcache.codeplex.com/ смотрел? Что-то ничего кроме InMemory кэша я там не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 14:58 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
skyANAА в EF этого нет. А то что поверх можно навернуть, так это понятно. ну точка есть, куда можно кеш воткнуть и ладно :) в хибере просто есть дополнительная инфраструктура, типа реализуешь провайдер и всё такое. кстати, по опыту, проекты на хибере реал сложнее в разработке и поддержке, чем на EF, при чём ощутимо. это связано с тем, что хибер слишком дофига сложный — да, умеет больше, чем EF, но из-за этого все порой покрывается слоем из граблей. самое важное отличие, наверное, это что EF это чистый UOW, а хибер -- вообще ни разу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 18:44 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
skyANAhVostt, ты кстати сам-то код https://efcache.codeplex.com/ смотрел? Что-то ничего кроме InMemory кэша я там не увидел. ну простецки же всё :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 18:44 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
hVosttskyANAА в EF этого нет. А то что поверх можно навернуть, так это понятно. ну точка есть, куда можно кеш воткнуть и ладно :) в хибере просто есть дополнительная инфраструктура, типа реализуешь провайдер и всё такое. кстати, по опыту, проекты на хибере реал сложнее в разработке и поддержке, чем на EF, при чём ощутимо. это связано с тем, что хибер слишком дофига сложный — да, умеет больше, чем EF, но из-за этого все порой покрывается слоем из граблей. самое важное отличие, наверное, это что EF это чистый UOW, а хибер -- вообще ни разу.Честно, с хибером никаких граблей не испытываю. Вообще на Dapper надо переходить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 19:02 |
|
||
|
Оптимизация ASP MVC сайта (структура БД)
|
|||
|---|---|---|---|
|
#18+
skyANAЧестно, с хибером никаких граблей не испытываю. а я испытываю. лично меня бесит (в порядки убывания): 1. отвратительная поддержка LINQ (сложные подзапросы с аггрегациями? параметризованные подзапросы? досвидания) 2. сложный многобуквенный маппинг, либо костыль-нашлёпка 3. отсутствие асинка (мы проводили опыт не небольшом проекте, перевели с гибера на EF + async и на массированных селениум-тестах получили увеличение производительности на 20-30%) т.е. мои любимые проекции с хибером часто тупо пролетают. поэтому не рекомендую никому. по сути я с ним имею дело только на проектах, которые не я начинал, и которые висят на поддержке. хотя сам по себе хибер очень даже позволяет делать мощные и сложные ПО, только надо быть аккуратней и отказаться от некоторых прелестей EF. skyANAВообще на Dapper надо переходить :) мне пока не встречалось таких задач, где даппер был бы в тему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 19:20 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=39072332&tid=1356198]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 352ms |

| 0 / 0 |
