Qu'est-ce que BMK Operator dans SQLServer

8

J'essayais de répondre à cette question en indiquant que la clause est facultative .. Mais je suis coincé avec un opérateur dans le plan .. ci-dessous est une capture d'écran du plan d'exécution ..

entrez la description de l'image ici

Comme vous pouvez le voir, il y a un opérateur BMK dans le plan de requête, mais aucune indication montrant comment il est calculé.

étapes que j'ai essayées jusqu'à présent:
j'ai commencé la recherche avec BMK1000, mais cela montre un tas de questions avec le même opérateur. enfin j'ai trouvé un thread qui dit "Le BMK que vous référencez est l'emplacement de stockage dans le tas qui est conservé avec l'index non cluster au lieu de la clé de cluster. ".. Mais je ne sais pas comment cela est lié à moi, car je n'ai pas d'index ..

DEMANDER:
qu'est-ce que l'opérateur BMK et comment il est calculé? Tous les pointeurs seront également utiles

Voici SQLFiddle pour reprocher le problème

TheGameiswar
la source

Réponses:

11

Ce n'est pas un opérateur à part entière. Il s'agit d'une colonne de sortie de l'opérateur d'analyse de table sur le tas. C'est le "signet" qui contient l'adresse physique de la ligne (il s'agit du même signet que celui mentionné dans l'expression "recherche de signet").

Ceci est transmis le long du pipeline à l'opérateur de mise à jour afin qu'il connaisse la ligne qu'il doit mettre à jour.

Dans SQL Server 2016, vous pouvez voir les valeurs réelles de cette colonne en utilisant l' query_trace_column_valuesévénement étendu

entrez la description de l'image ici

Le fait de les brancher sys.fn_PhysLocFormattermontrefile:page:slot

SELECT sys.fn_PhysLocFormatter(0xB002000001), 
       sys.fn_PhysLocFormatter(0xB0020000010001)

Retour

+------------------+------------------+
| (No column name) | (No column name) |
+------------------+------------------+
| (1:688:0)        | (1:688:1)        |
+------------------+------------------+
Martin Smith
la source