SAP ASE (Sybase) : update statistics with hashing

de | 2018-01-22

L’option ‘with hashing’ de la commande update statistics est disponible depuis ASE version >= 15.7 ESD#2 ou SP50.

Il est conseillé par les experts ASE (JPM entre autre pour ceux qui le connaissent) d’utiliser cette méthode pour les tables avec plus de 1 million de lignes.

La documentation nous indique qu’en principe le tri par hash est plus rapide, moins consommateur en procédure cache, moins consommateur en tempdb, etc que l’ancienne méthode (sort).

Un peu d’historique !

Il aura fallu attendre la version 15.0 de ASE pour avoir enfin quelques armes pour passer les statistiques sur les « grosses » tables.

Nous avons eu l’apparition d’une fonction intéressante pour ne pas systématiquement passer les stats. En effet, la fonction ‘datachange(us.name+’.’+ob.name,null,null)’ permet d’avoir le taux de mise à jour de la table et du coup de décider de passer ou non ces fameuses stats (on n’expliquera pas ici à quoi sert une mise à jour de statistique pour un optimiseur CBO …).

L’utilisation de la fonction ‘datachange’ couplé avec l’option ‘with sampling=x percent’ (remplacer x par l’échantillonnage voulu bien entendu) nous a permis de respirer un peu.

Voici donc venu le temps d’utiliser maintenant l’option ‘with hashing’ pour passer les stats sur les tables avec plus de 1 million de lignes. Attention, cette option n’est pas compatible avec l’option ‘with sampling=x percent’, si néanmoins vous les mixer, vous aurez un petit message d’avertissement (mais les stats passent) :


WITH HASHING does not support WITH SAMPLING = 50 PERCENT, sampling phrase is ignored.

Notez que vous pouvez spécifier dans la configuration du dataserver que par défaut vous voulez faire du « hashing ».


sp_configure "update statistics hashing", 0, on
go

Vous devez mettre 0 pour le deuxième paramètre et choisir entre off, on, partial ou default pour le troisième.

Commande SQL pour sortir le nombre (estimé) de lignes des tables  sur ASE :

select us.name + '.' + ob.name, row_count(db_id(),ob.id)
from sysobjects ob
join sysusers us on (ob.uid = us.uid)
where ob.type='U'
order by 2 desc, 1
go

Commande « with sampling » :

update index statistics dbo.discounts with sampling=10 percent
go

Commande « with hashing » :

update index statistics dbo.blurbs with hashing
go

Cette possibilité a été rajoutée dans la v4.0.02 de dbSQWare avec l’ajout de l’option -Hashing (-NoHashing pour rester au sampling).

Commande dbSQWare rebuild « simple » :

./sqwsyb_UpdtStatsDatabase.ksh -I SYB157 -Exec

Commande dbSQWare rebuild « with online » :

./sqwsyb_UpdtStatsDatabase.ksh -I SYB157 -Hashing -Exec

Quelques options du script de stats :

./sqwsyb_UpdtStatsDatabase.ksh -h

Usage: sqwsyb_UpdtStatsDatabase.ksh [-h] -S|-I <dataserver> [+ options]

DESCRIPTION
    sqwsyb_UpdtStatsDatabase.ksh 'update index statistics table' for all tables
SUPPORT
    Sybase supported versions: 15 <= v <= 16.0

PARAMETERS
    -S|-I  dataserver  : Target dataserver.
    -D  database       : Database name.
OPTIONS
    -h  help           : Display the full usage.
    -s                 : Display samples of usage.
    -IT   listtables   : Tables list for running analyze tables (by default all).
    -ET   listtables   : Tables list to exclude.
    -IL   likeclause   : Like clause to generate tables list (example: 'tbl%').
    -EL   likeclause   : Like clause to exclude tables (example: 'notbl%').
    -WCT  whereclause  : Where clause to generate tables list.
    -FSS  SampleSize   : To force sample size.
    -Del               : Delete stats before compute.
    -NoMail            : Desactivate sendmail on error xxx@gmail.com (by default, send on error).
    -FRT  return_code  : Force return code value on error.
    -Dist              : For distant connection to database (change $gvsqw_DbaUser to $gvsqw_DistDbaUser ).
    -Type type         : Type of statistics 'default','index','table','all' (default index).
    -AddMail email     : Email Address to add at 'xxx@gmail.com'.
    -SendReport        : Send execution log report.
    -SizeMaxTable Size : Take into account tables =< $lvsqw_SizeMaxTable Mb (by default, 1000000 Mb). -MinPctChange pct : Min pct change to take table into acgount (by default, datachange>=10).
    -Hashing           : Enable hashing (when rowcount >= 1000000) when ASE version >= 15.7 ESD#2 or SP50 (by default, False).
    -NoHashing         : Disable hashing.
    -HashSize  Size    : Minimum rowcount for hashing (by default, 1000000).
    -Exec              : Run update statistics (default, display generated commands).

Vous pouvez modifier le comportement par défaut du script en paramétrant votre custom :

cat ~/SQWareProduction/sybase/etc_cust/sqwsyb_GlobalVar.cfg
export gvsqw_WithHashing='False'
export gvsqw_HashSize=1000000

Passer gvsqw_WithHashing à ‘True’ pour activer le hashing par défaut. Vous pouvez aussi changer le déclenchement de cette option en changeant la valeur de gvsqw_HashSize.

Ayez le réflexe wiki pour la dernière version de l’aide.

 

 

Laisser un commentaire