SelectEtoile : Base de connaissance SGBD

Posts Tagged 'ase 15'

Paramètre 'optimizer level'


 A partir de la version 15.0.3 ESD 2 pour bénéficier des changements de l'optimiseur, il fallait utiliser un set option. A partir de la version 15.0.3 ESD 3, il est possible d'utiliser le paramètre de configuration sp_configure 'optimizer level'

sp_configure 'optimizer level:

 Par défaut l'option à pour valeur "ase_default". C'est à dire que les modifications effectuées sur l'optimiseur à partir de l'ESD1 ne sont pas prises en compte. Il faut positionner l'option à "ase_current" pour que tous les changements soient effectifs.


1> sp_options show
2> go

Category: Query Tuning

 name                                                                                              currentsetting defaultsetting scope
 ------------------------------------------------------------------------------------------------- -------------- -------------- -----
 optlevel                                                                                          ase_current    ase_current        3
 optgoal                                                                                           allrows_dss                                                                       1              1                  7
 no_stats_distinctness: allow duplicate estimates without stats                                    0              0                  7
 conserve_tempdb_space: keep estimated tempdb below resource granularity                           1              1                  7
 search_engine_timeout_factor                                                                      1              1                  7
 cr559034: avoid preferring non-covering over covered index scans                                  1              1                  7
 allow_wide_top_sort: allow max row size to be exceeded for top sorts                              1              1                  7
 cr562947: OPTLEVEL EXCEPTION SEE CR - allow cursor table scans                                    1              1                  7
 data_page_prefetch_costing: clustered row bias added                                              1              1                  7
 mru_buffer_costing: wash size buffer limit for MRU                                                1              1                  7
 cr546125: implicitly updatable cursor non-unique index scan                                       1              1                  7
 cr545771: improves multi-table outer-join and semi-join costing                                   1              1                  7
 cr545653: avoid inner table buffer estimate starvation                                            1              1                  7
 cr545585: covered iscan CPU costing too expensive                                                 1              1                  7
 cr545379: disallow reformatting on user forced index scan                                         1              1                  7
 cr545180: avoid reformat with no sargs if useful index exists                                     1              1                  7
 cr545059: reduce usage of buffer manager optimization sorts                                       1              1                  7
 cr544485: mark subquery join predicates with distinct view as sargs                               1              1                  7
 cr556728: facilitates merge joins between small tables                                            1              1                  7
 cr534175: compute GROUP BY worktables in nested subqueries only once when possible                1              1                  7
 cr531199: increases the number of useful nested loop join plans considered                        1              1                  7
 cr500736: supports nocase sortorder columns in mergejoin and hashjoin keys                        1              1                  7
 cr487450: improves DISTINCT costing of multi-table outer joins and/or semi-joins                  1              1                  7
 cr467566: allow abstract plans and statement cache to work together                               1              1                  7
 avoid_bmo_sorts: avoid sorts used only for buffer manager optimization                            1              1                  7
 cr497066: infer the nullability of isnull() by looking at its parameters                          1              1                  7
 cr421607: support NULL=NULL merge and hash join keys                                              1              1                  7
 distinct_exists_transform: transform distinct to semi-join                                        1              1                  7
 cr552795: eliminate duplicate rows during reformatting when they're not needed                    1              1                  7
 outer_join_costing: outer join row counts and histogramming                                       1              1                  7
 join_duplicate_estimates: avoid overestimates of dups in joins                                    1              1                  7
 auto_temptable_stats: auto generation of statistics for #temptables                               1              1                  7
 use_mixed_dt_sarg_under_specialor: allow special OR in case of mixed datatype sargs in IN/OR list 1              1                  7
 full_index_filter: eliminate non-covered full index scan strategies                               0              0                  7
 timeout_cart_product: timeout queries involving cartesian product and more than 5 tables.         1              1                  7
 in_list_general_or: optimize in lists under general ors                                           1              1                  7
 multi_attribute_density_costing: Use legacy multi-attribute density costing technique             0              0                  7
 disable_nonbin_sortorder_interpolation: turn off non-binary sort order interpolation costing      0              0                  7
 cr611385: enable ScanValues costing                                                               1              1                  7
 cr574923: extend search space hidden by greedy algorithm                                          1              1                  7
 cr614461: enable in-order rid scan estimates                                                      1              1                  7
 cr611637: avoid duplicate NULL selectivity                                                        1              1                  7
 cr619965: dense frequency for 'Jan  1 1900 12:00:00:000AM'                                        1              1                  7
 cr439123: 0.0 range density for low cardinality tables                                            1              1                  7
 cr619756: DISTINCT, EXISTS, and GROUP BY row estimation                                           1              1                  7
 cr624835: correlated equi-join constant costing                                                   1              1                  7
 cr628311: subquery decorrelated store index costing                                               1              1                  7
 cr628845: ORDER BY consumes parallel bmo sorts                                                    1              1                  7

 Je vous laisse le soin de comparer les différences entre ase_current et ase_default...... Innocent

 Le paramètre 'optimizer level' permet d'activer les changements de l'optimiseur de façon plus personnelle et ceux pas divers moyens (login script, paramètre de session, server...).

 Les valeurs possibles pour 'optimizer level' sont:

     ase_current: Active à tous les changements de l'optimiseur à partir de l'ESD actuelle.
    ase_default: désactive toutes les modifications optimiseur depuis la version de base. C'est la valeur par défaut, et correspond actuellement à  ASE 15.0.3 ESD # 1.
    ase1503esd2: Active à tous les changements de l'optimiseur à partir d'ASE 15.0.3 ESD # 2.
    ase1503esd3: Active à tous les changements de l'optimiseur à partir d'ASE 15.0.3 ESD # 3.
    ase1503esd4: Active à tous les changements de l'optimiseur à partir d'ASE 15.0.3 ESD # 4.

