Мне нужно подтверждение/объяснение от вас профессионалов/гуру со следующим, потому что моя команда говорит мне, что "это не имеет значения", и это разочаровывает меня:)
Фон: У нас есть 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 w/MSSQL). Я рекомендовал добавить следующее к нашим связующим строкам в файле web.config:
... "Pooling = True; Min Pool Size = 3; Max Pool Size = 100; Connection Тайм-аут = 10;"...
Их аргумент состоит в том, что .Net/MSSQL уже настраивает пулы соединений за кулисами и не нужно вставлять в наш web.config. Правда или ложь? Почему каждый другой сайт говорит, что объединение должно быть добавлено для оптимальной производительности, если оно уже настроено?
3. Минимизируйте # вызовов в DB
Поставщик Role/Membership, который поставляется с проектом .Net MVC по умолчанию, хорош - он удобен и делает большую часть работы для вас. Но эти ребята серьезно используют UsersInRoles()
и используют его свободно, как глобальную переменную (она обращается к БД всякий раз, когда вызывается этот метод).
Я создал "пользовательский объект", который загружает все роли upfront на каждой странице (вместе с некоторыми другими пользовательскими элементами, такими как GUID и т.д.), А затем запрашивает этот объект, если у пользователя есть роль.
В других частях веб-сайта есть операторы FOR, которые занимают более 200 раз и выполняют 20-30 запросов на каждом проходе = более 4000 вызовов базы данных. Это как-то делает это за считанные секунды, но то, что я хочу сделать, - это объединение вызовов 20-30 БД в один, так что он делает ОДИН вызов 200 раз (каждый цикл). Но поскольку SQL-профайлер говорит, что запрос занял "0 секунд", они аргументируют это так быстро и мало, что серверы могут обрабатывать такое большое количество запросов БД.
Мое мышление: "Да, эти запросы работают быстро, но они убивают общую производительность SQL-сервера". Может ли это быть фактором? Я не беспокоюсь ни о чем, или это (существенный) фактор, способствующий общим проблемам производительности сервера?
4. Другие оптимизации кода
Первый, который приходит на ум, использует StringBuilder
против простой строковой переменной. Я понимаю, почему я должен использовать StringBuilder
(особенно в циклах), но они говорят, что это не имеет значения - даже если им нужно писать строки 10k +, их аргумент в том, что прирост производительности не имеет значения.
Итак, все в целом, все мы учимся и пробуждаемся в нас ( "минимизируем сферу!" ), просто "лучшая практика" без реального выигрыша в производительности или все они способствуют РЕАЛЬНОЙ/измеримой потере производительности
ИЗМЕНИТЬ *** Спасибо, ребята, за все ваши ответы! У меня есть новый (5-й) вопрос, основанный на ваших ответах: На самом деле они не используют "ИСПОЛЬЗОВАНИЕ", так что это значит? Если соединение пулов происходит автоматически, связывает ли он соединения из пула, пока не появится GC? Возможно ли, что каждое открытое соединение с сервером SQL добавляет немного больше нагрузки на сервер и замедляет его?
Основываясь на ваших предложениях, я планирую провести серьезный бенчмаркинг/протоколирование времени подключения, потому что я подозреваю, что a) сервер работает медленно, b) они не закрывают соединения и c) Профайлер говорит, что он работал за 0 секунд, медленность может исходить из соединения.
Я очень ценю вашу помощь. Чувствительность снова