web-dev-qa-db-fra.com

Shrinkfile Meilleures pratiques et expérience

Préambule: En général, c'est un grand non-non, mais croyez-moi qui sont de rares cas lorsque l'espace est vraiment nécessaire. Par exemple Express Edition est limité à 10 Go. Imaginez que vous avez découvert cela avec une conversion de type de données (une colonne blob), vous pouvez libérer une quantité importante d'espace. Mais après cela, le fichier DB a toujours la même taille que nous le savons et que la limite de 10 Go n'a également pas changé par magie. Donc, une sorte de rétrécissement est nécessaire. C'était un exemple.

Dans mon environnement de test, j'ai effectué:

DBCC SHRINKFILE (DBFile, NOTRUNCATE)
DBCC SHRINKFILE (DBFile, TRUNCATEONLY)

Cela a fait l'affaire (je sais que cela minimise l'espace libre, dans le monde réel, je laisserais un espace libre). Il a fallu plusieurs heures pour finir. Comme nous le savons, il s'agit d'un seul processus fileté comportement étrange DBCC Strinkfile , "Cela fonctionne comme une série de transactions système très petites, donc il n'y a rien à retourner." - Paul Randal http://www.sqlservercenter.com/forums/topic241295-5-1.aspx . Nous savons aussi qu'il gâche la fragmentation de l'index Big Time http://www.msqltips.com/sqlservertip/2055/issues-with-Running-DBCC-SQL-Server-Data- Fichiers / et je peux confirmer cela. Je n'ai pas fait l'expérience du fichier journal de croissance saisie, bien que décrite dans http://www.karaszi.com/sqlserver/info_dont_shrink.asp

J'ai émis quelque chose de INDEX REBUILD Et REORGANIZE et ceux terminés en quelques secondes.

Mes questions:

  1. Quelle est la grosse affaire de rétrécir si je peux simplement fixer la fragmentation de l'index après la rétrécie en quelques secondes? Je ne comprends pas. Ici sur dba stackexchange the "Shrink" Topic ( https://dba.stackexchange.com/tags/shrink/info ) dit "À peu près la pire chose que vous puissiez faire dans une base de données SQL Server. Dans Short: il sacrifie la performance pour gagner de la place. " Plus fait référence à un autre article populaire à ce sujet. Mais la fragmentation d'index peut être corrigée.
  2. Pourquoi je n'ai fait aucune expérience de fichier journal?
  3. Et si vous reconstruisez l'index d'abord après l'opération de freelage de l'espace. Peut-il remplacer la première DBCC SHRINKFILE (DBFile, NOTRUNCATE) donc j'ai juste besoin de DBCC SHRINKFILE (DBFile, TRUNCATEONLY)? J'ai l'impression que les deux travaillent sur différents niveaux logiques, mais je dois demander cela.

En bout de ligne: je promets que je ne ferai pas de rétrécir régulièrement ou quoi que ce soit. Mais c'est une situation où une casquette est touchée et rétrécissante est nécessaire.


Réponse à ma 2e question: Je n'ai pas rencontré la croissance du fichier journal de transaction, car je jouais dans un environnement de test de développeur. Le fichier journal de transaction augmenterait dans un environnement de production (en supposant que le modèle de récupération complète). Vous devez également imiter cela dans votre environnement de test. La croissance du fichier journal est réellement plus grande que l'espace où vous pouvez libérer dans le fichier de base de données. À la fin, vous ne voulez pas seulement réduire le fichier de base de données, mais également le journal de transaction (comment et quand cela dépend du modèle de récupération). Les environnements de production que j'ai vu avaient une fragmentation d'index si vissée qu'elle peut être meilleure. Mon script réindexe chaque indice que le niveau de fragmentation est supérieur à 30%.

Pour gérer la croissance, vous devrez peut-être passer de la récupération complète à un simple pendant que vous effectuez la conversion une fois dans la vie. Mais cela va briser la chaîne de sauvegarde.


Réponse à ma 3ème question: Faites la reconstruction de Reindex/Index après la rétrécie du fichier de DB, car la fragmentation de l'index de rétrécissement.

Je n'ai pas expérimenté la manière dont tout cela affecte les statistiques de la requête.


Script de réindexage: voir exemple D de TechNet Sys.DM_DB_IDEX_PHYSICAL_STATS (transact-SQL) . Un article sur le rétrécissement incrémentiel, qui conduira à d'autres précieux contenus: http://www.msqltips.com/sqlservertip/3178/incrementialy-sqling-a-large-sql-server-data-file-utilisateur- PowerShell

6
Csaba Toth

Si tu veux:

  1. ignorer tous les avertissements de personnes très intelligentes avec beaucoup d'expérience dans SQL Server;
  2. supposez que parce que dans this cas, vous n'avez pas fait l'expérience de la croissance du journal et de -ceci la fixation de la fragmentation était rapide et ne causait aucune croissance supplémentaire, qui sera toujours la Cas; et,
  3. ne pas confirmer que ce cycle de croissance/rétrécissement/croissance/rétrécissement a tout impact sur les temps de la requête;

Vas-y. Depuis que vous dites que vous ne ferez que cela dans des scénarios rares, je ne suis pas sûr de la réponse que vous recherchez ici. Voulez-vous une grosse pouce-up que vous pouvez ignorer tout ce que vous avez lu à ce sujet et rouler les dés?

Je vais suggérer au moins une chose: frapper la limite de 10 Go d'expression va se passer si vous avez 10 Go de données. Vous évitez cela en supprimant les données dans le fichier de données (ou en diffusant vos données sur plusieurs bases de données). Si vous libérez un tas d'espace dans le fichier de données, cet espace volonté être réutilisé (si vous avez laissé tomber une table, ceci sera automatique; si vous avez supprimé des lignes ou une structure de colonne modifiée, vous allez besoin de reconstruire - qui prendra également un peu de place au moins temporairement). Donc, si vous libérez 5 Go de données dans le fichier, juste parce que le fichier est de 9 Go ne signifie pas qu'il essaiera de devenir 11 Go si vous ajoutez 2GB - il réutilisera l'espace dans le fichier jusqu'à ce qu'il ne puisse plus trouver. Ce sera une opération beaucoup plus coûteuse de rétrécir le fichier à 4 Go, puis forcer à croître pour accueillir les nouvelles données. C'est comme laver une serviette déjà propre que vous êtes sur le point d'utiliser un gâchis ...

14
Aaron Bertrand