У меня есть сервер, размещенный в Rackspace, который представляет собой довольно мощную машину (двойное шестнадцатеричное ядро, 48 ГБ ОЗУ), и наша база данных не такая уж большая (100 ГБ или около того). SQL Server 2008 R2 Standard 64-разрядная.
Обычно эта машина работает отлично. Очень небольшая привязка каких-либо ядер ЦП, время ответа на запрос отличное и т. Д.
Тем не менее, я могу убить время отклика этой машины, выполнив запрос «SELECT * FROM RawLead WHERE emailAddress = 'Any@whatever.com';» РЕДАКТИРОВАТЬ: И нет, emailAddress не индексируется. Да, я знаю, что это поможет этому конкретному запросу, но исходная проблема все равно останется - как один запрос может остановить весь сервер.
Когда я это делаю, SQL Server перестает отвечать на любые другие запросы, пока не будет возвращен этот набор результатов.
Я только что попробовал это, и, как вы можете видеть из этого снимка экрана, когда активность диска монитора ресурсов изменилась, ЦП на самом деле не изменился, но сетевой трафик упал практически до нуля.
Есть ли параметр в SQL Server, который может повлиять на это?
Если это большая таблица и нет индексов, вы получите сканирование таблицы. Кроме того, если оптимизатор считает, что стоимость запроса достаточно высока, вы можете увидеть параллельное выполнение. Да, между сканированием таблицы и параллельным выполнением у вас может быть повышенная нагрузка на ЦП. Затем вы можете добавить блокировку, конкуренцию за ресурсы, нескольких пользователей, и все станет только хуже.
Похоже на ожидаемое поведение. Если бы кто-то на самом деле использовал такой ужасно плохой запрос, я бы надеялся, что он, по крайней мере, проявит общую любезность, объединив его с «WITH (NOLOCK)», что аналогично указанию уровня изоляции для чтения без фиксации.