Une base de données relationnelle est une collection de lignes de données dans des tables et non pas une collection d'objets instanciant des classes.
Un mapping objet sert à naviguer d'objet en objet. Chaque objet est chargé avec l'intégralité d'une ligne d'une table. Et peu importe que telle colonne ne soit pas utilisée par telle partie du programme, l'objet du mapping chargera toujours toutes les colonnes.
Par comparaison, le SQL sert à sélectionner les valeurs des cellules dont on a besoin et uniquement celles-là. Et ça tombe bien car il est rare d'avoir besoin simultanément de toutes les colonnes d'une table dans une même portion du programme.
En SQL nous effectuons des jointures afin de ramener en une requête telle cellule d'une table couplée à telle autre d'une autre table. Alors que dans le même temps un ORM ramène brutalement en deux requêtes séparées deux lignes entières.
Certes les ORM proposent tous une solution paliative, une sorte de sous-SQL bridé, avec lequel il devient possible d'extraire des valeurs sans passer par les objets. Mais c'est de l'inversion des bonnes pratiques qu'il s'agit. Bien utiliser un ORM, c'est utiliser par défaut les objets du mapping et ne pratiquer le sous-SQL que dans des cas qui le justifient. Bien utiliser le SQL, c'est ne charger que les données dont on a besoin, systématiquement. Le débat ORM vs SQL porte non pas sur ce qu'on peut faire - on peut faire des objets et des tableaux avec un ORM autant qu'en SQL - mais quelles sont les bonnes pratiques en matière de base de données.