2010-08-18 9 views
3

prix id id_stock prix DateComment optimiser cette requête?

**stocks** 
id 
stock_name 
active 

maintenant je dois mettre stocks.active=0 pour chaque stock qui a le MAX(prices.date) > 15 days (à une date que je dois passer)

C'est ma requête , mais c'est très très lent !!!

update stocks set stocks.active=0 where stocks.id IN (

SELECT prices.id_stock 
FROM prices 
GROUP BY prices.id_stock 
HAVING datediff('2010-08-17', MAX(prices.date)) > 15 

) 

Comment l'optimiser?

Merci beaucoup!

Répondre

7
UPDATE stocks 
SET  active = 0 
WHERE DATEDIFF('2010-08-17', 
     (
     SELECT MAX(prices.date) 
     FROM prices 
     WHERE id_stock = stocks.id 
     )) > 15 

Créer un index sur prices (id_stock, date)

0

Je trouve parfois réécrire la clause IN comme EXISTS ... améliore les questions

UPDATE stocks SET stocks.active=0 
    WHERE EXISTS (SELECT prices.id_stock 
         FROM prices 
         WHERE prices.id_stock = stocks.id 
         GROUP BY prices.id_stock 
         HAVING datediff('2010-08-17', MAX(prices.date)) > 15); 
0
Update stocks 
Set active = 0 
Where Exists (
       Select 1 
       From prices 
       Where prices.id_stock = stocks.Id 
       Having Max(prices.date) < DateAdd('2010-08-17', Interval -15 Day) 
       )