Je gère une base de données SQL Server 2005 qui héberge environ 2,9 To de données (2 x 1,45 To - J'ai un schéma RAW et un schéma ANALYSIS donc en gros deux copies des données ingérées). Le modèle de récupération est SIMPLE et .ldf
est à 6 Go.
Pour une raison quelconque, le .mdf
est de 7,5 To. Maintenant, il n'y a peut-être que 2-3 colonnes supplémentaires dans les tables d'ANALYSE et pas beaucoup de NVARCHAR(MAX)
colonnes qui, d'après ce que j'ai (peut-être mal compris - corrigez-moi si je me trompe), peut être à l'origine d'une allocation d'espace supplémentaire. C'est après avoir réduit la base de données tout à l'heure - c'était à ~ 9 To avant cela. Des pensées?
Et, s'il vous plaît, faites-moi savoir si vous avez des questions supplémentaires - Je suis très nouveau dans les efforts d'administration et d'optimisation de la base de données (je ne fais généralement pas ce côté du travail :)).
Merci beaucoup!
Andrija
la source
Réponses:
Dans vos estimations de taille, avez-vous pris en compte la quantité d'espace occupée par les index? De plus, si vous avez des champs de texte définis sur plusieurs octets (
N[VAR]CHAR
plutôt que[VAR]CHAR
) et que les fichiers d'entrée sont en UTF-8 ou en un octet par caractère, cela augmentera vos besoins de stockage jusqu'à un facteur deux. De plus, n'oubliez pas que si vous avez une clé / un index en cluster sur une table, sa taille affecte tous les autres index de la table car ils incluent la valeur de la clé en cluster pour chaque ligne (afin de donner un exemple extrême si une table a un NCHAR (10 ) où un INT ferait et c'est votre clé / index clusterisé, vous utilisez non seulement 16 octets supplémentaires par ligne dans les pages de données, mais vous gaspillez également 16 octets par ligne dans tous les autres index de cette table ) .En outre, un certain espace sera alloué mais inutilisé, soit parce que le moteur de base de données a laissé un certain espace alloué après les suppressions afin qu'il puisse être réutilisé rapidement pour les nouvelles données dans cette table ou parce que le modèle d'insertions et de suppressions n'a laissé qu'une partie de nombreuses pages plein.
Tu peux courir:
pour voir rapidement quelles tables occupent de l'espace.
Également
EXEC sp_spaceused
exécuté dans cette base de données renverra deux jeux de résultats. Le premier répertorie l'espace total alloué dans le système de fichiers pour les fichiers de données et la quantité non allouée, le second répertorie la quantité d'espace alloué utilisée pour les pages de données, les pages d'index ou actuellement inutilisée.sp_spaceused
retournera également l'espace utilisé par un objet donné, vous pouvez donc le boucler pour construire une table pour l'analyse:Le code ci-dessus affichera toutes les tailles de tableau dans une liste, plus une seule ligne pour les totaux. Si nécessaire, vous pouvez utiliser les différentes vues système (similaires
sys.objects
etsys.dm_db_partition_stats
utilisées dans la première requête ci-dessus, voir http://technet.microsoft.com/en-us/library/ms177862.aspx pour beaucoup plus de détails) pour obtenir plus de détails tels que l'espace utilisé par chaque index.Il existe trois classes d'espace inutilisé dans un fichier de données:
sp_spaceused
sans objet spécifié)sp_spaceused
la sortie de.Une autre mise en garde ici concerne les gros objets (
TEXT
colonnes,[N]VARCHAR(MAX)
valeurs au-dessus d'une certaine taille et ainsi de suite) car ils sont placés hors page, en prenant juste 8 octets dans les données de la ligne principale pour contenir un pointeur vers les données ailleurs), ce qui peut briser la limite de 8192 octets par ligne.tl; dr: L' estimation des tailles de base de données attendues peut être beaucoup plus complexe qu'il n'est naturel de le supposer initialement.
la source
Essayez d'exécuter
sp_spaceused
sur votre base de données. À titre d'exemple, il renvoie:Pour l'exécuter sur la base de
USE
données, exécutez simplement la base de donnéessp_spaceused
.S'il montre encore beaucoup d'espace inutilisé, vous pouvez réessayer le rétrécissement. Parfois, je trouve que cela prend plusieurs essais. Parfois aussi, je trouve qu'il est préférable de réduire le fichier individuel plutôt que la base de données dans son ensemble. Cependant, ce que vous pouvez trouver, c'est que vous avez 2,9 To de données et encore 4 + Tb d'index, auquel cas la 7,5 To est assez raisonnable. Si vous voulez avoir une idée de la quantité d'espace (données et index) de chaque table, vous pouvez également exécuter
sp_spaceused
au niveau de la table. Vous pouvez l'exécuter sur toutes les tables de la base de données à l'aide de la commande suivante:Bien que l'avertissement juste sp_msforeachtable soit non documenté, non pris en charge et connu pour manquer des tables. D'un autre côté, j'ai eu pas mal de chance avec.
Cela étant dit, votre base de données DEVRAIT avoir un certain pourcentage d'espace libre en fonction de votre croissance attendue. Fondamentalement, vous voulez vous assurer d'avoir de l'espace pour une croissance de 6 mois à quelques années. Vous voudrez également vérifier vos
autogrowth
paramètres pour vous assurer qu'ils sont adaptés à votre situation. Etant donné la taille de votre base de données, vous ne voulez PAS utiliser de%autogrowth
.la source
À l'aide de SQL Management Studio, 1.Cliquez avec le bouton droit sur la base de données, puis 2.Cliquez sur Tâches-> Rétrécir -> Fichiers
Vous verrez une boîte de dialogue qui affiche: a. Espace actuellement alloué b. Espace libre disponible + (% gratuit)
Si votre% gratuit est supérieur à 50%, vous pouvez envisager de réduire le fichier. J'ai vu ce succès atteindre 90%. Si je décide de réduire le fichier, je le règle généralement sur 2 ou 3 concerts de plus que l'espace alloué actuel. La plupart de mes bases de données ont moins de 50 Go. Donc, si vous avez un fichier beaucoup plus volumineux, vous pouvez en faire 10 gigaoctets. Je ne m'inquiète généralement de la réduction que si je vais déplacer la base de données vers un autre serveur, vous pouvez tout lire sur les problèmes de réduction sur n'importe quelle page SQL.
la source