Salut,

Je rencontre depuis plusieurs jours et pour la première fois une erreur relative à la taille de la base TEMPDB lors de l'exécution d'une requête de type SELECT. Le contexte de l'erreur est la suivante :

> SGBQ SQL Server 2000 SP4 sur Windows Server 2003 SP2

> La base de donnée concernée pèse à peine 4.5Go sur un disque ayant 50Go de libre (SAS en RAID1)

> Les indexes de cette base ont été recrées il y a quelques jours et la base a été également compressée

> Les deux tables sur lesquelles porte la requête représentent respectivement 1.7 millions de lignes (pour près de 200 champs ... je sais mais c'est pas moi qui ait conçu le MCD) et 0.45 million de lignes (pour 135 champs).

> ces tables sont indexées, pas toujours de façon heureuse mais suffisante pour créer des jointures efficaces entre elles (de toute façon, c'est une base commerciale et je ne peux toucher à sa structure pour des contraintes liées au service d'assistance et de mise à jour de l'éditeur)

> La base TEMPDB est configurée avec une croissance non limitée, à 10% de croissance (database +log) et son mode de récupération est simple. Elle est située sur la même grappe que la base de donnée requêtée. Sa taille est actuellement à peine de 134Mo et 2.6Mo pour le journal (je veux bien mettre en place un plan de maintenance mais cela ne paraît pas des tonnes utile). Si le service SQLserver est rebooté, sa taille ne change pas.
Comme je souhaitais m'assurer que sa croissance n'était pas entravée, j'ai arrêté le service, renommé tempdb.mdf et relancé le service. SQL Server recrée tempdb.mdf avec une taille de 8Mo. Lorsque je relance la requête, la base tempdb grossit durant plus de 4min jusqu'à atteindre les 134Mo (à l'octet prêt) puis le message d'erreur intervient. tempdb.ldf ne bouge pas.

> La requête est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
SELECT TOP 20 LIGNE.ARTICLE, LIGNE.LIBELLE, SUM(LIGNE.MONTANT) FROM LIGNE INNER JOIN PIECE ON LIGNE.NUMERO = PIECE.NUMERO AND LIGNE.DEPOT = PIECE.DEPOT AND YEAR(PIECE.DATE)=2008
WHERE LIGNE.NATURE= 'TICKET'
GROUP BY LIGNE.ARTICLE, LIGNE.LIBELLE
ORDER BY 3 DESC

> Le message d'erreur est le suivant dans l'analyseur de requête :
(20 ligne(s) affectée(s))
Serveur : Msg 9002, Niveau 17, État 6, Ligne 1
The log file for database 'tempdb' is full. Back up the transaction log for the database to free up some log space.
> Si je fait des requêtes plus complexes et avec regroupement sur ces tables, sans utiliser TOP N, je n'ai pas de message d'erreur. Celui-ci intervient lors de l'utilisation de la clause TOP.

> J'ai fait un peu (un peu car sur le net il y en a pas mal de littérature sur le sujet) le tour du sujet, sans réellement trouver une situation proche de la mienne. En général, soit la croissance de la base tempdb est malconfigurée, soit il s'agit d'un problème de croissance trop importante, soit il s'agit d'interactions plus complexes.

Mais dans mon cas, la base est simple, tempdb est apparemment bien tunée, la taille de tempdb.mdf et ldf est ridiculement faible (c'est un suspect d'ailleurs), pas de pb de ressources disque. Bref, je ne vois pas d'où pourrait bien venir ce problème.

Merci d'avance de votre aide.