Le principal problème avec le cas 2 est que, dans de nombreux cas, l'ensemble des résultats de la requête doit être obtenu puis trié avant les N premières lignes peuvent être renvoyées - à moins que les colonnes ORDER BY ne soient indexées et qu'Oracle puisse utiliser l'index pour éviter un tri. Pour une requête complexe et un grand ensemble de données, cela peut prendre un certain temps. Cependant, vous pouvez faire certaines choses pour améliorer la vitesse :
- Essayez de vous assurer qu'aucune fonction n'est appelée dans le SQL interne - celles-ci peuvent être appelées 5 millions de fois juste pour renvoyer les 20 premières lignes. Si vous pouvez déplacer ces appels de fonction vers la requête externe, ils seront moins appelés.
- Utilisez un indice FIRST_ROWS_n pour inciter Oracle à optimiser le fait que vous ne renverrez jamais toutes les données.
MODIF :
Autre réflexion :vous présentez actuellement à l'utilisateur un rapport qui pourrait renvoient des milliers ou des millions de lignes, mais l'utilisateur ne les parcourra jamais de manière réaliste. Ne pouvez-vous pas les forcer à sélectionner une plus petite quantité de données, par ex. en limitant la plage de dates sélectionnée à 3 mois (ou autre) ?