Le cache de requêtes ou "statement cache" est une nouveauté de Sybase ASE 12.5.1 mais effectif seulement depuis Sybase ASE 12.5.2. Le cache de requêtes est utilisé pour sauvegarder des requêtes SQL en cache. Adaptive Server compare le code SQL entrant aux requêtes SQL en cache, si une correspondance est trouvée, le plan de la requête SQL en cache est exécuté. La cache de requêtes permet ainsi à l’application d’amortir les coûts de compilation pour des requêtes exécutées plusieurs fois.
Le cache de requêtes permet de stocker le texte des commandes SQL Ad-hoc. Adaptive Server compare tout nouvel ordre SQL Ad-hoc reçu aux commandes SQL en cache et si une correspondance est trouvée utilise le plan d’exécution mis en cache lors de l’exécution initiale. Ainsi Adaptive Server n’a pas à recompiler les commandes SQL pour lesquelles un plan d’exécution existe.
Le cache de requêtes est une ressource serveur consommant de la mémoire au niveau du pool de mémoire du cache de procedures.
Le paramètre de configuration dynamique ‘"statement cache size’" permet de dimensionner la taille mémoire du cache de requêtes :
sp_configure "statement cache size", size_of_cache
L’unité du paramètre size_of_cache est la page de 2K. Pour spécifier un cache de requêtes avec 5120 pages de 2K (soit une taille mémoire de 10Mb) :
sp_configure "statement cache size", 5120.

