Archive pour la catégorie ‘SQL Server’

SQL Rally Francophone

2 août 2011

Avec mes confrères du GUSS (le groupe utilisateur SQL Server français) et mes confrères MVP, nous sommes en train d’organiser un important évènement SQL Server pour la fin de l’année à Paris.

www.sqlpass.orgGUSS

Nous avons choisi de nous caler sur le modèle d’un événement organisé par le PASS (Professional Association SQL Server), le groupe utilisateur qui fait référence dans le monde (mais surtout très présent aux USA).

image

Le projet n’est encore que dans ses premières étapes et pour avoir le maximum d’informations et nous aider sa mise en place, nous avons fait un sondage afin de connaitre vos souhaits :

 

Sondage SQL Rally Francophone – Paris – Décembre 2011

 

Vous devriez en avoir pour 10 minutes maxi alors prenez le temps de le remplir sérieusement Sourire.

Merci.

Denali CTP3

22 juillet 2011

Décidemment, depuis mardi dernier, je veux poster sur la CTP3 de la prochaine version de SQL Server (codename Denali) mais je n’y arrive pas.

C’est un peu par manque d’inspiration… Je ne veux pas tomber dans le simple relaying de news et mes confrères MVP ont déjà posté les traditionnelles listes de fonctionnalités.

Je vous renvoie donc vers eux :

Et je vous mets quand même les liens de téléchargement :

Denali CTP3 : ICI

Juneau (SSDT – SQL Server Development Tools) : ICI

 

Je vais bien évidemment dans ce blog vous parler de Denali mais je vais prendre un style différent.

Je vais plutôt vous livrer sous la forme d’un journal de bord ma prise en main du produit. (Evidemment, je ferai comme-ci je le découvrais et n’avais pas déjà joué avec les précédentes versions).

SQL Server étant un produit riche, puissant et complexe, je vais surtout me concentrer sur les outils que j’utilise le plus au quotidien, à savoir les outils de BI.

 

Les mots-clés pour le teasing : Crescent, BISM, PowerPivot, SSIS, Reporting Services Alerts, etc.

Uptime SQL Server

25 juin 2011

 

Pour savoir depuis quand tourne votre instance c’est avec cette commande :

 

SELECT sqlserver_start_time
FROM sys.dm_os_sys_info

Enjoy !

Corriger les utilisateurs orphelins

21 juin 2011

image

 

Un post rapide de chez un client pour livrer une solution simple…
Pour rassurer tout le monde tout de suite, je ne vais frapper personne ; je dis “corriger” dans le sens de “réparer”.

Problème : vous restaurez une base de données et, évidemment, les utilisateurs ne sont plus mappés aux logins (Connexions dans SSMS en fr-FR) .
Evidemment, on a le problème si les SID sont différents évidemment, comme dans le cas d’un changement de machine/domaine.

C’est ce qu’on appelle des utilisateurs orphelins (orphan users)

Solutions :

  • mode bourrin : supprimer l’utilisateur et le recréer
  • mode propre (car il y a peut-être beaucoup de permissions placées sur l’utilisateur) : utiliser la procédure sp_change_users_login

Ex:

exec sp_change_users_login 'Update_One', 'TestJPR', 'TestJPR'

 

PS : dans la prochaine version de SQL Server (Denali), il y aura les Contained Databases qui permettront de ne plus avoir de LOGIN associés aux USERS d’une base.

Et le Capacity Planning, bordel !

19 juin 2011
Sous-Titre : TempDB a explosé

Cas classique : aucune architecture physique ou questionnement sur l’espace disque n’a été fait à l’installation de SQL Server. En production, vos bases grossissent et pas forcément de la meilleure des façons.

 

Retenez ce mot : CAPACITY PLANNING (en fr-FR : prévision de volumétrie).

C’est une obligation sur une instance de production. Et pas besoin d’aller voir un marabout pour trouver les bons chiffres, souvent, des calculs simples permettent d’obtenir une bonne vision

Ex :

   2M de lignes par semaine
x 1ko la ligne (index et FillFactor pris en compte) 
= 104Go par an.

Il faut ajouter la place pour les backups et autres joyeusetés. Donc à la louche, tous les 1er janvier, allouez directement 250Go (nom de dieu!)

Je m’emporte car ce n’est pas le but de l’article… Admettons que vous soyez DBA ceinture blanche et que vous ne le saviez pas. Après un script bien touffu, vous vous apercevez qu’une de vos bases a grossi anormalement, il va bien falloir réparer.

Mais réparer quoi ? Après tout “c’est fait, c’est fait” comme on dit… Le problème est la fragmentation de votre MDF, NDF, LDF (rayez la mention inutile) sur le disque. Etude de cas avec TempDB (elle aussi fait partie de votre plan de Capacity Planning)

