T-SQL 1=1 хит производительности

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

Это полезно, поскольку означает, что вы можете передавать ссылки на объект, не беспокоясь о том, что кто-то другой изменит его содержимое. Особенно при работе с параллелизмом не возникает проблем с блокировкой объектов, которые никогда не меняются

, например

class Foo
{
     private final String myvar;

     public Foo(final String initialValue)
     {
         this.myvar = initialValue;
     }

     public String getValue()
     {
         return this.myvar;
     }
}

Foo не нужно беспокоиться о том, что вызывающий абонент getValue() может изменить текст в строке.

Если вы представляете класс, подобный Foo, но с StringBuilder, а не String в качестве члена, вы можете видеть, что вызывающая сторона к getValue() сможет изменить атрибут StringBuilder Foo экземпляра.

Также остерегайтесь различных видов неизменности, которые вы можете найти: Эрик Липперт написал статью в блоге об этом. По сути, у вас могут быть объекты, чей интерфейс является неизменным, но за кулисами фактически изменяемое частное состояние (и, следовательно, его нельзя безопасно разделить между потоками).

18
задан Adrian Godong 26 June 2009 в 15:00
поделиться

7 ответов

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

11
ответ дан 30 November 2019 в 07:18
поделиться

Это не влияет на производительность, но там текст SQL выглядит так, как будто он был искажен атакой SQL-инъекции. Уловка «1 = 1» встречается во многих атаках на основе SQL-инъекций. Вы просто рискуете, что кто-нибудь из ваших клиентов когда-нибудь развернет «черный ящик», который отслеживает трафик SQL, и вы обнаружите, что ваше приложение помечено как «взломанное». Также анализаторы исходного кода могут отметить это. Конечно, это долгий путь, но кое-что стоит поставить на карту.

3
ответ дан 30 November 2019 в 07:18
поделиться

Нет никакой разницы, поскольку они вычисляли константы и оптимизировались. Я использую как 1 = 1, так и 0 = 1 в списках И И ИЛИ , созданных вручную и сгенерированных кодом, и это не имеет никакого эффекта.

2
ответ дан 30 November 2019 в 07:18
поделиться

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

Альтернативой для достижения легкости комментирования является реструктуризация вашего запроса:

 ВЫБРАТЬ ...
ИЗ таблицы t
ГДЕ 
 t. [column1] = @ param1 И
 t. [column2] = @ param2 И
 t. [column3] = @ param3

Затем вы можете добавить / удалить / закомментировать строки в условиях where, и SQL по-прежнему будет действительным.

2
ответ дан 30 November 2019 в 07:18
поделиться

Нет, SQL Server достаточно умен, чтобы исключить это условие из плана выполнения, поскольку оно всегда ИСТИНА .

То же самое верно для Oracle, MySQL и PostgreSQL.

17
ответ дан 30 November 2019 в 07:18
поделиться

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

1
ответ дан 30 November 2019 в 07:18
поделиться

No performance hit. Even if your WHERE clause is loaded with a large number of comparisons, this is tiny.

Best case scenario is that it's a bit-for-bit comparison. Worse case is that the digits are evaluated as integers.

1
ответ дан 30 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

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