Database Tuning Engine Advisor

Je viens d’apprendre deux choses avec le MS SQL 2005 Database Tuning Engine Advisor à mes dépends.
Je vais donc les partager avec vous afin que cela ne vous arrive pas! Le contexte: Je ne m’occupe pas en général de SQL 2005 (ou m’occupais pas jusqu’à présent). Ayant un problème de perf important sur une de nos futures applications, j’ai utilisé SQL Profiler pour capturer l’activité, et j’ai voulu ensuite utiliser DTA pour savoir s’il manquait des index. Mais je suis allé trop vite, et je n’ai donc pas compris que DTA ne pouvait pas utiliser la trace.

Lorsque vous donnez un fichier trace à DTA, vous pouvez lui spécifier la base de workload, et la ou les bases à optimiser. Je pensais bien faire en sélectionnant la base « tune » comme base de workload. J’ai bien vu quelques erreur après l’analyse sur des requêtes, mais rien n’indiquait un problème majeur:

[Microsoft][SQL Native Client][SQL Server]Could not find stored procedure  XX.P_TM_XXXXXXXXXXXXXXXX’.

Ce message est dû au fait que la trace ne contient pas de « use my_database » avant l’appel aux procédures stockées. DTA ne trouve donc aucune procédure stockée, et n’analyse donc rien les concernants. Ca m’étonnait qu’il ne trouve aucun index ni stats à créer, mais je ne savais pas l’expliquer. Pour palier à cela, il faut donc choisir la base où sont ces procédures stockées ou jouées les requêtes en tant que base de workload.

Une fois ce message d’erreur passé, j’en ai eu un deuxième,car les problèmes viennent toujours à plusieurs:

[Microsoft][SQL Native Client][SQL Server]SHOWPLAN permission denied in database ‘XXXXX’.

Celui-là est un peu différent. Si la trace contient la colonne LoginName ou NTUserName, DTA rejoue les requêtes avec ce ou ces comptes, qui doivent donc avoir les droits de faire un showplan. Pour palier à ce problème sans donner ce droit, vous pouvez ouvrir la trace, supprimer ces colonnes, et enregistrer la trace sous un autre nom, le temps de jouer DTA. Ainsi il utilisera le compte avec lequel vous l’exécuter pour analyser les requêtes 🙂

Et voilà, maintenant il me propose l’ajout de 50 index, 125 statistiques pour une estimation de +50% en perf!!

Petit outil sympa

Si vous avez comme moi beaucoup d’applications sur votre PC, Update checker est fait pour vous ! Ce petit freeware scan la machine et vous dit les logiciels pour lesquelles une nouvelle version existe, en indiquant votre version versus la nouvelle.

Le tout avec le lien à droite pour télécharger directement!

image

Pour le download, c’est par ici:

http://www.filehippo.com/updatechecker/

Gérer les GPO depuis un VISTA SP1

Si vous souhaitez gérer vos GPO depuis un PC sous Vista SP1, je vous recommande d’utiliser le pack RSAT de Microsoft:

Microsoft Remote Server Administration Tools for Windows Vista (KB941314)

Ce pack est initiallement prévu pour gérer du Windows 2008, mais cela fonctionne avec du 2003 aussi 🙂

Une fois installé, il faut activer les features:

Demandez pourquoi vos admins vont sur les serveurs

Je suis tombé sur une question intéressante dans les newsgroups: Demander pourquoi aux admins pourquoi ils ouvrent une session sur un serveur. La personne aurait voulut le faire par GPO, mais cela n’est pas possible. Son objectif était d’avoir quelque chose de similaire au formulaire que windows 2003 affiche quand on veut redémarrer & co.

J’ai donc écrit un petit script VBS qui pose la question et enregistre la réponse dans l’eventlog application:

 ‘==========================================================================


‘ NAME: <logger.vbs>

‘ AUTHOR: Mathieu CHATEAU, gollum123@free.fr
‘ DATE  : 11/10/2007

‘ COMMENT: <Ask a reason for logging, then keep a trace in Application eventlog>

‘==========================================================================
option explicit
Dim msg, objshell,UserName
Const EVENT_SUCCESS = 0
Set objShell = Wscript.CreateObject(« Wscript.Shell »)
UserName = objShell.ExpandEnvironmentStrings(« %username% »)
msg = InputBox(« Pourquoi ouvrez-vous une session? »)
if msg = «  » then
msg= »a refuse de dire pourquoi »
end if

objShell.LogEvent EVENT_SUCCESS, UserName &  » a ouvert une session car: » & msg
Set objShell = Nothing