vendredi 27 janvier 2012

Intellisense désactivé sur SQL Server 2008 R2

Tous ceux qui ont installé le SP1 de Visual Studio 2010 ont pu constater que la fonction Intellisense de Management Studio a été désactivée :

plutôt désagréable… c’est quand elle n’est plus là qu’elle nous manque le plus !

Des mises à jour correctives de SQL Server (à partir de la 7ème) corrigeaient ce problème, mais je ne les avais pas installé, trouvant toujours un peu risquées ces petits patchs.

 

Le service pack 1 de SQL Server 2008 R2 règle définitivement ce problème : il suffit donc de l’installer.

Ce qui nous amène ici :

exec xp_msver

image

image

mercredi 25 janvier 2012

Bases de données SQL Server 2012 embarquant la sécurité

Bases de données embarquant la sécurité

clip_image001

En Anglais cela donne 'Contained Database' et en Français 'Contenant-Contenu' ... j'aurai aimé une autre traduction mais bon...

Quelle est l'approche ?

Il s'agit de créer des bases indépendantes de l'instance SQL Server en tout ou partie.

· Base sans relation contenant-contenu (NONE) c'est ce que nous avions jusqu'à 2008 R2

· Base avec relation partielle de type contenant-contenu (PARTIAL)

· Base totalement de type contenant-contenu : cette base est complètement indépendante de l'instance; ce mode n'est pas disponible au jour où j'écris ces lignes

On peut donc embarquer des utilisateurs sans login dans cette version 2012.

Comme pour les connexions, ces utilisateurs pourront être

