J'essaie de comprendre l'impact sur les performances de la sélection de données dans une vue, où l'une des colonnes d'une vue est fonction d'autres données de la table d'origine.
Le calcul est-il effectué indépendamment du fait que la colonne calculée figure ou non dans la liste des colonnes sélectionnées?
Si j'avais une table et la vue déclarée comme ça
CREATE TABLE price_data (
ticker text, -- Ticker of the stock
ddate date, -- Date for this price
price float8, -- Closing price on this date
factor float8 -- Factor to convert this price to USD
);
CREATE VIEW prices AS
SELECT ticker,
ddate,
price,
factor,
price * factor as price_usd
FROM price_data
Would que la multiplication être effectuée dans une requête comme celle ci - dessous?
select ticker, ddate, price, factor from prices
Existe-t-il une référence garantissant ceci dans un sens ou dans l'autre? Je lisais la documentation sur le système de règles dans Postgres, mais je pense que la réponse réside vraiment dans l'optimiseur, car rien dans la documentation du système de règles n'indiquait qu'il ne serait pas sélectionné.
Je soupçonne que dans le cas ci-dessus, le calcul n'est pas effectué. J'ai changé la vue pour utiliser la division au lieu de la multiplication et j'ai inséré un 0
for factor
dans price_data
. La requête ci-dessus n'a pas échoué, mais si la requête a été modifiée pour sélectionner la colonne calculée, la requête modifiée a échoué.
Existe-t-il un moyen de comprendre quels calculs sont effectués lors de l' select
exécution d'un? Je suppose que je suis à la recherche de quelque chose comme, EXPLAIN
mais qui me renseigne également sur les calculs qui sont effectués.