J'ai une requête SQL assez longue et complexe exécutée sur PostgreSQL 8.3. Une partie de la requête implique le filtrage sur une plage de dates qui se terminent aujourd'hui, comme ceci:La requête Postgres est très lente avec current_date :: date au lieu de la date codée en dur
where ...
and sp1.price_date between current_date::date - '1 year'::interval and current_date::date
and sp4.price_date between current_date::date - '2 weeks'::interval and current_date::date
and sp5.price_date = (select sp6.price_date
from stock_prices sp6
where sp6.stock_id = s.stock_id
and sp6.price_date < current_date::date
order by sp6.price_date desc
limit 1)
...
Cette requête prend près de 5 minutes pour exécuter (la première fois) et environ 1,5 minutes, la seconde fois. En regardant la sortie EXPLAIN ANALYZE, il semble que current_date est le problème. J'ai donc essayé de le remplacer par une date hardcoded, comme ceci:
where ...
and sp1.price_date between '2009-09-30'::date - '1 year'::interval and '2009-09-30'::date
and sp4.price_date between '2009-09-30'::date - '2 weeks'::interval and '2009-09-30'::date
and sp5.price_date = (select sp6.price_date
from stock_prices sp6
where sp6.stock_id = s.stock_id
and sp6.price_date < '2009-09-30'::date
order by sp6.price_date desc
limit 1)
...
La requête puis a couru dans une demi-seconde! C'est génial, sauf que la date se produit dans un total de 10 endroits dans la requête et, bien sûr, je ne veux pas que l'utilisateur doive le changer manuellement à 10 endroits. Dans MS SQL Server, je déclarerais simplement une variable avec la valeur de la date courante et l'utiliserais, mais apparently cela n'est pas possible en langage SQL simple dans Postgres.
Que puis-je faire pour que cette requête s'exécute rapidement tout en utilisant automatiquement la date actuelle?
current_date :: date C'est très étrange, pourquoi avez-vous besoin de la partie :: date, si elle est déjà de type date? De plus, si vous ajoutez/soustrayez des intervalles de date, le résultat sera de toute façon un horodatage! – Jamol