Для многих СУБД нам нужно повторить формулу / выражение в предложении where, т.е.
SELECT table_id, radians( 25 ) AS rad
FROM test_table
WHERE radians( 25 ) < 5
ORDER BY radians( 25 ) ASC
Однако в этом случае, поскольку вычисляемый столбец является константой, сам запрос не имеет особого смысла. Возможно, отсутствовала часть, например, в радианах (25 * myColumn) или что-то в этом роде?
Редактировать (следующая информация об истинной природе формулы и т. Д.)
Вы, кажется, разочарованы, потому что формула должна быть повторена ... Несколько комментариев по этому поводу:
Тот факт, что формула должна быть явно * прописана, а не псевдоним , может сделать запрос менее читабельным, менее удобным для написания и т. Д. (Подробнее об этом ниже), но чем больше Важным фактором, который следует учитывать , является то, что формула, используемая в предложении WHERE, заставляет СУБД рассчитать это значение для потенциально всех записей в базовой таблице !!!
Это в свою очередь снижает производительность несколькими способами:
- SQL может не иметь возможности использовать некоторые индексы, и вместо этого придется сканировать таблицу (или ее части)
- если формула тяжелая, это одновременно и медленный ответ, и менее масштабируемый сервер
Ситуация не так плоха, если дополнительные предикаты в предложении WHERE позволяют SQL отфильтровывать [значительное количество] записей, которые в противном случае были бы обработаны. Такие дополнительные критерии поиска могут определяться приложением (например, в дополнение к этому условию для радианта, [несвязанная] высота местоположения должна быть ниже 6000 футов), или такие критерии могут быть добавлены «искусственно», чтобы помочь с запрос (например, вы можете знать о грубой эвристике, которая недостаточна для вычисления значения «радиан» с приемлемой точностью, но может быть достаточно хорошей, чтобы отфильтровывать 70% записей, сохраняя только те из них, которые имеют шанс удовлетворяющий точному диапазону, требуемому для «радиана».
Теперь несколько трюков, касающихся самой формулы, в попытке сделать ее быстрее:
- помните, что вам может не потребоваться выполнить 100% формулы учебника.
Я не уверен, какая часть математики большого круга имеет отношение к этому вычислению радиана, но говоря в общих терминах, некоторые формулы включают в себя дорогой шаг, такой как извлечение квадратного корня, вызов функции триггера и т. Д. В некоторых случаях может быть возможно упростить формулу (которую необходимо выполнить для многих записей / значений), применив шаг reverse к другой стороне предиката (который, как правило, нужно оценивать только один раз ). Например, если, скажем, предикат условия поиска равен "WHERE SQRT((x1-x2)^2 + (y1-y2)^2) > 5"
. Так как вычисление расстояния включает в себя поиск квадратного корня (из суммы квадратов разностей), можно решить удалить квадратный корень и вместо этого сравнить результаты этой модифицированной формулы с квадратом значения расстояния по вертикали, то есть "WHERE ((x1-x2)^2 + (y1-y2)^2) > (5^2)"
- В зависимости от вашей системы SQL / СУБД, может оказаться возможным реализовать формулу в определенной пользователем функции, что сделает ее более эффективной (поскольку «предварительно скомпилировано», может быть написано на лучшем языке и т. Д.) и короче, чтобы ссылаться, в самом запросе SQL (событие, хотя это потребовало бы быть перечисленным дважды, как сказано)
- В зависимости от ситуации, также может быть возможно изменить схему базы данных и базовое приложение, чтобы иметь формулу (или ее части), но предварительно вычислить и проиндексировать, сохранив СУБД это длинное разрешение на основе функции предиката .