Другой план выполнения при выполнении оператора непосредственно и из хранимой процедуры

Вам нужно куб радиус, а не умножить его на 3. Оператор "*" умножает. Обратите внимание, как он используется для объединения элементов "(4/3)" и "piVal", чьи ссылки в исходной формуле, которую мы пытаемся реализовать, объединяются с использованием умножения (здесь записывается просто как сопоставление, что не очень хорошая запись для компьютерного анализа). В Java нет первоклассного оператора возведения в степень, поэтому вместо этого мощность расширяется до самосумножения с тремя копиями возведенного в степень количества. На самом деле, если "*" возведено в степень, то запрограммированное выражение будет резко, совершенно неверно, возможно, даже ужасно переполнено даже на небольших входах, в зависимости от того, как была установлена ​​связь операции.

Использование «*» для представления умножения является обычным языком в средах ввода, где эти более эффективные или изящные нотации недоступны или могут вводить в заблуждение, например, в простых текстовых сообщениях и в текстовых файлах исходного кода компьютера, таких как исходные файлы Java. Иногда используется также похожая нотация, символ «x», однако возникает проблема, заключающаяся в том, что это буквально буква x, а не отдельный символ, и, следовательно, она неоднозначна с очень часто используемым именем переменной и, таким образом, во многих случаях не годится как символ операции на языке программирования.

Более того, следуя этому, можно было бы подумать, что оператор «^», аналогично используемый в такой записи (как здесь, к сожалению, в переполнении стека отсутствует надлежащая система набора математики на основе LaTeX или подобного, хотя я не помню причин, почему вы, вероятно, можете найти его в Meta), но это действительно относится к битовому XOR в Java. @Tim Biegeleisen предлагает вам использовать Math.pow, однако я думаю, что это может быть менее эффективным с точки зрения скорости, чем два умножения, объединяющие три копии базы. Тем не менее, это не имеет значения в этом приложении, но это может быть в других, и, следовательно, почему вместо этого показана длинная форма. Math.pow действительно избыточен: это реализация того, что в математических терминах можно назвать аналитической функцией возведения в степень , которая представляет собой трансцендентную функцию и обычно реализуется с использованием степенных рядов или другого такого довольно вычислительно-интенсивного процесса. и включает в себя как трансцендентную экспоненциальную, так и логарифмическую операцию, в отличие от всего лишь трех инструкций умножения ЦП, и именно к этому приведенному коду может быть скомпилирован JIT.

6
задан Dustin Laine 8 June 2011 в 16:55
поделиться

1 ответ

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

alter procedure p_myproc (@p1 int) as
declare @p1_copy int;
set @p1_copy = @p1;

И затем используйте @p1_copy в запросе. Кажется смешным, но это работает.

Проверьте мой недавний вопрос по той же теме:

Почему оптимизатор SqlServer становится настолько перепутанным с параметрами?

13
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

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