2008-10-27 8 views
0

J'ai une application WinForms C# en utilisant une base de données MS SQL Server Express. L'application est déployée sur les PC de nos clients et ils n'ont pas de connaissances en informatique.Application autonome: maintenir la base de données saine/réactive au fil du temps

L'application met à jour la base de données régulièrement et je vois beaucoup de fragmentation sur les fichiers d'index. Comment puis-je maintenir la base de données saine/réactive au fil du temps?

Je pensais à la programmation d'une procédure stockée qui réorganise tous les indices, mais je manque de compétences t-sql; quelqu'un peut-il me conduire dans la bonne direction?

Bas

Répondre

0

J'utilise maintenant des scripts de 2 sql.

SELECT 
    st.object_id AS objectid, 
    st.index_id AS indexid, 
    partition_number AS partitionnum, 
    avg_fragmentation_in_percent AS frag, 
    o.name, 
    i.name 
FROM 
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') st 
join 
    sys.objects o on o.object_id = st.object_id 
join 
    sys.indexes i on st.object_id = i.object_id and i.index_id=st.index_id 

Je cours quand commencer mon programme et de vérifier si mes tables principales a une avg_fragmentation_in_percent de plus de 70. Si donc j'exécutez le script suivant.

SET NOCOUNT ON; 
DECLARE @objectid int; 
DECLARE @indexid int; 
DECLARE @partitioncount bigint; 
DECLARE @schemaname nvarchar(130); 
DECLARE @objectname nvarchar(130); 
DECLARE @indexname nvarchar(130); 
DECLARE @partitionnum bigint; 
DECLARE @partitions bigint; 
DECLARE @frag float; 
DECLARE @command nvarchar(4000); 
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function 
-- and convert object and index IDs to names. 

if (object_id('tempdb..#work_to_do') is not null) 
    DROP TABLE #work_to_do; 

-- Alleen indexen die meer dan x% gefragemteerd zijn 
SELECT 
    object_id AS objectid, 
    index_id AS indexid, 
    partition_number AS partitionnum, 
    avg_fragmentation_in_percent AS frag 
INTO #work_to_do 
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') 
WHERE avg_fragmentation_in_percent > 5.0 AND index_id > 0; 

-- Declare the cursor for the list of partitions to be processed. 
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do; 

-- Open the cursor. 
OPEN partitions; 

-- Loop through the partitions. 
WHILE (1=1) 
    BEGIN; 
     FETCH NEXT 
      FROM partitions 
      INTO @objectid, @indexid, @partitionnum, @frag; 
     IF @@FETCH_STATUS < 0 BREAK; 
     SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name) 
     FROM sys.objects AS o 
     JOIN sys.schemas as s ON s.schema_id = o.schema_id 
     WHERE o.object_id = @objectid; 
     SELECT @indexname = QUOTENAME(name) 
     FROM sys.indexes 
     WHERE object_id = @objectid AND index_id = @indexid; 
     SELECT @partitioncount = count (*) 
     FROM sys.partitions 
     WHERE object_id = @objectid AND index_id = @indexid; 

     SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)'; 
     IF @partitioncount > 1 
      SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10)); 
     EXEC (@command); 
     PRINT N'Executed: ' + @command; 
    END; 

-- Close and deallocate the cursor. 
CLOSE partitions; 
DEALLOCATE partitions; 

-- Drop the temporary table. 
DROP TABLE #work_to_do; 

Ce script défragmente toutes les tables avec une fragmantation de plus de 5%

1

Utilisez l'option DBCC REINDEX si vous pouvez vous permettre de prendre la table hors ligne pour un court moment, alternativement DBCC INDEXDEFRAG. L'option IndexDefrag a été supprimée cependant. Vous pouvez également utiliser l'instruction ALTER INDEX dans SQL 2005/2008.

+0

Note: la commande est DBCC DBREINDEX. –

0

Assurez-vous également que votre base de données FICHIER est moins sujette à la fragmentation. C'est très difficile à faire, car vous ne savez pas quelle est la disposition des disques de vos clients, mais je suggère de commencer votre fichier .MDB à une taille initiale assez grande pour éviter les reconstructions en ligne, qui entraînent du temps et des ressources, et conduisent souvent à la fragmentation au niveau du fichier.

Votre conception d'index a également un impact fragmentation de vos index sont. Vous devez vous assurer que les index que vous insérez dans un lot ont un FILLFACTOR suffisamment bas pour éviter le fractionnement de la page. Débarrassez-vous également de tous les index qui ne sont pas utilisés.

Pour défragmenter vos index, utilisez la commande DBCC DBREINDEX.

1

Ce serait bien d'avoir une procédure stockée réutilisable écrite qui peut faire tout ce que je dois faire sur une base de données en utilisant les meilleures pratiques de programmation d'entretien de DBA.

Comme les statistiques de mise à jour, vérifier les erreurs de page, defrag, réindexation, rétrécir ?, .....

Comme un "Make my DB santé" proc stocké

tous ceux qui ont un script comme ça disponible?

Questions connexes