Est-ce que toutes les versions du serveur SQL reconstruire les index automatiquement ou un défaut de reconstruction critères?

StackOverflow https://stackoverflow.com/questions/581592

Question

Est-ce que toutes les versions du serveur SQL reconstruire les index automatiquement ou un défaut de reconstruction critères? Je comprends les statistiques sont automatiquement recréés, mais pas sûr si les index font aussi bien.

Était-ce utile?

La solution

La reconstruction des index ne sont pas automatiquement pris en charge dans une version de Microsoft SQL Server -. La raison en est que les indices de reconstruction peuvent potentiellement être des opérations très coûteuses, et ont donc besoin planification minutieuse et la planification

Dans de nombreux environnements spéciaux scripts seront écrits pour gérer cela, par exemple:

http: //weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx

Notez que si SQL peut mettre à jour automatiquement les statistiques pour vous dans de nombreux cas, il y a un gain de performance à être en gérant ces plus attentivement aussi bien.

Autres conseils

Comme les gens ont mentionné ici, vos index ne reconstruisent pas automatiquement. Ceci est un gros problème dans SQL Server, comme vos index fragmenteront au fil du temps. Votre pourrait trouver vos index sont 95% plus fragmenté, ce qui affecte les performances des requêtes mal.

Voici une requête simple pour vérifier la fragmentation sur vos index existants:

DECLARE @DBNAME VARCHAR(130);
SET @DBNAME = 'MYDBNAME';

DECLARE @DBID INT;
SET @DBID = DB_ID(@DBNAME);

SELECT
OBJECT_ID AS objectID
, index_id AS indexID
, avg_fragmentation_in_percent AS fragmentation
, page_count 
INTO #indexDefragList
FROM
sys.dm_db_index_physical_stats 
(@DBID, NULL, NULL , NULL, N'Limited')
WHERE
index_id > 0
OPTION (MaxDop 1);

SELECT
i.[name] as indexname,
d.fragmentation,
d.page_count
FROM
#indexDefragList d
INNER JOIN sys.indexes i
ON d.objectid = i.object_id
ORDER BY 
d.fragmentation DESC

DROP TABLE #indexDefragList

Ceci renvoie une liste de tous les index dans votre avec leur fragmentation actuelle% DB.

Vous pouvez facilement créer un script pour reconstruire automatiquement ou les réorganiser. Il y a un grand article de SQLFool sur cette , y compris une pré complète script a.

Pour développer ce que Chris a dit:

En ce qui concerne les statistiques, les colonnes ne sont pas couvertes par un indice ne verront pas leurs statistiques mises à jour par la reconstruction de tous les index. Ils peuvent être mis à jour périodiquement par SQL Server mais vous devrez peut-être faire vous-même avec l'instruction UPDATE STATISTICS.

SQL Server 2005 détermine si la mise à jour des statistiques automatiquement en fonction des modifications aux compteurs de modification de la colonne (colmodctrs).

Un objet de statistiques est considérée comme obsolète dans les cas suivants:

taille de la table de 1.Procédé est passé de 0 à> 0 lignes.

2.Le numéro de lignes dans la table lorsque les statistiques ont été recueillies ont été 500 ou moins, et la colmodctr de la colonne principale de l'objet de statistiques a changé de plus de 500 depuis.

Tableau 3.Le avait plus de 500 lignes lorsque les statistiques ont été recueillies et le colmodctr de la principale colonne de l'objet de statistiques a changé de plus de 500 + 20% du nombre de lignes dans la table lorsque les statistiques ont été réunis

Vous pouvez trouver la référence suivante en ce qui concerne les statistiques d'utilisation:

http: //blogs.technet .com / rob / archives / 2008/05/16 / statistics.aspx-sql-server

Espérons que cela aide à se sentir, mais sans poser d'autres questions.

Cheers, John

Il doit être horaire et vous arrangé.

Lors du tri dehors, cela dépend de la taille de vos tables et de maintenance.

En outre, les statistiques sont recréés automatiquement lorsque les index sont reconstruits, mais peuvent être programmées séparément.

Pour une solution rapide, en supposant une belle fenêtre d'entretien à long et pas trop grand (jusqu'à quelques 100 SGB), programmer ceci:

EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)'

Edit: uniquement pour> SQL 2005 ce SQL

Comme noté @ Chris, les index ne sont pas automatiquement reconstruits dans une version SQL Server. la maintenance des index correct manque souvent à des sites sans rôle de DBA dédié, et souvent lorsque les bases de données sont simplement déplacés du développement dans la production (ainsi que le journal des transactions d'entretien).

SQL Server 2005+ a la capacité de le faire en ligne index réorganise et reconstructions en mode hors.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top