мне нужно подтверждение/объяснение от вас плюсов/гуру со следующим, потому что моя команда говорит мне «не имеет значения», и это fustrating меня :)производительность SQL, .Net Оптимизация против Best Practices
фона : У нас есть SQL Server 2008, который используется нашим основным веб-приложением MVC3 /. Net4. У нас около 200 + одновременных пользователей в любой момент. Сервер сильно ударяется (блокировки, тайм-ауты, общая медлительность), и я пытаюсь применить вещи, которые я узнал на протяжении своей карьеры и в моем последнем классе сертификации MS. Это вещи, которые мы все пробурили («закрыть SQL-соединения STAT»), и я пытаюсь объяснить моей команде, что эти «мелочи», хотя и не одни, вносят свой вклад, добавляются в конце.
мне нужно знать, если следующий имеют влияние на производительность или, если это просто «лучшая практика»
1. Использование «ИСПОЛЬЗОВАНИЕ» ключевое слово Большая часть их кода, как это:.
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
Хотя я пытаюсь сказать им, что USING закрывает/освобождает ресурсы быстрее:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
Их аргумент состоит в том, что GC делает достаточно хорошую очистку работы после выполнения кода, поэтому ИСПОЛЬЗОВАНИЕ не оказывает большого влияния. Правда или ложь и почему?
2. Пулы соединения
Я всегда слышал создание пулов соединений может значительно ускорить любой веб-сайт (по крайней мере .Net ж/MSSQL). я рекомендовал добавить следующее нашим ConnectionStrings в web.config:
... "Аккумулирование = True; Min Pool Size = 3; Максимальный размер пула = 100; Соединение Timeout = 10;". ..
Их аргумент состоит в том, что .Net/MSSQL уже устанавливает пулы соединений за кулисами и не обязательно вводить наш web.config. Правда или ложь? Почему каждый другой сайт говорит, что объединение должно быть добавлено для оптимальной производительности, если оно уже настроено?
3. Минимизация # вызовов к БДУ
Провайдеру Роли/членства, который поставляется с по умолчанию проекта .Net MVC это хорошо - это удобно и делает большинство беготни для вас. Но эти ребята серьезно используют UsersInRoles()
и используют его свободно, как глобальную переменную (она попадает в БД каждый раз, когда вызывается этот метод). Я создал «пользовательский объект», который загружает все роли вверх по каждой странице (вместе с некоторыми другими пользовательскими элементами, такими как GUID и т. Д.), А затем запрашивает этот объект, если у пользователя есть роль.
Другие части веб-сайта имеют операторы FOR, которые охватывают более 200 раз и выполняют 20-30 запросов на каждый проход = более 4000 запросов к базе данных. Это как-то делает это за считанные секунды, но то, что я хочу сделать, - это объединение вызовов 20-30 БД в один, так что он делает ОДИН вызов 200 раз (каждый цикл). Но поскольку SQL-профайлер говорит, что запрос занял «0 секунд», это аргумент: он настолько быстр и мал, что серверы могут обрабатывать большое количество запросов БД.
Мое мышление: «Да, эти запросы работают быстро, но они убивают общую производительность SQL-сервера». Это может быть фактором? Я не беспокоюсь ни о чем, или это (существенный) фактор, способствующий общим проблемам производительности сервера?
4. Другие оптимизации кода
Первое, что приходит на ум использует StringBuilder
против простой переменной строки. Я понимаю, почему я должен использовать StringBuilder
(особенно в циклах), но они говорят, что это не имеет значения - даже если им нужно писать строки 10k +, их аргумент в том, что прирост производительности не имеет значения.
Итак, все, что мы узнаем и пробудили в нас («свести к минимуму объем!»), Просто «лучшая практика» без реального выигрыша в производительности или все они способствуют РЕАЛЬНОЙ/измеримой производительности потеря?
EDIT *** Спасибо, ребята за все ваши ответы! У меня есть новый (5-й) вопрос, основанный на ваших ответах: Они на самом деле не используют «ИСПОЛЬЗОВАНИЕ», так что это значит? Если соединение пулов происходит автоматически, связывает ли он соединения из пула, пока не появится GC? Возможно ли, что каждое открытое соединение с сервером SQL добавляет немного больше нагрузки на сервер и замедляет его?
Основываясь на ваших предложениях, я планирую провести серьезный бенчмаркинг/протоколирование времени подключения, потому что я подозреваю, что a) сервер работает медленно, b) они не закрывают соединения и c) Профайлер говорит, что он работает в 0 секунд, медленность может возникать из соединения.
Я очень ценю вашу помощь. Еще раз спасибо
Не сказать, что исследование не имеет значения, но гуру на SO действительно предоставляют много понимания ... изучение того, что они говорят, очень много исследований –
@ JakeWilson801 Документация от MS не всегда является лучшим источником. (Редактирование: или даже хороший источник) –
Re, используя строковый построитель вместо строк объединения - если вы объединяете строки один раз (т.е. 'var s =" a "+" b "'), тогда строка будет более эффективной, что вам нужно помнить, однако, что экземпляр строки не изменен, поэтому в цикле, например, 'string s =" a "; for (int i = 1, i <1000; i ++) {s + = "a";} 'вы создаете новый экземпляр строки для каждого цикла, это повлияет на распределение памяти и повлияет на общую производительность (независимо от того, будет зависеть от количества конкатенаций). – GarethD