web-dev-qa-db-fra.com

qu'est-ce que les lectures logiques dans le serveur sql? comment réduire non de logique?

De toutes mes recherches pour accélérer les requêtes sur le serveur SQL, les sources ont dit de réduire les lectures logiques en utilisant la clause where appropriée. En fait, j'ai besoin de savoir comment les procédures stockées dans le flux de travail du serveur sql quand il a reçu la demande du frontal et quelques conseils à éviter dans les procédures stockées et ce qui ne l'est pas.

23
Nandha

Les lectures logiques signifient les enregistrements que vous lisez dans la base de données. Prenons un petit exemple stupide:

select *
from
(
  select *
  from orders
  where client = 1234
)
where item = 9876;

Ici, vous sélectionnez toutes les commandes du client 1234. Ensuite, plus tard, vous ne prenez que celles de l'article 9876. Donc (à condition que l'optimiseur ne voit pas à travers cela et optimise votre requête en interne), vous sélectionnez beaucoup plus d'enregistrements dans la première étape que nécessaire. Réduisez les lectures logiques (et le résultat intermédiaire important correspondant) en appliquant les deux critères en une seule étape:

select *
from orders
where client = 1234
and item = 9876;

(Cela peut également affecter les lectures physiques, mais pas nécessairement. Par exemple, la première requête peut accéder à 100 enregistrements, puis la réduire à 10, tandis que la seconde ne lit que ces 10. Mais les 100 enregistrements peuvent être dans un bloc de disque , de sorte que les deux instructions lisent un bloc de disque, c'est-à-dire effectuent une lecture physique. Il peut même s'agir de zéro lecture physique, au fait, au cas où les données se trouvent déjà dans le cache dbms, c'est-à-dire en mémoire. Cela nous indique également que les lectures peuvent varier pour une requête, tandis que les lectures logiques restent les mêmes tant que la requête et les données ne sont pas modifiées.)

23
Thorsten Kettner

Un livre blanc de Microsoft qui fait partie de la documentation technique retirée de SQL Server 20 (p387, originaire de SQL Server Architecture (SQL Server 2000)) a une bonne définition:

Les E/S d'une instance de SQL Server sont divisées en E/S logiques et physiques. Une lecture logique se produit chaque fois que le moteur de base de données demande une page au cache de tampon. Si la page n'est pas actuellement dans le cache de tampon, une lecture physique est puis effectué pour lire la page dans le cache tampon. Si la page est actuellement dans le cache, aucune lecture physique n'est générée; le cache tampon utilise simplement la page déjà en mémoire.

Ainsi, une lecture logique est lorsque le moteur de requête doit lire des données. Tout d'abord, il regarde en mémoire. Si la page est déjà dans la mémoire de SQL Server, elle l'utilise. S'il ne le trouve pas en mémoire, cela déclenche une lecture physique et la page de données est lue à partir du disque. Une lecture logique sans lecture physique ultérieure est un "hit de cache".

Le cache de tampons (également appelé pool de tampons) est la mémoire de travail principale de SQL Server pour la résolution des requêtes. Lorsque vous définissez la quantité de mémoire que SQL Server utilisera, vous contrôlez la taille du cache de tampon disponible.

Cependant, vous dire ce que vous devez faire sans voir la requête ou savoir ce que contient la table et à quoi ressemblent les données et comment les données sont indexées et organisées est fondamentalement impossible.

Un grand nombre de lectures logiques ne sont pas nécessairement mauvaises - ou, plutôt, pas nécessairement évitables. Ce qui est mauvais, c'est un démesuré nombre de lectures logiques. Si vous renvoyez 3 lignes de données, mais que le moteur de requête a dû analyser 200 millions de lignes de la table pour le faire, cela va être très lent et vous pouvez probablement améliorer cela en réécrivant la requête ou en ajoutant un index.

Je commencerais par examiner la complexité des requêtes dans votre procédure stockée. Je rechercherais notamment les index manquants. Si vous exécutez SELECT * FROM BigTable WHERE ProductDate >= '01/01/2014', alors je chercherais à voir qu'il y avait un index sur ProductDate. Si vous exécutez SELECT * FROM BigTable ORDER BY ProductDate DESC, cependant, oui, un index sera toujours utile, mais vous devrez toujours renvoyer l'ensemble de données, vous devrez donc lire la table entière de toute façon. De plus, notez que les lectures logiques se réfèrent à page lectures, donc si le ProductDate en question est uniformément réparti sur le disque, vous devrez peut-être lire chaque page ou presque chaque page de toute façon .

Au-delà de cela, il se pourrait que les statistiques sur la table soient obsolètes. Si vous avez ajouté 20000 lignes à une table et que SQL Server pense toujours qu'il n'y en a que 2000, cela va complètement annuler la planification des requêtes.

41
Bacon Bits