<p>Si vous utilisiez l’édition Enterprise, vous pourriez utiliser l’option <code>ONLINE</code> de <a href="http://msdn.microsoft.com/en-us/library/ms188783.aspx"><code>CREATE INDEX</code></a> qui construit l’index sans maintenir de verrous à long terme sur la table. Il y a des mises en garde concernant son utilisation ; consultez l’article lié pour les détails, et vous pourriez trouver l’impact sur les performances trop important. Mais c’est théorique puisque vous avez dit que vous utilisez l’édition Standard (désolé de l’avoir manqué au début).</p>
<p>Le fait que ce soit une VM fait immédiatement penser à “booster” temporairement la VM ou même à la relocaliser temporairement sur une machine physique maximisée. Pour reconstruire un index sur une très grande table, je pense que la RAM et la vitesse d’E/S seraient les facteurs les plus importants ; la VM utilise-t-elle un disque directement ou un disque virtualisé ? Pouvez-vous temporairement relocaliser les données sur un disque physique ? Ce genre de chose.</p>
<p>Pour information, votre idée de mettre hors ligne et de le faire est exactement ce que je ferais sur une base de données MySQL (je n’ai jamais eu à le faire sur SQL Server) : mettre la base de données principale hors ligne, prendre un instantané, effacer les binlogs/activer le binlogging, et la remettre en marche. Créer l’index sur une machine séparée. Quand c’est prêt, mettre la base de données hors ligne, faire une sauvegarde de la base mise à jour (juste au cas où), remettre l’instantané, appliquer les binlogs et remettre la base en marche. C’est vraiment aussi simple que ça ; je pense que vous pouvez faire la même chose avec SQL Server. Bien sûr, cela suppose que vous pouvez appliquer 24 heures de binlogs contre la table (nouvellement optimisée) dans une fenêtre de temps acceptable !</p>