как оптимизировать этот запрос? - PullRequest
1 голос
/ 21 марта 2010

Запрос:

select employee_id
       , last_name
       , salary
       , round((salary+(salary*0.15)), 0) as  "NewSalary"
       , (round((salary+(salary*0.15)), 0) - salary) as “IncreaseAmount” 
from employees;

Могу ли я в любом случае оптимизировать эту round((salary+(salary*0.15)), 0) часть, чтобы она не появлялась дважды? Я попытался дать ему псевдоним, но не сработало: (

Ответы [ 4 ]

7 голосов
/ 21 марта 2010

Чтобы выполнить расчет один раз, сделайте следующее:

SELECT employee_id, 
       last_name, 
       salary, 
       NewSalary, 
       (NewSalary - salary) as “IncreaseAmount” 
FROM (Select employee_id,
             last_name,
             salary,
             round(salary*1.15, 0) as NewSalary
      FROM employees)

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

1 голос
/ 21 марта 2010

Лучшая оптимизация - просто удалить IncreaseAmount из запроса.

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

1 голос
/ 21 марта 2010

Вы пробовали КРУГЛЫЙ (зарплата * 1,15)?

0 голосов
/ 21 марта 2010

Нельзя использовать псевдонимы столбцов на одном уровне.

Использование подзапроса, как предполагает Ник Крейвер, принесет свой штраф (время выполнения в конечном итоге будет сопоставимым, поэтому оптимизация сомнительна).

Создание представления с вычисленными столбцами может немного его оптимизировать, но не существенно (опять же, сопоставимые времена).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...