2008-10-20 7 views
4

On m'a demandé une ventilation complète de l'espace utilisé dans une base de données spécifique. Je sais que je peux utiliser sys.dm_db_partition_stats dans SQL Server 2005 pour savoir combien d'espace chaque table dans une base de données utilise, mais est-il un moyen de déterminer la personne et la taille totale des procédures stockées dans une base de données? (Il suffit d'ouvrir chacun d'eux et de compter les caractères, bien sûr.)Comment puis-je calculer la taille des procédures stockées dans SQL Server 2005?

L'espace total utilisé par les process stockés ne devrait pas être significatif (comparé aux réels data), mais avec des centaines d'entre eux, il pourrait ajouter .

Répondre

9
;WITH ROUTINES AS (
    -- CANNOT use INFORMATION_SCHEMA.ROUTINES because of 4000 character limit 
    SELECT o.type_desc AS ROUTINE_TYPE 
      ,o.[name] AS ROUTINE_NAME 
      ,m.definition AS ROUTINE_DEFINITION 
    FROM sys.sql_modules AS m 
    INNER JOIN sys.objects AS o 
     ON m.object_id = o.object_id 
) 
SELECT SUM(LEN(ROUTINE_DEFINITION)) 
FROM ROUTINES 
+0

Nice !! Points bonus pour me donner aussi la taille des fonctions Triggers, Views et Scalar! – BradC

3

Un moyen légèrement meilleur que le comptage des caractères consiste à utiliser les informations schema.routines. Vous pouvez résumer la longueur de chaque Définition de routine comme (Note chaque définition routine max à 4000 caractères, voir ci-dessous pour une méthode qui ne dispose pas de cette restriction):

 
select Sum(Len(Routine_Definition)) from information_schema.routines 
where routine_type = 'PROCEDURE' 

Ou vous pouvez retourner la longueur chaque sp

 
select Len(Routine_Definition), * from information_schema.routines 
where routine_type = 'PROCEDURE' 

Il est peu probable que la durée de vos procédures stockées soit le problème. Généralement, le manque d'espace avec une base de données est dû à des choses comme ne pas sauvegarder le fichier journal (puis le réduire en utilisant dbcc shrinkfile ou dbcc shrinkdatabase).

En Sql 2000, voici une routine qui fournirait la longueur sans la limite de 4000 caractères supérieur à:

 
DECLARE @Name VarChar(250) 
DECLARE RoutineCursor CURSOR FOR 
    select Routine_Name from information_schema.routines where routine_type = 'PROCEDURE' 

DECLARE @Results TABLE 
    ( SpName VarChar(250), 
     SpLength Int 
    ) 

CREATE TABLE ##SpText 
    ( SpText VarChar(8000) ) 

OPEN RoutineCursor 
FETCH NEXT FROM RoutineCursor INTO @Name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     INSERT INTO ##SpText (SpText) EXEC sp_helptext @Name 

     INSERT INTO @Results (SpName, SpLength) (SELECT @Name, Sum(Len(SpText)) FROM ##SpText) 
     TRUNCATE TABLE ##SpText 

     FETCH NEXT FROM RoutineCursor INTO @Name 
    END 

CLOSE RoutineCursor 
DEALLOCATE RoutineCursor 
DROP TABLE ##SpText 

SELECT SpName, SpLength FROM @Results ORDER BY SpLength DESC 
SELECT Sum(SpLength) FROM @Results 

+0

Cela atteint un maximum de 4000 caractères. Je travaille sur une approche différente similaire à une autre routine que nous utilisons. –

+1

mais oui - si vous manquez de place à cause des sprocs, vous le faites mal! –

2

solution de Dave_H frappe une limite de 4000 caractères dans la table information_schema.routines

Essayez ceci, d'abord vous générez la table a avec le texte complet des sprocs, puis additionnez les longueurs de caractères.

--create a temp table to hold the data 
create table ##sptext (sptext varchar(1000)) 
go 

--generate the code to insert the full text of your sprocs 
select 'insert into ##sptext (sptext) exec sp_helptext '''+specific_name+''';' 
from information_schema.routines 
where routine_type = 'PROCEDURE' 
go 

/*Copy the output back to your query analyzer and run it*/ 

--now sum the results  
select sum(len(sptext)) 
from ##sptext 
2

Besoin d'utiliser DATALENGTH plutôt que LEN pour obtenir le nombre d'octets plutôt que le nombre de caractères car la colonne de définition de la vue du catalogue sys.sql_modules est NVARCHAR (MAX), soit Unicode

SELECT Type, 
    SUM(Chars) SizeChars, 
    SUM(Bytes) SizeBytes, 
    SUM(Bytes)/1024. SizeKB, 
    CAST(SUM(Bytes)/1024 AS VARCHAR) + '.' + CAST(SUM(Bytes) % 1024 AS VARCHAR) SizeKBRemBytes 
FROM 
(
SELECT o.type_desc Type, 
     LEN(sm.definition) Chars, 
     DATALENGTH(sm.definition) Bytes 
    FROM sys.sql_modules sm 
    JOIN sys.objects o ON sm.object_id = o.object_id 
) x 
GROUP BY Type 
ORDER BY Type 
Questions connexes