Bonjour,

Depuis quelques jours, le serveur qui sert aux développements et aux tests de l'application vendue par mon entreprise connaît quelques pressions mémoires que nous n'avons pas encore eu le temps de diagnostiquer proprement.

L'erreur la plus souvent obtenue est :
There is insufficient system memory in resource pool 'default' to run this query.
Mais il arrive parfois aussi que les clients applicatifs ne parviennent pas à se connecter au serveur :
A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
Enfin, il arrive parfois que nous ne puissions pas prendre le contrôle du serveur à l'aide d'une connexion bureau à distance.

Le serveur est un Dell PE6850 (dépasse la période de garantie du constructeur) avec Windows Server 2003 32 bits (à jour), et 64GB de RAM, avec SQL Server 2008 Enterprise.

Je viens de jeter un œil aux tailles occupées par les bases de données dans le cache à l'aide de la requête suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
SELECT        D.name AS database_name
        , CAST(COUNT_BIG(*) * 8192.0 / 1024 / 1024 AS decimal(10,2)) AS cached_size_MB
FROM        sys.dm_os_buffer_descriptors AS OSBD
INNER JOIN    sys.databases AS D ON OSBD.database_id = D.database_id
GROUP BY    D.name WITH ROLLUP
ORDER BY    cached_size_MB DESC
qui me retourne 11GB pour TempDB.

A l'aide de la requête suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
USE TempDB
GO
 
;WITH
    CTE AS
    (
        SELECT    name AS logicial_name
            , physical_name AS physical_name
            , CASE is_percent_growth 
                WHEN 0 THEN CAST(growth * 8 / 1024 AS VARCHAR(8)) + ' MB'
                ELSE CAST(growth AS VARCHAR(3)) + ' %' 
            END AS growth
            , CAST((size * 8) / CAST(1024 AS numeric(14, 2)) AS numeric(14, 2)) AS file_size_MB
            , CAST((FILEPROPERTY(name, 'SpaceUsed') * 8) / CAST(1024 AS numeric(14, 2)) AS numeric(14, 2)) AS occupied_space_MB
        FROM    sys.database_files
    )
SELECT    logicial_name
    , physical_name
    , file_size_MB
    , growth
    , occupied_space_MB
    , file_size_MB - occupied_space_MB AS free_space_MB
    , CAST((CAST(occupied_space_MB AS numeric(14, 2)) / file_size_MB) * 100 AS numeric(14, 2)) AS [%occupe]
    , CAST((CAST(file_size_MB - occupied_space_MB AS numeric(14, 2)) / file_size_MB) * 100 AS numeric(14, 2)) AS [%libre]
FROM CTE
J'obtiens :

tempdev Z:\MSSQL\data\tempdb.mdf 17028.00 100 MB 4.31 17023.69 0.03 99.97
templog Y:\MSSQL\data\templog.ldf 1200.00 100 MB 406.56 793.44 33.88 66.12
tempdev1 V:\MSSQL\Data\tempdb1.ndf 16928.00 100 MB 3.38 16924.62 0.02 99.98
tempdev2 W:\MSSQL\Data\tempdb2.ndf 17028.00 100 MB 11.75 17016.25 0.07 99.93
tempdev3 Y:\MSSQL\Data\tempdb3.ndf 13928.94 100 MB 25.75 13903.19 0.18 99.82
Je subodore que cette requête soit incorrecte, mais je trouve le résultat assez bizarre ...

Qu'en pensez-vous ?

@++