Dans certains cas, on peut trouver une conception des tables d'une base très générique (surtout en passant par un outil de génération automatique comme Hibernate ou Nhibernate). Ainsi, on peut vouloir optimiser la base en créant des indexes sur certains de ces champs génériques.
Ce script vous permet d'effectuer ce travail en testant l'existance et respectant les normes de nommage des indexes.
Il suffit donc de l'adapter à votre cas et à vos règles internes.
Source / Exemple :
-----------------------------------------------------------------
USE [MaDataBase]
-----------------------------------------------------------------
-- Spécification du champ qui doit être indexé
-----------------------------------------------------------------
DECLARE @NOM_CHAMP AS VARCHAR(50)
SET @NOM_CHAMP = 'MonNomDeChamp'
-----------------------------------------------------------------
DECLARE @TCompleteName AS VARCHAR(500)
DECLARE @SQL AS VARCHAR(MAX)
DECLARE @NomIDX AS VARCHAR(500)
-----------------------------------------------------------------
-- Déclaration du Curseur de sélection
-----------------------------------------------------------------
DECLARE TESTCURSEUR CURSOR
FOR SELECT
'[IDX_'+ UPPER(TAB.TABLE_NAME) +'_'+ UPPER(@NOM_CHAMP) +']' AS TIndex,
'['+ TAB.TABLE_SCHEMA +'].['+ TAB.TABLE_NAME +']' AS TCompleteName
FROM
INFORMATION_SCHEMA.COLUMNS COL
INNER JOIN INFORMATION_SCHEMA.TABLES TAB
ON (TAB.TABLE_SCHEMA = COL.TABLE_SCHEMA AND TAB.TABLE_NAME = COL.TABLE_NAME)
LEFT OUTER JOIN sys.sysindexes IDX
ON IDX.name = 'IDX_'+ UPPER(TAB.TABLE_NAME) +'_'+ UPPER(@NOM_CHAMP)
WHERE
COL.COLUMN_NAME = @NOM_CHAMP
AND
TAB.TABLE_TYPE = 'BASE TABLE'
AND
IDX.name IS NULL
-----------------------------------------------------------------
-- Déclaration du Curseur sur la liste des Bases de données
OPEN TESTCURSEUR
FETCH NEXT FROM TESTCURSEUR INTO @NomIDX, @TCompleteName
WHILE (@@FETCH_STATUS >= 0)
BEGIN
SET @SQL = 'CREATE NONCLUSTERED INDEX '+ @NomIDX +' ON '+ @TCompleteName +'(['+ @NOM_CHAMP +'] ASC) '
SET @SQL = @SQL +'WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, '
SET @SQL = @SQL +'IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) '
SET @SQL = @SQL +'ON [PRIMARY]'
EXECUTE (@SQL)
FETCH NEXT FROM TESTCURSEUR
INTO @NomIDX, @TCompleteName
END
-----------------------------------------------------------------
-- Fermeture du Curseur
CLOSE TESTCURSEUR
-- Libération de la mémoire prise par le Curseur
DEALLOCATE TESTCURSEUR
-----------------------------------------------------------------
Conclusion :
Bon coding
Romelard Fabrice [MVP]
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.