Ma base TempDB est passé de 3Mo (taille par défaut à l’installation de SQL Server) à plus de 2Go lors d’un batch. On peut voir la fragmentation sur disque avec l’outil CONTIG de SysInternals.

CONTIG -a –v <fichier>

image

Attention, je ne parle pas de fragmentation d’index, je parle là du fichier saucissonné sur le disque.

Mais sans utiliser cet outil, on peut deviner le résultat en regardant le rapport d’utilisation du disque dans SSMS. Ci-dessous, on voit les nombreux évènements d’allocations de place sur le disque.

image

Pour défragmenter le fichier, 2 solutions :

  1. Utiliser Contig.exe (sans le –a) pour réduire le nombre de fragment
  2. Recréer un FILE ou un FILEGROUP et vider l’ancien

Je ne détaillerai pas le première solution. C’est la plus simple et celle que je préconise. Mais pour le sport, on va détailler la seconde.

Création d’un fichier dans le même FILEGROUP :

  • on crée un nouveau fichier dans le FILEGROUP (de la bonne taille cette fois-ci) histoire d’avoir une allocation d’un bloc

ALTER DATABASE [TEMP]
ADD FILE (  
    NAME = N'F2_FILEGROUP1', FILENAME = N'<chemin>',
    SIZE = 204800KB,
    FILEGROWTH = 102400KB)
TO FILEGROUP [FG1]

  • on réduit le fichier fragmenté en le vidant complètement grâce à l’option EMPTYFILE

DBCC SHRINKFILE (N'F1_FILEGROUP1' , EMPTYFILE)

  • on supprime le fichier

ALTER DATABASE [TEMP] REMOVE FILE [F1_FILEGROUP1]

Attention, cela ne marche pas sur les fichiers de LOG ni du PRIMARY FILEGROUP (pour cela il faudra faire une opération offline – ie. avoir une coupure de service)

Création d’un nouveau FILEGROUP :

Pour le changement de FILEGROUP, il suffit de déplacer les index en les recréant en précisant le FILEGROUP.

CREATE CLUSTERED INDEX [IX] ON [Table]
( [Col1] ASC )
WITH (DROP_EXISTING = ON) ON [NEW_FILEGROUP]

 

Evidemment, on évite toutes ces opérations de maintenance (qui peuvent être très couteuses) si on a anticipé tout cela.

Un jour je prendrais le temps de faire un article de fond sur le Capacity Planning (fr-FR: prévision de volumétrie)

Pour conclure, je citerai une de mes citations favorites d’un certain Leonard De Vinci : “Ne pas prévoir, c’est déjà gémir

 

 

PS : débat métaphysique, TempDB est-il féminin ou masculin ? Moi je dirais que c’est un garçon et pourtant c’est une base de données Sourire.

Visualiser les histogrammes des statistiques des index

12 juin 2011

En auditant les statistiques d’une base de de données chez un client, j’ai eu l’idée de créer un rapport qui afficherait de façon plus lisible les STATISTICS des tables.

J’aurai aimé vous faire un cours complet sur les statistiques dans SQL Server mais on va raccourcir un peu.
Quand vous regardez le détail d’une statistique d’une table dans Management Studio, vous obtenez un joli tableau en ASCII-art (cf. ci-dessous).

image

Evidemment, vous savez tous que vous avez toutes les données avec l’instruction DBCC SHOW_STATISTICS(table, index).
Néanmoins, ce n’est pas forcément plus lisible pour autant.

J’ai donc fait un rapport Reporting Services qui appelle les différentes variante de DBCC SHOW_STATISTICS :

DBCC SHOW_STATISTICS(DimCustomer, IX_GeoKey) WITH HISTOGRAM
DBCC SHOW_STATISTICS(DimCustomer, IX_GeoKey) WITH STAT_HEADER
DBCC SHOW_STATISTICS(DimCustomer, IX_GeoKey) WITH DENSITY_VECTOR

Le plus utile est la représentation des histogrammes qui nous renseigne sur la répartition des enregistrements sur les valeurs de la clé.

image

Evidemment, j’en ai profité pour rendre plus lisible les densités (la notation scientifique avec des 10-6 ne me parle pas nativement) et les informations diverses.

Enfin, j’ai créé le rapport avec comme paramètre le nom de la base de données. Le rapport génère les infos pour tous les index.

Dès que j’ai un peu de temps, je traduis tout en anglais et je le pousse sur CodePlex (il n’y a que 2 fichiers RDL mais bon, c’est déjà ça).

 

Tip bonus du jour : si votre base de données utilise des Schemas, pensez à encadrer le nom de la table par des QUOTED_IDENTIFIER (“” ou []) dans l’instruction DBCC SHOW_STATISTICS.

Top des procédures stockées utilisées

31 mai 2011

imageUn petit billet rapide pour livrer une de mes requêtes utilisée lors des audits ou des missions d’optimisation que je réalise.

