Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

SQL Server: Scans and seeks

The most primitive operation in SQL Server is retrieving from a table a set of rows that satisfies a given search predicate. This can be achieved using two basic strategies: scans and seeks.

Scan

Scans can be performed on any structure (index or heap). Scanning a table means that SQL Server reads all the rows in the table. Only the rows satisfying the search predicate are returned. Scans imply sequential reads that are usually faster than reading each page individually, but the cost of this operation is proportional to the size of the table.

In indexes, SQL Server uses the pointers to the next page (or previous) for scanning. In a heap, it uses the IAM pages.
The number of logical reads during this operation is the number of pages read during the scan, plus one logical read at each non-leaf level, in case of an index, in order to locate the first row of the table. This operation counts as a scan in the IO statistics.

Seek

Seeks can only be performed on indexes (clustered or nonclustered). A seek is performed when SQL Server can leverage the ordering of the rows in the index to identify a range of rows in the index that contains all the rows satisfying the search predicate.

The search predicate is divided in two parts:

  • The seek predicate, such as all the rows within this range satisfy the seek predicate, and all the rows outside of that range don't. Seek predicates are usually predicates on the leftmost columns of the key of an index.
  • The residual predicate, such as the search predicate is the conjunction of the seek predicate and the residual predicate. The residual predicate is optional.

SQL Server will scan the range containing the rows satisfying the seek predicate, evaluate the residual predicate against each of them, and return only the rows that satisfy both.

In order to locate the first leaf-level row qualifying for the seek predicate, SQL Server reads one page at each non-leaf level of the index, from the root page, to the last non-leaf level.

There will be exactly one logical read at each non-leaf level of the index.

Then, at the leaf level of the index, all the rows satisfying the seek predicate have to be read:

  • If the index definition cannot guarantee that only a single row can satisfy the seek predicate, SQL Server scans all the pages from the page containing the first row qualifying, to the page containing the last row qualifying.
    The IO statistics will count this operation as a scan, and there will be as many logical reads at the leaf level as the number of pages scanned.
  • If the index definition guarantees that only a single row can satisfy the seek predicate, SQL Server just reads the page containing the qualifying row.
    The operation won't be counted as a scan, and there will be just a single logical read at the leaf level.

The logical reads performed at the leaf level are usually slower that logical reads at non-leaf levels because the non-leaf levels of indexes are often cached in memory.

Publié jeudi 18 décembre 2008 17:16 par RaptorXP
Classé sous : ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Comparaison des composants pour préparer votre migration de SharePoint 2007 vers Office 365 par Blog Technique de Romelard Fabrice le il y a 15 heures et 42 minutes

- Créer un périphérique Windows To Go 10 ! par Blog de Jérémy Jeanson le 11-21-2014, 04:54

- RDV à Genève le 12 décembre pour l’évènement “SharePoint–Office 365 : des pratiques pour une meilleure productivité !” par Le blog de Patrick [MVP Office 365] le 11-19-2014, 10:40

- [IIS] Erreurs web personnalisées par Blog de Jérémy Jeanson le 11-19-2014, 00:00

- BDD/TDD + Javascript par Fathi Bellahcene le 11-16-2014, 16:57

- Sécuriser sans stocker de mots de passe par Blog de Jérémy Jeanson le 11-15-2014, 08:58

- Où télécharger la preview de Visual Studio 2015 ? par Blog de Jérémy Jeanson le 11-13-2014, 21:33

- Les cartes sont partout ! par Le blog de Patrick [MVP Office 365] le 11-13-2014, 17:26

- [ #Office365 ] Courrier basse priorité ! par Le blog de Patrick [MVP Office 365] le 11-12-2014, 08:56

- [Oracle] Fichier oranfsodm12.dll absent du package client par Blog de Jérémy Jeanson le 11-10-2014, 20:44