web-dev-qa-db-fra.com

Espace disque insuffisant lors de l'exécution de requêtes SQL lourdes sur SQL Server 2012

Je suis assez nouveau sur SQL Server 2012, je serais reconnaissant si quelqu'un pouvait aider. J'ai restauré une copie d'une énorme base de données vers SQL Server 2012 et j'ai essayé d'exécuter quelques requêtes simples contre lui.

J'essaie d'exécuter une requête SELECT sur une table de base de données de 136898115 lignes. Cette requête SELECT n'a qu'une simple clause WHERE. Chaque fois que j'exécute cette requête, elle échoue car le disque système (la partition sur laquelle Windows est installé - C:\) manque d'espace (cette partition ne dispose que de 6 Go d'espace libre), et je ne comprends pas pourquoi. J'ai défini mon tempdb sur un autre lecteur, qui a plus de 14 téraoctets d'espace libre. Bien sûr, ma base de données se trouve également sur un autre lecteur.

Qu'est-ce qui fait que ma partition système manque d'espace? Est-ce le fichier d'échange?

14
royv

Le cache des résultats de la requête SSMS sur le lecteur C: par défaut. Accédez à Tool\Options. Voir ci-joint. Changez-le en un autre volume avec plus de stockage et tout ira bien.

enter image description here

12
Eric Higgins

D'accord, je l'ai compris: Eric et j'avais raison tous les deux!

  • Le chemin dans la boîte de dialogue est comme je l'ai dit, juste un chemin par défaut pour enregistrer les résultats de la requête.
  • Les résultats de la requête sont mis en cache sur le disque (j'avais tort), mais dans le profil local temp dossier (C:\Users\<UserName>\AppData\Local\Temp dans mon cas ici). J'ai vérifié, et il ne semble pas y avoir de moyen évident de désactiver cette mise en cache.

Les plats à emporter sont donc:

  • Évitez d'exécuter SSMS directement sur la boîte SQL
  • Ne pas SELECT * à partir d'une énorme table dans SSMS, sauf si l'ensemble de résultats peut tenir dans le dossier de profil
  • Assurez-vous que le paramètre de mémoire maximale de SQL Server est correctement configuré (il peut ou non avoir contribué à ce problème en ce qui concerne la croissance du fichier d'échange)
11
Jon Seigel

Je viens de souffrir du même problème. Après avoir lu les réponses ci-dessus, j'ai trouvé ce qui suit.

Outils | Les options ne sont pas la réponse. Le mien était réglé sur le lecteur Y: mais j'ai regardé ma requête s'exécuter et l'espace sur le lecteur C: plongé de 2,9 Go à 5,04 Mo (avant de tuer la requête).

J'ai donc pensé que c'était probablement la mise en cache des résultats (car ils sont très grands avec chaque ligne renvoyée contenant un gros morceau de XML) dans le répertoire Temp, ce que Jon a dit, mais il n'était pas sûr de la façon dont vous changeriez cela.

Ce que j'ai fait pour changer où les fichiers temporaires sont écrits était d'ouvrir mes variables d'environnement et de modifier les variables utilisateur TEMP et TMP (qui étaient toutes deux définies sur C:\Temp) pour écrire dans Z:\Temp.

Je peux confirmer qu'après ce changement, j'ai vu la requête créer un très gros fichier dans mon répertoire Z:\Temp.

7
Nick Ryan