La requête suivante va indique le pourcentage de @SpaceAllotted utilisé par les données en examinant le nombre de pages allouées par les objets de la base de données.
Il n'est pas utile de tenter de mesurer l'utilisation au niveau de la ligne, car SQL Server alloue tout l'espace au niveau de l'extension. Chaque extension est composée de huit pages de données de 8 Ko. Ainsi, si votre base de données ne comportait qu'une seule ligne et que cette ligne contenait 4 octets de données, il faudrait tout de même allouer une extension entière pour contenir 4 octets (ou une extension existante avec des pages non allouées).).
DECLARE @SpaceAllotted FLOAT
-- 2MB converted to kilobytes...
SET @SpaceAllotted = 2048
SELECT
-- Allocation is done on the extent-level.
-- Each extent contains eight 8KB data pages.
((1/(@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT)/8) * 64) * 100 AS PercentageUsed
FROM
[sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips
-- This will allow us to retrieve the page count of all tables in the
-- current database, regardless of whether or not they have clustered
-- indexes and/or non-clustered indexes.
INNER JOIN
[sys].[indexes] i
ON
[ips].[object_id] = [i].[object_id]
AND [ips].[index_id] = [i].[index_id]
Puisque nous avons la possibilité d'extensions mixtes, et pas bonne façon (il existe des moyens, mais ils ne vont pas être assez) de déterminer quelles pages sont allouées à ce que Etendues, ce ISN 't 100% précis. De plus, les extensions peuvent même avoir des pages libres (qui sont réservées et occupent donc toujours de l'espace disque), donc généralement, cette estimation sera toujours faible. Cependant, c'est probablement le meilleur que vous obtiendrez sans écrire quelque chose pour inspecter la base de données au niveau de la page.
Ah oui, en regardant les autres réponses, c'est une autre option. Cela va essentiellement regarder toute la taille actuelle des fichiers de données dans les pages, et déterminer le pourcentage de l'espace qu'ils ont consommé. Maintenant, il y a aussi des mises en garde ici ...
- S'il n'y a pas de taille maximale spécifiée pour la base de données (autogrowth est activé et sans restriction), ce ne sera pas voler, puisque max_size sera retourné comme -1.
- Encore une fois, nous ne pouvons pas déterminer avec précision combien d'espace est utilisé par les données réelles. Nous examinons ici l'espace réellement utilisé sur le système de fichiers.
- Nous ne recherchons pas d'espace fichier journal. Oui, cela consomme toujours de l'espace disque.
Espérons que l'un d'entre eux résout votre problème.
SELECT
((1/CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed
FROM
[sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs
INNER JOIN
[sys].[database_files] df
ON
[vfs].[file_id] = [df].[file_id]
WHERE
[df].[type] = 0
Qu'est-ce que cet "espace" utilisé? –
Comment partitionnez-vous vos données utilisateur? Est-ce que tout est dans la même table? Ou est-ce que chaque utilisateur a ses propres tables? –
J'ai une table où toutes les données utilisateur sont enregistrées. UserId est utilisé pour différencier les données utilisateur individuelles –