web-dev-qa-db-fra.com

Pourquoi ma taille DB est-elle augmentée lors de la reconstruction d'un index à l'aide de TEMPDB dans SQL Server?

Je suis en cours d'exécution Ola Hallengren's Scripts de maintenance SQL à l'aide de la commande suivante:

EXECUTE [dbo].[IndexOptimize]
@Databases = 'MyDatabase'
, @FragmentationLow = NULL
, @FragmentationMedium = 'INDEX_REBUILD_OFFLINE'
, @FragmentationHigh = 'INDEX_REBUILD_OFFLINE'
, @FragmentationLevel1 = 10
, @FragmentationLevel2 = 30
, @UpdateStatistics = 'ALL'
, @OnlyModifiedStatistics = 'Y'
, @LogToTable = N'Y'
, @TimeLimit = 23400
, @MinNumberOfPages = 1000
, @Indexes = 'ALL_INDEXES'
, @MaxDOP = 7
, @SortInTempdb = 'Y'

Jusqu'à récemment, un certain nombre d'indices étaient incapables de reconstruire en raison de contraintes d'espace afin que j'ai déplacé tempdb vers son propre entraînement, configuré tempdb pour utiliser 8 fichiers différents et commencer à trier TEMPDB (chaque fichier TEMPDB est d'environ 10 Go et de la croissance de 500 Mo chaque). Certains index qui étaient difficiles à reconstruire ont précédemment ont été en mesure de compléter relativement rapidement, mais j'ai un indice que je suis exécuté depuis plus d'une heure dans MyDatabase et cette base de données augmente rapidement. Rien d'autre n'est en cours d'exécution et TEMPDB n'a pas augmenté de taille.

Quelqu'un peut-il m'aider à comprendre pourquoi MyDatabase augmente si rapidement? Quelqu'un a-t-il des suggestions sur ce qu'elle pourrait causer cela?

Exécution de SQL Server 2012 si cela aide. Merci

3
Woody

J'ai cité trois sections de différents articles et donnai les liens en bas. En bout de ligne, vous avez besoin d'espace pour que le nouvel index pour obtenir la construction plus un espace de journal de transaction pour la restauration. Si vous ne pouvez pas accueillir l'espace requis, vous voudrez peut-être envisager index_reorganize .

Lorsqu'une nouvelle structure d'index est créée, l'espace disque pour les anciennes structures (source) et nouvelles (cible) est requise dans leurs fichiers et groupes de fichiers appropriés. L'ancienne structure n'est pas distribuée tant que la transaction de création d'index s'engage.

Index Recuild (en ligne ou hors ligne, et au moins aussi loin que 7.0) créera une nouvelle copie de l'index avant de supprimer l'ancienne copie. Les pages et les extensions requises pour le faire seront toujours allouées selon les besoins, comme avec toute autre opération de SQL Server.

Opérations d'index à grande échelle, effectuées hors ligne ou en ligne, peut générer de grandes charges de données pouvant entraîner une remplissage rapide de la transaction. Pour vous assurer que l'opération d'index peut être renvoyée, le journal de transaction ne peut pas être tronqué jusqu'à ce que l'opération d'index ait été terminée; Cependant, le journal peut être sauvegardé pendant l'opération d'index. Par conséquent, le journal des transactions doit disposer d'un espace suffisant pour stocker à la fois les transactions d'opérations d'index et toutes les transactions utilisateur simultanées pendant la durée de l'opération d'index. Pour plus d'informations, voir Espace disque de journal de transaction pour les opérations d'index.

Référence:

  1. idées fausses sur les reconstructions de l'index (allocation, mode bulk_logged, verrouillage) par Paul Randal
  2. Opérations d'index qui nécessitent un espace disque supplémentaire
  3. Espace disque de journal de transaction pour les opérations d'index
1
SqlWorldWide