Modifications importantes apportées à CTE dans PostgreSQL 12

WITH w AS NOT MATERIALIZED ( SELECT * FROM very_very_big_table ) SELECT * FROM w AS w1 JOIN w AS w2 ON w1.key = w2.ref WHERE w2.key = 123; 

Aujourd'hui, une validation est tombĂ©e dans le rĂ©fĂ©rentiel PostgreSQL, ce qui vous permet de contrĂŽler le comportement du traitement des sous-requĂȘtes CTE, Ă  savoir: vous pouvez dĂ©sormais indiquer explicitement si la sous-requĂȘte sera matĂ©rialisĂ©e sĂ©parĂ©ment ou si elle sera exĂ©cutĂ©e dans le cadre d'une grande requĂȘte.


Cela ira dans PostgreSQL 12 et c'est un gros problĂšme. Voyons pourquoi


Les programmeurs adorent CTE car il peut amĂ©liorer considĂ©rablement la lisibilitĂ© du code. Eh bien, en effet, certaines requĂȘtes analytiques peuvent fonctionner avec des dizaines de tables et divers regroupements et filtres. Pour Ă©crire tout cela dans une seule grande requĂȘte - vous garantissez d'obtenir quelque chose d'illisible. Par consĂ©quent, en utilisant l'opĂ©rateur WITH , nous dĂ©crivons sĂ©quentiellement, dans de petites sous-requĂȘtes (auxquelles un nom est lisible par l'homme), la logique du travail, puis nous produisons le rĂ©sultat. TrĂšs confortable.


Plus prĂ©cisĂ©ment, ce serait trĂšs pratique si ce n’était pour rien: le PostgreSQL actuel exĂ©cute ces sous-requĂȘtes sĂ©parĂ©ment les unes des autres, les matĂ©rialise (Ă©crit le rĂ©sultat dans une table temporaire). Cela peut entraĂźner un ralentissement important par rapport Ă  un gros monstre illisible. Surtout si les sous-requĂȘtes CTE renvoient des millions de lignes.


Cependant, il y a des situations oĂč une telle exĂ©cution sĂ©parĂ©e fonctionne pour le bien: il y a une telle astuce d'optimisation quand il vaut mieux exĂ©cuter une partie d'une requĂȘte complexe sĂ©parĂ©ment, mais le postgres ne le comprend pas tout seul. Ensuite, nous supprimons cette partie dans la sous-requĂȘte CTE.


En gĂ©nĂ©ral, les situations sont diffĂ©rentes, c'est pourquoi Postgres 12 a fait un commit en ajoutant des mots clĂ©s MATERIALIZED et NOT MATERIALIZED , qui indiquent respectivement s'il faut matĂ©rialiser la requĂȘte ou en ligne.


De plus, le comportement par dĂ©faut a changĂ©. Maintenant, la sous-requĂȘte CTE sera en ligne par dĂ©faut si son rĂ©sultat est utilisĂ© une fois. Sinon, il se matĂ©rialisera comme avant.

Source: https://habr.com/ru/post/fr440576/


All Articles