Quand est-il temps d'utiliser l'instruction SQL «SELECT [résultats] FROM [tables] WHERE [conditions] FETCH FIRST [n] ROWS ONLY»

StackOverflow https://stackoverflow.com/questions/400575

  •  03-07-2019
  •  | 
  •  

Question

Je ne suis pas tout à fait sûr que le fait de sélectionner uniquement un certain nombre de lignes serait préférable à la création d'une instruction select plus spécifique. J'ai le sentiment qu'il me manque quelque chose d'assez simple mais je n'arrive pas à le comprendre. J’ai moins de six mois d’expérience avec SQL et c’est superficiel, alors je suis désolé, mais c’est une question très simple, mais je n’ai pas trouvé de réponse claire.

Était-ce utile?

La solution

Je connais deux utilisations courantes:

Paging: veillez à spécifier un ordre. Si aucun ordre n'est spécifié, de nombreuses implémentations de base de données utilisent ce qui est pratique pour exécuter la requête. Ce "optimal" le comportement de commande peut donner des résultats très imprévisibles.

SELECT top 10 CustomerName
FROM Customer
WHERE CustomerID > 200 --start of page
ORDER BY CustomerID

Sous-requêtes: de nombreux endroits dans lesquels une sous-requête peut être émise exigent que le résultat soit une valeur unique. top 1 est juste plus rapide que max dans de nombreux cas.

--give me some customer that ordered today
SELECT CustomerName
FROM Customer
WHERE CustomerID =
(
  SELECT top 1 CustomerID
  FROM Orders
  WHERE OrderDate = @Today
)

Autres conseils

Pagination personnalisée, généralement.

Nous utilisons cette déclaration pour les raisons suivantes:

  1. Affiche uniquement les résultats les plus pertinents (par exemple, le top 100) sans avoir à transférer toutes les lignes de la base de données vers le client. Dans ce cas, nous utilisons également ORDER BY.

  2. Nous voulons simplement savoir s’il existe des lignes correspondantes et en donner quelques exemples. Dans ce cas, nous ne commandons pas les résultats et encore une fois, FETCH FIRST est beaucoup plus économique que de faire préparer la base de données au transfert de nombreuses lignes et de les jeter ensuite au client. C’est généralement pendant le développement du logiciel que vous devez vous faire une idée si un certain SQL est correct.

Lorsque vous souhaitez afficher les valeurs à un utilisateur, vous n’avez probablement besoin que de N lignes. En règle générale, le serveur de base de données peut extraire les N premières lignes, plus rapidement que toutes les lignes, de sorte que le rafraîchissement de votre écran peut être un peu plus rapide.

Oracle a même un indice, appelé FIRST_ROWS, qui suggère que récupérer rapidement les données est plus important que de les récupérer efficacement.

Les concepteurs de SQL sont d'accord avec vous. C'est pourquoi le SQL standard n'inclut pas top / limit / fetch en premier, etc.

Pensez aux résultats de recherche Google et au nombre de pages disponibles pour obtenir des résultats.

Bien évidemment, il y a beaucoup plus à faire dans leur cas mais c'est l'idée.

Mis à part la pagination, chaque fois que vous voulez la ligne la plus ou le moins [insérer une métrique ici] dans un tableau, ordonner sur [toute métrique] et limiter à une ligne est, IME, préférable à une sous-requête utilisant MIN / MAX. Pourrait varier selon les moteurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top