L'option existe aussi à partir de ASE 15.5 ESD 2

Pour plus d'information, C'est ici 

 Faut-il l'activer?

 Oui, Il est recommandé d'utiliser le niveau d'optimiseur ase_current. Cependant pour des environnements existants, des tests de performance sont vivement conseillés... 

Stack Trace et Engine exited with signal 11


Le serveur démarre, tout semble normal. Mais dès que les premières connexions arrivent, le serveur tombe. Dans l'erreur log, on trouve ces petits mots doux.

0:00000:00000:2010/06/14 17:03:57.80 kernel  Task with kpid 3d003d running on failed engine
00:00000:00000:2010/06/14 17:03:57.80 kernel  Engine exited with signal 11
00:00000:00000:2010/06/14 17:03:57.81 kernel  kpenginedied: killed kpid 3997757 which was running on engine 4
00:00000:00000:2010/06/14 17:04:34.71 kernel  engine 5, os pid 8128  exited
00:00000:00000:2010/06/14 17:04:34.71 kernel  Process 8128 exited with status 0
00:00000:00000:2010/06/14 17:04:34.71 kernel  Task with kpid 400040 running on failed engine
00:00000:00000:2010/06/14 17:04:34.71 kernel  Engine exited with signal 11
00:00000:00000:2010/06/14 17:04:34.71 kernel  kpenginedied: killed kpid 4194368 which was running on engine 5
00:00000:00000:2010/06/14 17:27:51.02 kernel  engine 2, os pid 8107  exited
00:00000:00000:2010/06/14 17:27:51.03 kernel  Process 8107 exited with status 0
00:00000:00000:2010/06/14 17:27:51.03 kernel  Task with kpid 4c004c running on failed engine
00:00000:00000:2010/06/14 17:27:51.03 kernel  Engine exited with signal 11
01:00000:00000:2010/06/14 17:27:51.04 kernel  Current process (0x4d004d) infected with signal 11 (SIGSEGV)
01:00000:00000:2010/06/14 17:27:51.05 kernel  Address 0x0x00000000018a5520 (lock_address_verify+0x30), siginfo (code, address) = (1, 0x0x00000000000077e0)
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x0000000001673b95 pcstkwalk+0x30()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x0000000001673989 ucstkgentrace+0x199()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x000000000162cede ucbacktrace+0x40()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x000000000074aa0c terminate_process+0xa7c()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x0000000001654755 kisignal+0x255()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x00000000018a5520 lock_address_verify+0x30()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x00000000013343c7 astc_lastchance_taskcleanup+0x8e()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x000000000074a9ef terminate_process+0xa5f()
01:00000:00000:2010/06/14 17:27:51.05 kernel  pc: 0x00000000010da9ad terminator+0xb()
01:00000:00000:2010/06/14 17:27:51.05 kernel  end of stack trace, kernel service process: kpid 5046349
00:00000:00000:2010/06/14 17:27:51.05 kernel  kpenginedied: killed kpid 1900573 which was affinitied to engine 2
00:00000:00000:2010/06/14 17:27:51.06 kernel  kpenginedied: killed kpid 4980812 which was running on engine 2
03:00000:00000:2010/06/14 17:46:42.61 kernel  Engine 0 (os pid 8067) has died, server is performing emergency shutdown
07:00000:00000:2010/06/14 17:46:42.61 kernel  Engine 0 (os pid 8067) has died, server is performing emergency shutdown
03:00000:00000:2010/06/14 17:46:42.61 kernel  pc: 0x0000000001673b95 pcstkwalk+0x30()
03:00000:00000:2010/06/14 17:46:42.61 kernel  pc: 0x0000000001673989 ucstkgentrace+0x199()
03:00000:00000:2010/06/14 17:46:42.61 kernel  pc: 0x000000000162cede ucbacktrace+0x40()
03:00000:00000:2010/06/14 17:46:42.61 kernel  pc: 0x000000000163b9de keipanic+0xff()
03:00000:00000:2010/06/14 17:46:42.61 kernel  pc: 0x00000000019645c0 kpsched+0x5e0()
03:00000:00000:2010/06/14 17:46:42.61 kernel  end of stack trace, kernel service process: kpid 2752554
03:00000:00000:2010/06/14 17:46:42.61 kernel  ueshutdown: exiting
03:00000:00000:2010/06/14 17:46:42.61 kernel  os_notify_process: kill failed.  pid 8067 No such process
03:00000:00000:2010/06/14 17:46:42.61 kernel  Abnormal exit detected - ASE process level execution bindings will be cleared on startup.
07:00000:00000:2010/06/14 17:46:42.61 kernel  pc: 0x0000000001673b95 pcstkwalk+0x30()
01:00000:00000:2010/06/14 17:46:42.61 kernel  Engine 0 (os pid 8067) has died, server is performing emergency shutdown
07:00000:00000:2010/06/14 17:46:42.62 kernel  pc: 0x0000000001673989 ucstkgentrace+0x199()
07:00000:00000:2010/06/14 17:46:42.62 kernel  pc: 0x000000000162cede ucbacktrace+0x40()
07:00000:00000:2010/06/14 17:46:42.62 kernel  pc: 0x000000000163b9de keipanic+0xff()
07:00000:00000:2010/06/14 17:46:42.62 kernel  pc: 0x00000000019645c0 kpsched+0x5e0()
07:00000:00000:2010/06/14 17:46:42.62 kernel  end of stack trace, kernel service process: kpid 3276850
01:00000:00000:2010/06/14 17:46:42.69 kernel  pc: 0x0000000001673b95 pcstkwalk+0x30()
01:00000:00000:2010/06/14 17:46:42.70 kernel  pc: 0x0000000001673989 ucstkgentrace+0x199()
01:00000:00000:2010/06/14 17:46:42.70 kernel  pc: 0x000000000162cede ucbacktrace+0x40()
01:00000:00000:2010/06/14 17:46:42.70 kernel  pc: 0x000000000163b9de keipanic+0xff()
01:00000:00000:2010/06/14 17:46:42.72 kernel  pc: 0x00000000019645c0 kpsched+0x5e0()
01:00000:00000:2010/06/14 17:46:42.72 kernel  end of stack trace, kernel service process: kpid 2490406


