2010-03-21 7 views
1

La requête est:comment optimiser cette requête?

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; 

Puis-je optimiser cette partie round((salary+(salary*0.15)), 0) de toute façon, de sorte qu'il ne semble pas deux fois? J'ai essayé de lui donner un alias, mais n'a pas fonctionné :(

+0

Vous voulez dire: "ne vous répétez pas" - c'est le nom de l'antipattern. – lmsasu

Répondre

7

Pour le calcul une fois, faites ceci:

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) 

Vous ne pouvez pas utiliser un alias comme un voisin dans une sélection, mais vous pouvez alias dans un imbriqué sélectionner et utiliser le résultat de ce point de vue deux fois, mais de façon plus efficace, car il ne fait que le calcul une fois.

1

Avez-vous essayé ROND (salaire * 1,15)?

+0

oh! merci ... mais devrais-je l'utiliser deux fois dans le code .. ce que je veux dire est, puis-je donner un alias et ensuite l'utiliser pour la deuxième fois? – jest

1

la meilleure optimisation serait il suffit de supprimer le IncreaseAmount de la requête

Vous n'avez pas besoin de renvoyer la différence entre l'ancien et le nouveau salaire à partir de la requête de la base de données, elle peut facilement être calculée si nécessaire. Avoir le calcul dans la requête signifie seulement que vous faites le calcul même si ce n'est pas nécessaire, et que le résultat de la requête devient plus grand que ce qu'il doit être.

+0

hmmm..mais il indique combien de $$ ont été augmentés ce qui est significatif, je suppose – jest

+0

@jest: Oui, cela peut être menaçant, mais cela ne signifie pas que la base de données doit faire le calcul. – Guffa

0

Vous ne pouvez pas utiliser d'alias de colonne au même niveau. L'utilisation de la sous-requête comme le suggère Nick Craver entraînera sa propre pénalité (les temps d'exécution finissent par être comparables, donc l'optimisation est discutable).

Faire une vue avec des colonnes calculées pourrait l'optimiser un peu, mais pas sensiblement (encore une fois des temps comparables). Si les performances (select) sont vraiment importantes, vous devrez les dénormaliser et écrire le nouveau salaire quelque part, puis maintenir l'intégrité via des triggers ou une couche logique d'application.