如何优化此查询?

时间:2010-03-21 10:59:38

标签: sql oracle oracle10g

查询是:

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 个答案:

答案 0 :(得分:7)

要进行一次计算,请执行以下操作:

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 :(得分:1)

您是否尝试过ROUND(薪水* 1.15)?

答案 2 :(得分:1)

最佳优化只是从查询中删除IncreaseAmount

您无需从数据库查询中返回新旧薪水之间的差异,如果需要,可以轻松计算。在查询中进行计算只意味着即使不需要也可以进行计算,并且查询结果会比查询结果大。

答案 3 :(得分:0)

您不能在同一级别使用列别名。

使用子查询作为尼克克拉弗建议将带来自己的惩罚(执行时间最终可比较,所以优化是有问题的。)

使用计算列进行查看可能会对其进行一些优化,但不会大幅度优化(再次可比较)。

如果(select)性能非常重要,那么你必须对其进行非规范化并将新薪水写入某处,然后通过触发器或应用程序逻辑层维护完整性。