Sybase - dbcc cursorinfo

Logo

Introduction

Dans certains contextes sur les moteurs Sybase, dbcc sqltext et sp_showplan ne permettent pas de clairement identifier les plans d’exécution d’un process qui met en œuvre des curseurs. La commande dbcc cursorinfo pallie à ce type de problème.

La commande dbcc cursorinfo

Pour pouvoir utiliser la commande dbcc cursorinfo, le trace flag 3604 doit être activé.

dbcc cursorinfo (nesting_level, <cursor name>, spid)

Dans la commande dbcc cursorinfo :

nesting_level Niveau d’imbrication (par défaut -1 pour quel que soit le niveau d’imbrication)
<cursor name> Nom du curseur
spid Identifiant du process donné par sysprocesses

Dans la plupart des cas, c’est l’affichage des arbres d’exécution qui nous intéressera : par conséquent c’est l’option 1 qui sera généralement mise en œuvre.

Cas pratique de mise en œuvre de la commande dbcc cursorinfo

Dans le cas pratique de cette documentation, la procédure stockée sp_histo ouvre un curseur c_crs lequel est particulièrement lent.

Les commandes sp_who, dbcc sqltext et sp_showplan ne renvoient pas les informations indispensables, notamment pour le plan d’exécution.

sp_who ne renvoie que l’information FETCH CURSOR :

execute sp_who
go
-  --  ----------  --  --  ---  -  --- ------------------  --
0  15  send sleep  sa  sa  CGC  0  db1 FETCH CURSOR        0

dbcc sqltext ne renvoie que la commande d’exécution de la procédure stockée :

dbcc traceon(3604)
go
dbcc sqltext(15)
go
-----------------------
SQL Text: exec sp_histo

sp_showplan renvoie l’information FETCH CURSOR, par contre grâce à la procédure sp_showplan nous obtenons le nom du curseur mis en œuvre :

execute sp_showplan 15,null,null,null
go
---------------------------------------
QUERY PLAN FOR STATEMENT 6 (at line 12).
    STEP 1
        The type of query is FETCH CURSOR c_crs.
(return status = 0)

sp_showplan a permis de retrouver le nom du curseur mis en œuvre, information sans laquelle dbcc cursorinfo ne pourrait pas être utilisée :

dbcc traceon(3604)
go
dbcc cursorinfo(-1,'c_crs',15)
go
-----------------------
Cursor name 'c_crs' is declared at nesting level '1'.
The cursor id is 983041.
The cursor has been successfully opened 1 times.
The cursor was compiled at isolation level 1.
The cursor is currently scanning at a nonzero isolation level.
The cursor is positioned on a row.
There have been 30512 rows read, 0 rows updated and 0 rows deleted through this cursor.
The cursor will remain open when a transaction is committed or rolled back.
The number of rows returned for each FETCH is 1.
The cursor is updatable.
This cursor is declared within a stored procedure. The cursor's memory usage
cannot be distinguished from that of the procedure as a whole.
There are 1 columns returned by this cursor.

The result columns are:
Name = 'id', Table = 'HISTO', Type = INT, Length = 4 (updatable)

Showplan output for the cursor:

QUERY PLAN FOR STATEMENT 1 (at line 5).
    STEP 1
        The type of query is SELECT.
        FROM TABLE
            HISTO
        Nested iteration.
        Table Scan.
        Forward scan.
        Positioning at start of table.
        Using I/O Size 16 Kbytes for data pages.
        With LRU Buffer Replacement Strategy for data pages.

dbcc cursorinfo permet ainsi de retrouver le plan d’exécution mis en œuvre, le niveau d’imbrication ('nesting level'), combien de lignes ont été jusqu’ici lues, mises à jour ou supprimées, le niveau d’isolation.