НАБОР NOCOUNT НА использовании

Это - некоторый быстрый и грязный код, который я использовал в Отделении 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;
    }
}
320
задан 15 revs, 3 users 96% 23 May 2017 в 01:47
поделиться

4 ответа

Хорошо, теперь я провел свое исследование, вот сделка:

В протоколе 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 /

230
ответ дан 23 November 2019 в 00:59
поделиться

Я думаю, в некоторой степени это DBA vs. проблема разработчика.

Как разработчик, я бы посоветовал не использовать его, если в этом нет крайней необходимости - потому что его использование может нарушить ваш код ADO.NET (как задокументировано Microsoft).

И я думаю, как администратор баз данных, вы были бы в большей степени на другой стороне - используйте его, когда это возможно, если вы действительно не должны предотвращать его использование.

Кроме того, если ваши разработчики когда-либо использовали "RecordsAffected", возвращаемый ADO .

33
ответ дан 23 November 2019 в 00:59
поделиться

Что касается триггеров, нарушающих работу NHibernate, я имел этот опыт из первых рук. По сути, когда NH выполняет ОБНОВЛЕНИЕ, он ожидает, что будет затронуто определенное количество строк. Добавив SET NOCOUNT ON к триггерам, вы вернете количество строк к ожидаемому NH, тем самым решив проблему. Так что да, я бы определенно рекомендовал отключить его для триггеров, если вы используете NH.

Что касается использования SP, это вопрос личных предпочтений. Я всегда отключал подсчет строк, но опять же, в любом случае нет серьезных аргументов.

С другой стороны, вам действительно стоит подумать о том, чтобы отказаться от архитектуры на основе SP, тогда у вас даже не будет этого вопрос.

5
ответ дан 23 November 2019 в 00:59
поделиться

Если вы говоря, что у вас могут быть разные клиенты, с классическим ADO возникают проблемы, если SET NOCOUNT не установлен в ON.

Я регулярно сталкиваюсь с одной проблемой: если хранимая процедура выполняет несколько операторов (и, таким образом, возвращается количество сообщений «xxx затронутых строк»), ADO, похоже, не справляется с этим и выдает ошибку. «Невозможно изменить Свойство ActiveConnection объекта Recordset, источником которого является объект Command »

Поэтому я обычно рекомендую установить его в положение ON, если нет действительно действительно веской причины не делать этого. Возможно, вы нашли действительно действительно вескую причину, по которой мне нужно пойти и прочитать больше.

ADO, похоже, не справляется с этим и выдает ошибку «Невозможно изменить свойство ActiveConnection объекта Recordset, источником которого является объект Command»

Поэтому я обычно рекомендую включить его, если действительно не действительно веская причина не делать этого. Возможно, вы нашли действительно действительно вескую причину, по которой мне нужно пойти и прочитать больше.

Кажется, что ADO не справляется с этим и выдает ошибку «Невозможно изменить свойство ActiveConnection объекта Recordset, источником которого является объект Command»

Поэтому я обычно рекомендую включить его, если действительно не действительно веская причина не делать этого. Возможно, вы нашли действительно действительно вескую причину, по которой мне нужно пойти и прочитать больше.

11
ответ дан 23 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: