SQL Server - La FAQConsultez toutes les FAQ

Nombre d'auteurs : 13, nombre de questions : 119, dernière mise à jour : 31 mai 2011  Ajouter une question

 

Question / réponses à tout ce que vous avez toujours voulu savoir sur Microsoft SQL Server sans jamais oser le demander


SommaireTrucs et Astuces en T-SQLValidation des données (5)
précédent sommaire suivant
 

Pour vérifier qu'une valeur entrée est une date, nous utilisons la fonction IsDate Exemple :

Code tsql : Sélectionner tout
1
2
3
DECLARE @datestring varchar(8) 
SET @datestring = '12/21/98' 
SELECT ISDATE(@datestring)

Mis à jour le 28 septembre 2005 WOLO Laurent

Pour vérifier qu'une valeur entrée est numerique, nous utilisons la fonction IsNumeric
Exemple :
Cet exemple renvoie 1 car la colonne zip comprend des valeurs numériques valides.

Code tsql : Sélectionner tout
1
2
3
4
USE pubs 
SELECT ISNUMERIC(zip)  
FROM authors 
GO

Mis à jour le 28 septembre 2005 WOLO Laurent

Si vous n'avez pas la moindre sauvegarde complète et si vous n'êtes pas dans un mode de recouvrement de type FULL c'est impossible.

Si vous avez fait une sauvegarde complète et êtes dans le mode de recouvrement de type FULL, c'est possible.

Pour cela il vous faut :

  • notez l'heure de survenance de l'incident
  • placez la base en mode utilisateur unique (ALTER DATABASE ... SET SINGLE USER WITH ROLLBACK IMMEDIATE)
  • sauvegarder le journal des trannsactions
  • restaurer la complète en mode NORECOVERY
  • restaurer le JT en mode RECOVERY avec un STOPAT calculé sur l'heure de survenance de l'incident moins 1 minutes.

La seul chose que vous pouvez faire si la ma noeuvre ci dessus est impossible, c'est d'utiliser un outil comme log explorer de Lumigent ou encore celui de Redgate Software pour "voir" le journal de transaction. Mais pour des raisons de paradoxe temporel il est strictement impossible d'annuler un transaction finalisée.

Ce sont des choses qu'il faut prévoir AVANT !

N'oubliez jamais que les données sont un patrimoine important de l'entreprise... Dans le service informatique, les données sont le capital LE PLUS IMPORTANT... ce que les informaticiens ont tendance à oublier !

Mis à jour le 3 mai 2006 SQLpro

En mettant

Code tsql : Sélectionner tout
SET XACT_ABORT ON

Mis à jour le 7 juillet 2007 maitrebn

Voici quelques requêtes qui vous permettrons de noter la qualité de vos index, mais aussi d'effacer ceux inutilisés.

Code sql : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select OBJECT_NAME(IUS.object_id), I.name, IUS.user_seeks, IUS.user_scans, IUS.user_lookups, IUS.user_updates,  
       IUS.user_seeks + IUS.user_scans + IUS.user_lookups AS Total_use,  
       T.user_seeks + T.user_scans + T.user_lookups AS Table_use,  
       (CAST(IUS.user_seeks + IUS.user_scans + IUS.user_lookups AS FLOAT) /  
        NULLIF(CAST(T.user_seeks + T.user_scans + T.user_lookups AS FLOAT), 0)) * 100 AS efficacite_percent  
from   sys.dm_db_index_usage_stats AS IUS  
       INNER JOIN sys.indexes AS I  
             ON IUS.object_id = I.object_id  
                AND IUS.index_id = I.index_id    
       INNER JOIN sys.dm_db_index_usage_stats AS T  
             ON IUS.object_id = T.object_id  
                AND T.index_id IN (0, 1)  
where  IUS.database_id = DB_ID()  
  AND  I.name NOT IN (SELECT CONSTRAINT_NAME   
                      FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS)  
ORDER  BY efficacite_percent
Cette requête mesure l'efficacité d'un index par rapport à l'utilisation de la table et donne un pourcentage. plus ce pourcentage est élevé, et plus cet index est utilisé au détriment de la table.

Les index dont la mesure d'efficacité tend vers zéro sont à supprimer.