Linux RHEL5 / ASE 15.0


 C'est un prés-requis d'installation.

Pour un Linux RHEL5


Pour Suse10



Utilisation de sysquerymetrics

La vue sysquerymetrics permet de capturer des compteurs sur des requêtes d'une base. C'est une vue de la table sysqueryplans.

Cette vue est disponible à partir de la version 15 de SYBASE ASE


On activer la prise de compteur :

  • Au niveau du serveur : sp_configure 'enable metrics capture',1
  • Au niveau d'un session : set metric_capture on


Avant d'interroger la vue sysquerymetrics, il est recommander de lancer un " sp_metrics 'flush' "


On peut accéder aux métriques :

  • soit via la procédure sp_metrics ('show', 'filter'...)
  • soit en requetant directement sur la vue sysquerymetrics

Exemple d'interrogation des query metrics :

select top 10 cnt*lio_avg as "CUMULATIVE_IO", cnt as "COUNT", lio_avg as "AVG IO", convert(char(50), qtext) +" [...]" as "QUERY" from sysquerymetrics where sequence=0 order by cnt*lio_avg desc



Pb de performances suite à migration en SYBASE 15

Cet article résume quelques problèmes que l'on a eu lors de la migration de serveurs SYBASE 12.0 / 12.5 en 15. Tous les problèmes rencontrés ont été corrigés ou un contournement a été trouvé et mis en place.


Problème de lenteur sur un batch utilisant massivement des requêtes dynamiques impliquant une table temporaires.

