2009-05-04 7 views
17

Je suis en train d'essayer d'optimiser une requête qui recherche des données historiques. J'utilise l'analyseur de requêtes pour rechercher le plan d'exécution et j'ai constaté que la majorité de mon coût de requête est sur une chose appelée "recherche de signet". Je n'ai jamais vu ce nœud dans un plan d'exécution auparavant et je ne sais pas ce que cela signifie.Qu'est-ce qu'une recherche de signets dans Sql Server?

Est-ce une bonne ou une mauvaise chose dans une requête?

Répondre

28

La recherche de signets est le processus de recherche des données réelles dans la table SQL, en fonction d'une entrée trouvée dans un index non cluster. Lorsque vous recherchez une valeur dans un index non cluster et que votre requête nécessite plus de champs que le nœud feuille d'index (tous les champs d'index, plus toutes les colonnes INCLUDE possibles), SQL Server doit récupérer les pages de données réelles - c'est ce qu'on appelle une recherche de signet.

Dans certains cas, c'est vraiment la seule façon de procéder - seulement si votre requête ne nécessite qu'un champ de plus (pas tout un tas), ce pourrait être une bonne idée d'INCLURE ce champ dans le non-champ. index clusterisé. Dans ce cas, le nœud au niveau feuille de l'index non clusterisé contiendrait tous les champs nécessaires pour satisfaire votre requête (un index "couvrant"), et une recherche de signets ne serait donc plus nécessaire.

Marc

+2

D'accord. Si un grand pourcentage de la table est retourné, il peut être préférable d'avoir une analyse de table, mais si les statistiques sont mauvaises, vous pouvez obtenir un plan qui effectue les recherches de signets à la place. Il y a un ebook gratuit assez décent sur les plans d'exécution à redgate - http://www.red-gate.com/specials/Grant.htm – ahains

+1

Yup, le site Red Gate était beaucoup de choses intéressantes SQL Server disponibles - beaucoup pour gratuit, aussi! –

3

C'est un NESTED LOOP qui rejoint un index non cluster avec la table elle-même sur un pointeur de ligne.

Happens pour les requêtes comme celle-ci:

SELECT col1 
FROM table 
WHERE col2 BETWEEN 1 AND 10 

, si vous avez un index sur col2.

L'index sur col2 contient des pointeurs vers les lignes indexées.

Ainsi, afin de récupérer la valeur de col1, le moteur doit balayer l'index sur col2 pour les valeurs clés de 1-10, et pour chaque feuille d'index, reportez-vous à la table elle-même à l'aide du pointeur contenu dans la feuille, pour connaître la valeur de col1.

This article souligne qu'un Bookmark Lookup est 'terme s, qui est remplacé par NESTED LOOP' SQL Server 2000 s entre l'index et la table SQL Server 2005 et au-dessus

+0

CLUSTERED KEY LOOKUP est la recherche de signets, AFAIK. –

+0

Il peut être un peu déroutant de se référer à lui comme une boucle Nested, il n'est pas vraiment lié au type de joint NESTED LOOP droit? Je suppose que vous parlez simplement conceptuellement? – ahains

+0

Chaque enregistrement d'une table possède un pointeur physique pouvant être utilisé pour accéder à cet enregistrement. Un index non clusterisé est en fait une autre table. Lorsque vous créez une table SELECT * FROM WHERE col1 ENTRE un AND b, en fait il existe une jointure masquée: SELECT * FROM col1_index JOIN la table sur table.rowid = col1_index WHERE col1_index.col1 ENTRE un ET b. Cette jointure peut être NESTED LOOP et même HASH (lorsque deux index sont joints). – Quassnoi

2

De MSDN au sujet Bookmark Lookups:

Le L'opérateur de recherche de signets utilise un signet (ID de ligne ou clé de clustering) à pour rechercher la ligne correspondante dans la table ou l'index clusterisé. La colonne Argument contient l'étiquette de signet utilisée pour rechercher la ligne de la table ou l'index cluster. La colonne Argument contient également le nom de la table ou de l'index clusterisé dans lequel la ligne est recherchée.Si la clause WITH PREFETCH apparaît dans la colonne Argument, le processeur de requête a déterminé qu'il est optimal d'utiliser asynchrone prélecture (lecture anticipée) lors de la recherche des signets dans la table ou l'index cluster.

Questions connexes