2009-04-21 6 views
12

J'ai un scénario dans lequel chaque utilisateur dispose de 2 Mo d'espace de base de données. Maintenant, je dois montrer l'utilisation de Percenatge de leur espace alloué, pour ce faire, j'ai besoin de connaître la taille de l'enregistrement unique dans la Table.Taille d'un enregistrement unique? SQL

J'ai essayé d'utiliser sp_spaceused et j'ai même écrit une procédure personnalisée utilisant datalength .. mais ils montrent une grande différence dans leur résultat.

Y a-t-il un moyen de contourner ce problème?

+0

Qu'est-ce que cet "espace" utilisé? –

+2

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? –

+0

J'ai une table où toutes les données utilisateur sont enregistrées. UserId est utilisé pour différencier les données utilisateur individuelles –

Répondre

0

Les données sont enregistrées sur le disque dans les répertoires nommés pour la base de données. Cela inclut tout, y compris ce que vous ne mesurez pas (indices, etc.). Mesurez cela.

+0

Comment mesurer tout indice sera utile –

10

Vous pouvez calculer la taille d'une ligne (du nombre de lignes) avec une formule assez complexe. Voir Books Online (ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f-4c2c-8ba0-6c483cea6c75.htm) pour les détails exacts.

En bref:

Prenez le nombre de colonnes et de déterminer la taille de chaque colonne par son type de données de types de données de longueur fixe.

Calculer l'espace utilisé pour toutes les colonnes nullables Ensuite, calculer la rowspace:

Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

+1

Excellent livre en ligne lien, merci. – DenNukem

24

Run DBCC SHOWCONTIG avec votre nom de la table

dbcc showcontig ('TableName') with tableresults 

regarder alors à la taille minimale et maximale de l'enregistrement

+6

quelle est l'unité de ces tailles que vous avez mentionné sont-ils KB ou B – semirturgay

+0

https://msdn.microsoft.com/en-us/library/ms175008.aspx - En regardant cela, je crois que c'est Bytes – JsonStatham

+0

FYI, selon le page MSDN liée: "Cette fonctionnalité sera supprimée dans une future version de Microsoft SQL Server.N'utilisez pas cette fonctionnalité dans les nouveaux travaux de développement, et modifiez les applications qui utilisent actuellement cette fonctionnalité dès que possible.Utilisez plutôt sys.dm_db_index_physical_stats." – DaveD

11

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 
+0

Je voudrais pouvoir voter pour vous plus d'une fois. :-) –

11

Depuis SHOWCONTIG va être dépréciée, vous pouvez également utiliser:

SELECT * FROM sys.dm_db_index_physical_stats 
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED') 
Questions connexes