L’idée est de récupérer dans le cache d’objets la liste des procédures stockées appelées. On utilise les DMV suivantes :

 

  • sys.dm_exec_cached_plans : pour avoir les plans d’exécution de type Proc (procédure stockées)
  • sys.dm_exec_query_stats : pour avoir les statistiques d’exécution (notamment le nombre de fois où le plan a été appelé)
  • sys.dm_exec_sql_text : pour avoir le code T-SQL

Les données remontées par la requête sont à relativiser. En effet, on va chercher des infos “à chaud” et donc les stats sont à pondérer. Premièrement, le nombre d’exécutions est depuis le démarrage de l’instance (ou la création de la proc). Deuxièmement, on ne voit que les procédures dont le plan est dans le cache.

Néanmoins, sur une production qui tourne depuis un moment sans downtime, les chiffres sont suffisamment stables pour être étudiés (avec discernement évidemment).

SELECT
    DB_NAME(sql.dbid), OBJECT_NAME(sql.objectid, sql.dbid), sql.text,
    MAX(qs.execution_count) as hitcounts,
    SUM(total_logical_reads / qs.execution_count) as avg_reads,
    SUM(max_logical_reads) as max_reads, SUM(min_logical_reads) as min_reads
FROM sys.dm_exec_query_stats qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) sql
    INNER JOIN sys.dm_exec_cached_plans cp
        ON cp.plan_handle = qs.plan_handle
        AND cp.objtype = 'Proc'
GROUP BY DB_NAME(sql.dbid), OBJECT_NAME(sql.objectid, sql.dbid), sql.text
ORDER BY MAX(cp.usecounts) * SUM(total_logical_reads / qs.execution_count) DESC

Je vous laisse jouer avec les jointures et l’ORDER BY pour faire votre top idéal.

 

PS : évidemment, cette requête n’est qu’un maillon de la méthodologie que j’emploie mais comme on me la demande quelquefois en formation, je vous la donne. Cadeau Clignement d'œil.

CTP de Juneau

26 mai 2011

Juneau, c’est le nom de code de l’outil de développement de bases de données SQL Server. Il a connu de nombreux noms par le passé (Data Dude, TeamDB, etc.) et j’ai même eu l’occasion de faire des webcast sur les premières versions.

Pourquoi une nouvelle version ? Et bien pour enfin avoir des Designers par exemple (là, je suis ironique).
Plus sérieusement, les fondamentaux sont mis en avant pour fournir un outil digne de ce nom aux développeurs (interfaces en WPF, designers, etc.).

image

La CTP1 de Denali n’intégrait pas Juneau et une CTP spécifique va arriver.

Pour vous inscrire :

https://connect.microsoft.com/BusinessPlatform/InvitationUse.aspx?ProgramID=6951&InvitationID=SSDT-TFMQ-QHVF

Bug dans le Data Collector – Disk Usage

7 mai 2011

Dans le rapport d’utilisation du disque du Data Collector, si vous cliquez sur le détail de la courbe d’évolution de la taille des données, il faudra prendre en compte les erreurs suivantes :

  • Unused Size : la valeur affichée est en fait l’espace utilisé dans les fichiers de données (MDF, NDF, FT)
  • Graphique : l’échelle en ordonnées est fausse (je ne sais même pas d’où viennent les chiffres) et la répartition ne correspond à rien
  • Les valeurs des différents snapshots restent bloquées à la dernière valeur

Seule la colonne Data Size est correcte (ainsi que la tendance du graph).

A noter que les valeurs collectées sont correctes dans le Warehouse. Seul le rapport est incorrect.

Pour avoir les bonnes -dernières- valeurs, je vous invite à regarder le rapport standard sur l’objet Database dans Management Studio ou utiliser un script SQL.

 

Il existe des Work Item sur Connect qui remontent ces erreurs ; le second est celui que je viens de créer avec ce post (votez!)

356518 – Disk usage summary does not display space used for data files

667254 – Data Collector – Disk Usage Collection Set – Display errors

Activer la CLR depuis SSMS

7 mai 2011

En mission, un client me pose une colle (toute relative :-) ) :

“comment activer (ou désactiver) la CLR dans SQL Server … depuis Management Studio ?”

Evidemment, en T-SQL, aucun souci :

sp_configure 'clr enabled', 1 
RECONFIGURE

Par contre, avec un assistant, j’ai séché… Pas longtemps je vous rassure. Donc pour partager voici comment faire avec SQL Server 2008 :

  1. il faut passer par les Facettes (Facets en en-US)

  2. Ensuite, il faut aller dans la Facette “Configuration de la surface d’exposition” et vous trouverez votre bonheur.

La différence avec SQL Server 2005, c’est que ce type de configuration a été centralisé au même endroit et non plus disséminé dans différents outils. Alors maintenant, pensez Facets

PS : c’est dans ces moment là où on voit qu’on vieillit que les outils s’améliorent avec le temps.


Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 203 followers