· Avec mot de passe intégré (c'est une authentification de type SQL)

· Correspondant à un login Windows : mais là on voit mal l'intérêt

Création d'une base de données avec sécurité embarquée

clip_image003

Comme indiqué précédemment, le seul mode disponible à ce jour est le mode partiel.

Attention ce mode demande une configuration du serveur :

clip_image005

image

Une fois cette base créée, on va effectivement pouvoir créer des utilisateurs avec mot de passe intégré :

clip_image007

Ou, par script:

image

A partir de ce moment notre utilisateur fait partie des propriétaires de la base de données et a donc tout pouvoir sur cette base.

Connexion de cet utilisateur à sa base de données

Nous allons devoir modifier légèrement les paramètres de connexion, la notion de serveur disparaissant ici .

clip_image009

clip_image011

Une fois la connexion établie, on voit bien que l'administration du serveur est dé validée :

clip_image013

On ne voit effectivement que la base de données contenant, pas les autres bases du serveur.

Comment le profller voit-il cette 'connexion' ?

clip_image015

Intéressant...il semble utiliser un utilisateur Windows en dur (ou temporaire ?)

Avantages de ces bases

Bien sûr il s'agit de faciliter

· Backups et restores

· Détachement/attachement

Quand on passe d'une instance à une autre.

mardi 24 janvier 2012

Compression de données entières à la volée

Compression des données

Il s'agit de compresser les données à la volée, la perte en CPU consommé étant largement compensée par le gain en entrées sorties disque et en consommation RAM.

Cette fonctionnalité est disponible pour les différentes éditions à partir de SQL Server 2008. (SQL Server 2008R2 et SQL Server 2012)

Deux types de compression sont disponibles :

· Par ligne de table

· Par page

L'idée générale est de réduire les ios disque et la mémoire en consommant un peu de CPU; ce qui a du sens quand on sait que SQL Server est surtout ralenti par les accès disque.

La mise en oeuvre peut se faire au moyen d'un assistant de Management Studio ou de l'instrcution DDL ALTER TABLE.

ALTER TABLE NomTable

REBUILD

WITH (DATA_COMPRESSION = { NONE | ROW | PAGE} )

L'assistant se trouve dans le menu Table -> Stockage

Un des avantages de l'assistant est qu'il peut estimer le gain avant de lancer la compression :

clip_image002

La même table avec un algorithme au niveau page donnant :

clip_image004

Cette fois le gain est 23 Mo ce qui divise la table par deux ce qui est non négligeable.

Méthodes de compression par ligne

Compression des types de données entières

Le principe est de réduire le stockage au nombre d'octets minimum pour stocker le nombre; par exemple, le nombre 1 peut être stocké sur 1 octet, le nombre 549 sur 2 octets, etc.

Voici une table de ce type avant compression :

image

 

clip_image007

La page qui nous intéresse est la 1:89 :

image

 

La ligne 1 est visible dans le slot 0 :

clip_image010

Sans surprise, cette ligne occupe 22 octets (8 + 4 + 2 + 1 + les octets de NULL et les pointeurs)

De même la ligne 2 est visible dans le slot 1 :

clip_image013

Toujours 22 octets...

Insérons des null values pour toutes ces colonnes :

image

 

clip_image015

Le slot 2 fait toujours 22 octets !

Eh oui, en taille fixe les valeurs NULL prennent la place de leur type, un simple booléen donnant le fait que la colonne est NULL ou pas.

Appliquons maintenant la compression de type ligne sur cette table :

image

clip_image017

L'algorithme de compression a alloué des nouvelles pages ce qui ne me surprend guère, vu la complexité de l'opération au niveau des méta données.

image

 

Que sont devenus nos slots ?

clip_image020

Le slot 0 est passé de 22 octets à 9 : on est effectivement dans le cas le plus favorable !

clip_image023

Le slot 1 est passé de 22 octets à 14, ce qui reste tout de même appréciable !

On voit que les gains sont sur le bigint et le int et sans doute un peu de méta données moins nombreuses.

Le slot 3 , plein de valeurs NULL, passe également de 22 octets à 9 :

clip_image026

Conclusion

Le taux de compression sera d'autant plus intéressant si :

· Il y a beaucoup de petites valeurs par rapport au potentiel du type

· Il y a beaucoup d e NULL

lundi 9 janvier 2012

Fonctions analytiques de SQL Server 2012

Ces fonctions sont des extensions des fonctions de ranking de SQL Server 2008, on va donc retrouver la même syntaxe globale.

Voici les données utilisées pour ce script :

image

image

Totalement normalisées donc … mais va pour cette démonstration.

 

Valeur suivante dans le dataset :

LEAD ( Valeur [ ,PasASauter ] , [ DefautSiNull ] )   OVER ( [ ClauseDePartitionnement ] )

Cette fonction servira à faire des comparaisons par exemple :

image

image

Sympa d’avoir pensé aux valeurs par défaut si NULL : cela facilitera les reports…

Valeur précédente dans le dataset :

LAG  ( Valeur [ ,PasASauter ] , [ DefautSiNull ] )    OVER ( [ ClauseDePartitionnement ] )

Symétriques de la précédente :

image

image

 

Première valeur dans un dataset

FIRST_VALUE ( [Valeur )     OVER ( [  ClauseDePartitionnement ] ClauseDeTri  )

La fonction fisrt_value va nous permettre de trouver la colonne dont la valeur est la 1èere et ceci pour tout le dataset ou en le partitionnant.

image

Donne l’année la plus faible de tous les vendeurs :

image

Et cette requête :

image

l’année la plus faible de chaque vendeur

 image

 

Dernière valeur dans un dataset

LAST_VALUE ( [Valeur )
    OVER ( [ Partition ] ClauseDeTri )

Cette fonction est symétrique de la précédente.

Partie de cumul de dataset

CUME_DIST( ) OVER ( [Partition ] ClauseDeTri )

image

image

La meilleure vente de tous les temps a été Paul en 2011 ce qui explique son score de 1 = 100 %

image

 image

Nous donne cette fois la part de la meilleure année de chaque vendeur.

 

Conclusion

Tous ceux qui ont des reports à produire ou des grilles APS.Net apprécieront ces fonctions qui éviteront de faire les calculs en aval de la base.