Это - некоторый быстрый и грязный код, который я использовал в Отделении TopCoder SRM 160 2.
т = вершина
b = нижняя часть
л = уехал
r = право
public class Rect
{
public int t, b, l, r;
public Rect(int _l, int _b, int _r, int _t)
{
t = _t;
b = _b;
l = _l;
r = _r;
}
public bool Intersects(Rect R)
{
return !(l > R.r || R.l > r || R.b > t || b > R.t);
}
public Rect Intersection(Rect R)
{
if(!this.Intersects(R))
return new Rect(0,0,0,0);
int [] horiz = {l, r, R.l, R.r};
Array.Sort(horiz);
int [] vert = {b, t, R.b, R.t};
Array.Sort(vert);
return new Rect(horiz[1], vert[1], horiz[2], vert[2]);
}
public int Area()
{
return (t - b)*(r-l);
}
public override string ToString()
{
return l + " " + b + " " + r + " " + t;
}
}
Хорошо, теперь я провел свое исследование, вот сделка:
В протоколе TDS SET NOCOUNT ON
сохраняет только 9 байтов на запрос в то время как сам текст «SET NOCOUNT ON» занимает колоссальные 14 байтов. Раньше я думал, что 123 затронутых строки
были возвращены с сервера в виде обычного текста в отдельном сетевом пакете, но это не так. Фактически это небольшая структура под названием DONE_IN_PROC
, встроенная в ответ. Это не отдельный сетевой пакет, поэтому никакие обходы не тратятся зря.
Я думаю, что вы можете почти всегда придерживаться поведения подсчета по умолчанию, не беспокоясь о производительности. Однако есть некоторые случаи, когда предварительный расчет количества строк может повлиять на производительность, например, курсор только вперед. В этом случае может потребоваться NOCOUNT. Кроме этого, нет абсолютно никакой необходимости следовать девизу «используйте NOCOUNT везде, где это возможно».
Вот очень подробный анализ незначительности параметра SET NOCOUNT
: http: // daleburnett. com / 2014/01 / everything-ever-wish-know-set-nocount /
Я думаю, в некоторой степени это DBA vs. проблема разработчика.
Как разработчик, я бы посоветовал не использовать его, если в этом нет крайней необходимости - потому что его использование может нарушить ваш код ADO.NET (как задокументировано Microsoft).
И я думаю, как администратор баз данных, вы были бы в большей степени на другой стороне - используйте его, когда это возможно, если вы действительно не должны предотвращать его использование.
Кроме того, если ваши разработчики когда-либо использовали "RecordsAffected", возвращаемый ADO .
Что касается триггеров, нарушающих работу NHibernate, я имел этот опыт из первых рук. По сути, когда NH выполняет ОБНОВЛЕНИЕ, он ожидает, что будет затронуто определенное количество строк. Добавив SET NOCOUNT ON к триггерам, вы вернете количество строк к ожидаемому NH, тем самым решив проблему. Так что да, я бы определенно рекомендовал отключить его для триггеров, если вы используете NH.
Что касается использования SP, это вопрос личных предпочтений. Я всегда отключал подсчет строк, но опять же, в любом случае нет серьезных аргументов.
С другой стороны, вам действительно стоит подумать о том, чтобы отказаться от архитектуры на основе SP, тогда у вас даже не будет этого вопрос.
Если вы говоря, что у вас могут быть разные клиенты, с классическим ADO возникают проблемы, если SET NOCOUNT не установлен в ON.
Я регулярно сталкиваюсь с одной проблемой: если хранимая процедура выполняет несколько операторов (и, таким образом, возвращается количество сообщений «xxx затронутых строк»), ADO, похоже, не справляется с этим и выдает ошибку. «Невозможно изменить Свойство ActiveConnection объекта Recordset, источником которого является объект Command »
Поэтому я обычно рекомендую установить его в положение ON, если нет действительно действительно веской причины не делать этого. Возможно, вы нашли действительно действительно вескую причину, по которой мне нужно пойти и прочитать больше.
ADO, похоже, не справляется с этим и выдает ошибку «Невозможно изменить свойство ActiveConnection объекта Recordset, источником которого является объект Command»Поэтому я обычно рекомендую включить его, если действительно не действительно веская причина не делать этого. Возможно, вы нашли действительно действительно вескую причину, по которой мне нужно пойти и прочитать больше.
Кажется, что ADO не справляется с этим и выдает ошибку «Невозможно изменить свойство ActiveConnection объекта Recordset, источником которого является объект Command»Поэтому я обычно рекомендую включить его, если действительно не действительно веская причина не делать этого. Возможно, вы нашли действительно действительно вескую причину, по которой мне нужно пойти и прочитать больше.