Критерии Фильтра SQL в критериях соединения или где пункт, который более эффективен

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

Однако существует лучший способ записать Ваш круглый метод:

public int round(RoundingMode roundingMode) {
  switch (roundingMode) {
    case HALF_UP:
       //do something
       break;
    case HALF_EVEN:
       //do something
       break;
    // etc
  }
}

даже лучше способ сделать это должно поместить функциональность в самом перечислении, таким образом, Вы могли просто звонить roundingMode.round(someValue). Это добирается до сути перечислений Java - они объектно-ориентированы перечисления, в отличие от "именованных значений", найденных в другом месте.

РЕДАКТИРОВАНИЕ: спецификация не очень ясна, но раздел 8.9 состояния:

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

27
задан Gratzy 9 September 2009 в 20:40
поделиться

6 ответов

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

Я всегда буду использовать случай №2 - почему? Потому что, на мой взгляд, вы должны помещать только фактические критерии, которые устанавливают JOIN между двумя таблицами, в предложение JOIN - все остальное должно быть в предложении WHERE.

Просто вопрос сохранения вещей в чистоте и размещения вещей там, где они принадлежат, IMO.

Очевидно, есть случаи с ЛЕВЫМИ ВНЕШНИМИ СОЕДИНЕНИЯми, где размещение критериев действительно имеет значение с точки зрения того, какие результаты будут возвращены - эти случаи, конечно, будут исключены из моей рекомендации.

Марк

]
28
ответ дан 28 November 2019 в 05:32
поделиться

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

Однако в соответствии с этим MVP SQL Server они семантически одинаковы под капотом:

http://www.eggheadcafe.com/conversation.aspx?messageid=29145383&threadid=29145379

3
ответ дан 28 November 2019 в 05:32
поделиться

Я не думаю, что вы найдете окончательный ответ на этот вопрос, который применим ко всем случаям. Эти 2 не всегда взаимозаменяемы - поскольку для некоторых запросов (некоторые левые соединения) вы получите разные результаты, поместив критерии в строку WHERE vs FROM.

В вашем случае вам следует оценить оба этих запроса. В SSMS вы можете просмотреть предполагаемый и фактический планы выполнения обоих этих запросов - это было бы хорошим первым шагом в определении того, какой из них более оптимальный. Вы также можете просматривать время и количество операций ввода-вывода для каждого (установить время статистики, установить статистику io) - и это также даст вам информацию для принятия решения.

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

Попробуйте это, чтобы увидеть разницу между 2 ...

SET STATISTICS IO ON
SET STATISTICS TIME ON

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid =sales.salesmanid
       and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid = sales.salesmanid 
where  sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

SET STATISTICS TIME OFF
SET STATISTICS IO OFF
1
ответ дан 28 November 2019 в 05:32
поделиться

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

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

0
ответ дан 28 November 2019 в 05:32
поделиться

Ознакомьтесь с расчетным планом выполнения в управлении SQL Студия !! Как уже говорили другие, вы во власти анализатора, что бы вы ни делали, поэтому доверяйте его оценкам. Я предполагаю, что те двое, которые вы предоставили, составят один и тот же план.

Если это попытка изменить культуру разработки, выберите тот, который дает вам лучший план; для тех, которые идентичны, следуйте культуре

. Я прокомментировал это в других сообщениях о «эффективности», подобных этому (он и искренний, и саркастический) - если здесь ваши узкие места, то дайте пять вам и ваша команда.

0
ответ дан 28 November 2019 в 05:32
поделиться

Neither is more efficient, using the WHERE method is considered the old way to do so (http://msdn.microsoft.com/en-us/library/ms190014.aspx). YOu can look at the execution plan and see they do the same thing.

0
ответ дан 28 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

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