PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Changer ORDER BY d'id à une autre colonne indexée (avec une faible LIMIT) a un coût énorme

Il s'est avéré que c'était un problème d'index. Le comportement NULLS de la requête n'était pas cohérent avec l'index.

CREATE INDEX message_created_at_idx on message (created_at DESC NULLS LAST);

... ORDER BY message.created_at DESC; -- defaults to NULLS FIRST when DESC

solutions

Si vous spécifiez NULLS dans votre index ou votre requête, assurez-vous qu'ils sont cohérents entre eux.

c'est-à-dire :ASC NULLS LAST est cohérent avec ASC NULLS LAST ou DESC NULLS FIRST .

NUL EN DERNIER

CREATE INDEX message_created_at_idx on message (created_at DESC NULLS LAST);

... ORDER BY messsage.created_at DESC NULLS LAST;

NULLS D'ABORD

CREATE INDEX message_created_at_idx on message (created_at DESC); -- defaults to NULLS FIRST when DESC

... ORDER BY messsage.created_at DESC -- defaults to NULLS FIRST when DESC;

NON NULL

Si votre colonne n'est PAS NULL, ne vous embêtez pas avec NULLS.

CREATE INDEX message_created_at_idx on message (created_at DESC);

... ORDER BY messsage.created_at DESC;