A noter les index sous-jacents aux contraintes SQL (PRIMARY KEY et UNIQUE) ne sont pas scrutés.

Cette requête n'a d'intérêt que sur un serveur en exploitation n'ayant pas été récemment arrêté.

Code sql : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
select 'DROP INDEX [' + I.name +'] ON [' + SCHEMA_NAME(o.schema_id) + '].['+ OBJECT_NAME(IUS.object_id) +'];'  
from   sys.dm_db_index_usage_stats AS IUS  
       INNER JOIN sys.objects AS o  
             ON IUS.object_id = o.object_id   
       INNER JOIN sys.indexes AS I   
             ON IUS.object_id = I.object_id   
                AND IUS.index_id = I.index_id     
where  database_id = DB_ID()   
  AND  user_seeks + user_scans + user_lookups = 0   
  AND  I.name NOT IN (SELECT CONSTRAINT_NAME    
                      FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS)
Cette requête permet de générer un script de suppression des index inutilisés. De la même façon cette requête ne prends pas en compte les index sous-jacents aux contraintes (clefs primaires et unicité).

Cette requête n'a d'intérêt que sur un serveur en exploitation n'ayant pas été récemment arrêté.

Code sql : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
WITH  
T_IDX AS (SELECT TABLE_SCHEMA, TABLE_NAME, i.name AS INDEX_NAME,   
                 c.name AS COLUMN_NAME, key_ordinal AS ORDINAL_POSITION  
          FROM   sys.indexes AS i  
                 INNER JOIN sys.objects AS o  
                       ON i.object_id = o.object_id  
                 INNER JOIN sys.schemas AS s  
                       ON o.schema_id = s.schema_id  
                 INNER JOIN INFORMATION_SCHEMA.TABLES AS T  
                       ON s.name = T.TABLE_SCHEMA AND o.name = TABLE_NAME  
                 INNER JOIN sys.index_columns AS ic  
                       ON i.object_id = ic.object_id  
                          AND i.index_id = ic.index_id  
                 INNER JOIN sys.columns AS c  
                       ON i.object_id = c.object_id  
                          AND ic.column_id = c.column_id  
          WHERE is_included_column = 0),  
T_CFK AS (SELECT TC.TABLE_SCHEMA, TC.TABLE_NAME, TC.CONSTRAINT_NAME,  
                 COLUMN_NAME, ORDINAL_POSITION  
          FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC  
                 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU  
                       ON TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA  
                          AND TC.TABLE_NAME = KCU.TABLE_NAME  
                          AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME  
          WHERE  CONSTRAINT_TYPE = 'FOREIGN KEY')  
SELECT T_CFK.TABLE_SCHEMA, T_CFK.TABLE_NAME, T_CFK.CONSTRAINT_NAME  
FROM   T_CFK  
EXCEPT      
SELECT T_CFK.TABLE_SCHEMA, T_CFK.TABLE_NAME, T_CFK.CONSTRAINT_NAME  
FROM   T_IDX  
       INNER JOIN T_CFK  
             ON T_IDX.TABLE_SCHEMA = T_CFK.TABLE_SCHEMA   
                AND T_IDX.TABLE_NAME = T_CFK.TABLE_NAME  
                AND T_IDX.COLUMN_NAME = T_CFK.COLUMN_NAME  
WHERE (SELECT COUNT(*)  
       FROM   T_IDX AS X  
       WHERE  X.TABLE_SCHEMA = T_CFK.TABLE_SCHEMA   
         AND  X.TABLE_NAME = T_CFK.TABLE_NAME  
         AND  X.COLUMN_NAME = T_CFK.COLUMN_NAME  
       GROUP  BY INDEX_NAME) = (SELECT COUNT(*)  
                                FROM   T_IDX AS K  
                                WHERE  K.TABLE_SCHEMA = T_CFK.TABLE_SCHEMA   
                                  AND  K.TABLE_NAME = T_CFK.TABLE_NAME  
                                  AND  K.COLUMN_NAME = T_CFK.COLUMN_NAME  
                                 GROUP  BY INDEX_NAME);
Cette requête donne les contrainte d'intégrité référentielles n'ayant pas d'index correspondant (quelque soit l'ordre des colonnes).

Mis à jour le 24 mai 2009 SQLpro

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique SQL-Server