Suite à une migration 12.5 vers 15, nous avons constaté qu'un batch utilisant massivement des requêtes dynamiques était fortement ralenti. En effet, l'application fait des milliers voire des millions de requête / curseur avec une jointure sur une table temporaire (table en #).
Les requêtes étant quasiment les mêmes, nous avons identifié qu'elles recompilaient systématiquement leur plan d'exécution (5 millions sur un run)

L'optimiseur SYBASE recompile les plans des statements car il s'appuit sur les id des tables temporaires. Or, il change à chaque fois. Nous avons alors positionné le traceflag 299 qui permet de ne pas recompiler les statements à chaque exécution. A ce que j'ai compris, ce traceflag permet à l'optimiseur SYBASE d'aller chercher le plan d'un statement en cache par rapport au checksum de la requête et non plus des id des tables.

Pour info, ce traceflag comportait des bugs jusqu'en version 12.5.4. Pourquoi SYBASE ne l'a pas mis par défaut, ca, c'est une autre question !!!!

Nous avons eu un gain énorme en terme de CPU ainsi que les temps d'exécution du batch complet (Avant durée 2h et CPU 80%, Apres 1h et CPU 40%)

Cette analyse a pu se faire grâce à Asemonlogger nouvelle version. Dans l'onglet 'summary' / Tableau 'Summary Statistics' / Paragraphe 'Statement Cache Activity', nous avions autant de NumRecompilesSchemaChanges que de HitCount. 



Problème de contention sur la table syslogins

Nous avons constaté sur un batch qu'une contention très importante était apparue en version 15. Le batch lance des milliers voire des millions de connexions / déconnexions au serveur SYBASE. La contention se situait sur la ligne concernant le login qui lançait le batch.

Depuis la version 12.5.4, le serveur ASE écrit systématiquement les informations de comptabilité de CPU et IO dans la table syslogins de la base master. (Correction d'un problème : CR485461)

Pour désactiver l'écriture de ces compteurs, nous avons activer le traceflag 8101 (Annule la Correction citée ci-dessus).

En parallèle, nous avons désactiver la mémorisation de la dernière date de login via la commande suivante :

sp_passwordpolicy 'set', 'enable last login updates', 0 


Nous avons aussi augmenter les intervalles de temps que SYBASE utilise pour 'flusher' les compteurs CPU et IO lors des connexions.

sp_configure accounting
2> go
Msg 17411, Level 16, State 1:
Server 'DATASERVER', Procedure 'sp_configure', Line 322:
Configuration option is not unique.

 Parameter Name                 Default              Memory Used Config Value         Run Value            Unit                 Type
 ------------------------------ -------------------- ----------- -------------------- -------------------- -------------------- ----------
 cpu accounting flush interval          200                    0          200                  200         clock ticks          dynamic
 i/o accounting flush interval         1000                    0         1000                 1000         clock ticks          dynamic

 Nous les avons passer à 2147483647.


Problème de contention du le procedure cache

Il arrive que l'on détecte une forte charge CPU sur un serveur ASE 15 à mettre en corrélation avec une contention sur le procedure cache (Resource->rproccache_spin très élevé sur l'onglet spinlocks de Asemonlogger). Cela est du à la nouvelle gestion de l'allocation mémoire dans le procedure cache.

Un contournement proposé par SYBASE est de mettre le traceflag 753 qui permet de revenir au mode de gestion du procedure cache 12.5.



A suivre....








Sysam: licence non reconnue

Erreur remontée dans la log du SGBD:


$ 00:00000:00000:2009/04/27 15:43:35.06 kernel  SySAM: Using licenses from: /$SYSAMPATH/licenses
00:00000:00000:2009/04/27 15:43:35.76 kernel  SySAM: Failed to obtain 1 license(s) for ASE_CORE feature from license file(s) or server(s).
00:00000:00000:2009/04/27 15:43:35.76 kernel  SySAM: Licensed number of users already reached.
00:00000:00000:2009/04/27 15:43:35.76 kernel  SySAM: License feature name:  ASE_CORE
00:00000:00000:2009/04/27 15:43:35.76 kernel  SySAM: License search path:   /$SYSAMPATH/dev_conf.lic:
00:00000:00000:2009/04/27 15:43:35.76 kernel  SySAM: FLEXnet Licensing error:-4,132
00:00000:00000:2009/04/27 15:43:35.76 kernel  SySAM: For further information, refer to the Sybase Software Asset Management website at
00:00000:00000:2009/04/27 15:43:35.76 kernel  There is no valid license for ASE server product. Installation date is not found or installation grace period has expired. Server will not boot.

Dans ce cas: le serveur de licence est actif et reconnu. La commande sysam status -a permet de voir, que la connexion avec le serveur sysam se fait correctement et qu'il ya des licences de libre (licence site).



Il y a dans $SYBASE/$SYBASE_ASE un répertoire sysam dans lequel il y a un fichier définissant les propriétés du serveur de licence définie lors de la création du serveur (srvbuil). Ce fichier contient en autre des paramètres qui définissent le type de licence:


 On retrouve ces deux paramètres dans le fichier de licence (Truc.lic)


 Il suffit de remplacer les paramètre dans le fuchier avec ceux de la licence générée et de relancer le serveur.