Adaptive Server réalise les étapes ci-dessous pour traiter les requêtes
Ad-hoc en utilisant le cache de requêtes :
| 1. |
Adaptive Server parse la commande. Si la
commande peut être mise en cache, ASE calcule une hash value pour la
commande (ex : ssql_hashkey 0x530e4a67), valeur qui permet au moteur
Adaptive Server d’effectuer un critère de correspondance avec les
commandes SQL déjà existantes en cache.
|
| 2. |
Adaptive Server met en cache la commande SQL. |
| 3. |
Adaptive Server package la commande SQL en une procédure stockée en convertissant toutes les variables locales en paramètres de procédures. A ce stade, la procédure n’est pas compilée et son plan d’exécution n’est pas en cache. |
| 4. |
Adaptive Server convertit la commande
SQL en une commande execute de la procédure stockée correspondante.
|
| 5. |
Adaptive Server exécute la procédure. |
Adaptive Server effectue la correspondance entre une commande SQL Ad-hoc et les commandes SQL en cache avec les critères suivants :
Chaque commande SQL requiert en moyenne 1K de mémoire dans le cache de requêtes selon la taille du texte SQL. Chaque plan en cache requiert environ 2K de mémoire dans le cache de procédures. Pour estimer la mémoire nécessaire au cache de requêtes, il faut prendre en compte :
sp_sysmon permet d’afficher un rapport sur l’activité du cache de requêtes 'SQLStatement Cache' au niveau de la rubrique 'Procedure Cache Management'.
Procedure Cache Management per sec per xact count % of total
-------------------------- ------- -------- ----- ----------
...
SQLStatement Cache:
Statements Cached 0.0 0.0 0 n/a
Statements Found in Cache 0.7 0.0 2 n/a
Statements Not Found 0.0 0.0 0.0 n/a
Statements Dropped 0.0 0.0 0 n/a
Statements Recompiled 0.3 0.0 1 n/a
Statements Not Cached 1.3 0.0 4 n/a
Description des compteurs
| Statements Found in Cache | Nombre de fois qu’un plan d’exécution a été réutilisé. Une faible valeur peut indiquer que le cache de requêtes est sous dimensionné. |
| Statements Not Found | Nombre de commandes SQL non trouvées en cache et implémentées dans ce dernier. La somme des compteurs "Statements Found in Cache" et "Statements Not Found" représente le nombre total de commandes SQL éligibles et soumises au cache de requêtes. |
| Statements Cached | Nombre de requêtes SQL mis en cache. C’est typiquement la même valeur que le compteur "Statements Not Found". Des valeurs faibles de ce compteur indique que le cache de requêtes est rempli de commandes SQL actives. |
| Statements Dropped | Nombre de requêtes qui ont été supprimées du cache. Une valeur importante peut indiquer que la quantité de mémoire pour le cache de procédures est trop petite ou bien que la taille du cache de requêtes est trop petite. |
| Statements Restored | Nombre de plans d’exécution régénérés à partir du texte SQL. Des valeurs importantes indique une valeur insuffisante pour le paramètre "Procedure Cache Size". |
| Statements Not Cached | Nombres de commandes SQL qui sont éligibles au cache de requêtes si ce dernier est activé |
Les commandes dbcc comprennent à présent les paramètres prsqlcache et purgesqlcache et sont directement liées au cache de requêtes.
dbcc prsqlcache
dbcc prsqlcache ([sqlid [ , printopt ]])
dbcc purgesqlcache
dbcc purgesqlcache (sqlid) ! Nouveauté ASE 15.0.2
La commande dbcc prsqlcache [sqlid, printopt] affiche un résumé plus ou moins détaillé à la demande des commandes SQL en cache. Pour cette commande :
dbcc prsqlcache
dbcc prsqlcache ([sqlid [ , printopt ]])
Le rôle sa_role est nécessaire pour l’exécution de la commande dbcc prsqlcache. Si aucune valeur n’est spécifiée pour les paramètres sqlid, printopt, tout le contenu du cache de requêtes est affiché.
| sqlid | Identifiant de l’objet dans le cache de requête pour lequel on souhaite un résumé. L’affichage d’informations supplémentaires sur l’entrée est contrôlé par le paramètre printopt de la commande. La valeur de sqlid peut valoir 0 et dans ce cas un bref résumé est affiché pour chaque commande SQL en cache, la valeur pour printopt est alors ignorée dans ce cas. |
| printopt | Paramètre permettant de contrôler l’affichage lorsque sqlid correspond à un objet valide. La variable printopt peut valoir 0 ou 1. Lorsque printopt vaut 1, le plan d’exécution (showplan) est affiché. |
Exemples d'affichage :
>dbcc traceon(3604)
>go
>dbcc prsqlcache
>go
Start of SSQL Hash Table at 0xfc67d830
Memory configured: 1000 2k pages Memory used: 18 2k pages
Bucket# 625 address 0xfc67ebb8
SSQL_DESC 0xfc67f9c0
ssql_name *ss1248998166_0290284638ss*
ssql_hashkey 0x114d645e ssql_id 1248998166
ssql_suid 1 ssql_uid 1 ssql_dbid 1
ssql_status 0x28 ssql_parallel_deg 1
ssql_tab_count 0 ssql_isolate 1 ssql_tranmode 0
ssql_keep 0 ssql_usecnt 1 ssql_pgcount 8
SQL TEXT: select * from sysobjects where name like "sp%"
Bucket# 852 address 0xfc67f2d0
SSQL_DESC 0xfc67f840
ssql_name *ss1232998109_1393445479ss*
ssql_hashkey 0x530e4a67 ssql_id 1232998109
ssql_suid 1 ssql_uid 1 ssql_dbid 1
ssql_status 0x28 ssql_parallel_deg 1
ssql_tab_count 0 ssql_isolate 1 ssql_tranmode 0
ssql_keep 0 ssql_usecnt 1 ssql_pgcount 3
SQL TEXT: select name from systypes where allownulls = 0
End of SSQL Hash Table
Dans le résumé ci-dessus, deux requêtes sont en cache, ces dernières étant identifiées par ssql_id.
Pour afficher un résumé pour une unique requête en cache, c’est la valeur ssql_id qui doit être précisée pour le paramètre sqlid dans la commande dbcc prsqlcache.
>dbcc traceon(3604)
>go
>dbcc prsqlcache (1232998109, 0)
>go
SSQL_DESC 0xfc67f840
ssql_name *ss1232998109_1393445479ss*
ssql_hashkey 0x530e4a67 ssql_id 1232998109
ssql_suid 1 ssql_uid 1 ssql_dbid 1
ssql_status 0x28 ssql_parallel_deg 1
ssql_tab_count 0 ssql_isolate 1 ssql_tranmode 0
ssql_keep 0 ssql_usecnt 1 ssql_pgcount 3
SQL TEXT: select name from systypes where allownulls = 0
Pour cette même requête, afin d’afficher le plan d’exécution d’une requête en cache, il suffit de spécifier 1 pour le paramètre printopt.
>dbcc traceon(3604)
>go
>dbcc prsqlcache (1232998109, 1)
>go
SSQL_DESC 0xfc67f840
ssql_name *ss1232998109_1393445479ss*
ssql_hashkey 0x530e4a67 ssql_id 1232998109
ssql_suid 1 ssql_uid 1 ssql_dbid 1
ssql_status 0x28 ssql_parallel_deg 1
ssql_tab_count 0 ssql_isolate 1 ssql_tranmode 0
ssql_keep 0 ssql_usecnt 1 ssql_pgcount 3
SQL TEXT: select name from systypes where allownulls = 0
QUERY PLAN FOR STATEMENT 1 (at line 1).
STEP 1
The type of query is SELECT.
FROM TABLE
systypes
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.
dbcc purgesqlcache
dbcc purgesqlcache (sqlid) ! Nouveauté ASE 15.0.2
La commande dbcc purgesqlcache détruit une ou toutes les commandes SQL dans le cache de requêtes exceptées les commandes en cours d’exécution. Le rôle sa_role est nécessaire pour l’exécution de la commande de purge.
Le cache de requêtes implémente le paramètre set statement_cache au niveau de la session
set statement_cache [on | off]
Au niveau d’une session, cette commande permet d’activer ou non le cache de requêtes.
Dès lors que le paramètre "statement cache size" a une valeur différente de 0, une session peut activer ou désactiver le cache de requêtes. Si le cache de requêtes est configuré au niveau du serveur, par défaut au niveau de la session ce dernier est également activé.
| Version | Date | Commentaires |
|---|---|---|
| 1.0 | 05/2004 | Version initiale |
| 1.1 |
01/2009 |
Nouvelle fonctionnalité ASE 15.0.2 : dbcc purgesqlcache (int SSQLID) |