SelectEtoile : Base de connaissance SGBD

Posts Tagged 'analyse'

Analyser une requete sql SYBASE ASE

Les outils présentés ci-dessous permettent de tracer et d'analyser une requête sql sur un serveur SYBASE ASE.

 

  • set showplan on : affiche le plan d'exécution de la requête
  • set statistics io,time on : affiche le nombre d'io/ table/index et le temps des différentes étapes
  • set noexec on : combiner avec showplan, permet d'afficher le plan sans executer la requête
  • set tracefile dirname/filename [for spid] : redirige les résultats des ordres SQL d'un session vers le fichier spécifié (New ASE15)
Toujours faire un 'set tracefile off' en fin de session
Sinon, il est possible que toutes les autres sessions soient polluées par cette trace
  • set show_sqltext {on | off} : affiche le SQL text d'un requête, procédure stockée, curseur ...
  • dbcc traceon(3604) : affiche la sortie à l'écran. Il faut positionner cette option pour les commandes suivantes
  • dbcc traceon(302) : affiche le cout des jointures et des SARG sur chaque table
  • dbcc traceon(310) : affiche les plans de moins en moins couteux (NEW PLAN). Par contre, il n’affiche pas les plans de plus fort cout.
  • dbcc traceon(317) :  affiche les plans plus couteux que les NEW PLANS. Ce sont les WORK PLANS.
  • dbcc sqltext(spid) : affiche la requête lancée par le spid

 


Différents paramètres de 310 et 317:

  • total cost : estimation du cout total en millisecondes d’une jointure (lp*2ms+pp*18ms)

  • varno : position de la table dans la clause from (NB : max 16 tables / jointure, si varno > 16 worktable)

  • indexid : indid de l’index utilisé (0 si la table)

  • pathtype : type d’opération (sclause, join ou orstruct)

  • method : NESTED ITERATION (en majorité), REFORMATTING ou OR OPTIMIZATION

  • outerrows : nombre de lignes de la table externe pour chaque ligne de la table courante

  • joinsel : estimation de la selectivité de la table ou de l’indexe de la table courante

  • cpages : nombres de pages (donnees ou indexes) que l’optimiseur estime dans la table courante

  • prefetch : prefetch strategy (N : pas de prefetch, S : prefetch strategy). Important quand le server est configuré en Large IO.

  • Iosize : taille des blocks io choisi par l’optimiseur

  • Replace : strategie de replacement dans le cache (LRU ou MRU)

  • Lp : Nombre de logical reads = outerrows * cpages

  • Pp : nombre de physical reads

  • Corder : principale (premiere) colonne de l’indexe (colid de syscolumns)

  • Jnvar, Refcost, Refpages, reftotpages, ordercol[0] sont peu utilisables et peu importantes

 

 

Si vous avez un doute sur une requête, il est possible de forcer le plan d'exécution ou de forcer un index précis.

Cela est très utile si on pense qu'un index ou un plan est meilleur que ce que l'optimiseur SYBASE a choisi

 

Pour forcer le plan, il suffit de lancer la commande suivante :

set forceplan on -- avant de lancer la requête

Pour forcer l'index, il suffit de préciser entre parenthèses "index nom_index" comme indiqué dans l'exemple suivant :

select * from ma_table (index mon_index) where col1 ='00'

 

Le forceplan force l'optimiseur a choisir son plan dans l'ordre des tables de la clause FROM. L'optimiseur choisit toutefois les index qu'il peut prendre sauf si vous les avez forcer aussi.

 

Informations pratiques :

Si une valeur d’une colonne est plus importante que les autres (ex : 90 %), les jointures sur cette colonne (ex : valeur1 représentant 0.001 % de la table) ne prendront pas forcément le bon index.

En utilisant la commande sp_modifytats comme suit, cela permet de modifier l’indice de densité de la colonne et à l’optimiseur de prendre un meilleur indexe.

 

Sp_modifystats tablename,colonnename,’REMOVE_SKREW_FROM_DENSITY’

 

Lien très intéressant sur le sujet : http://www.sybase.com/detail?id=2602#539757