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.