Как рассчитать размер хранимых процедур в SQL Server 2005? - PullRequest
6 голосов
/ 20 октября 2008

Меня попросили дать полную разбивку пространства, используемого в конкретной базе данных. Я знаю, что могу использовать sys.dm_db_partition_stats в SQL Server 2005, чтобы выяснить, сколько места использует каждая таблица в базе данных, но есть ли способ определить отдельный и общий размер хранимых процедур в базе данных? (Разумеется, если не считать открытия каждого и подсчета символов.)

Общее пространство, используемое хранимыми процессами, вряд ли будет значительным (по сравнению с фактическими данными ), но с сотнями из них оно может составить.

Ответы [ 4 ]

12 голосов
/ 21 октября 2008
;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
3 голосов
/ 20 октября 2008

Немного лучший способ, чем подсчет символов, - это использовать схему информации schema.routines. Вы можете суммировать длину каждого определения подпрограммы следующим образом (обратите внимание, что каждое определение подпрограммы будет максимум в 4000 символов, см. Ниже метод, который не имеет этого ограничения):

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

Или вы можете вернуть длину каждого sp

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

Маловероятно, что длина ваших хранимых процедур является проблемой. Обычно нехватка места в базе данных происходит из-за таких вещей, как отсутствие резервного копирования файла журнала (а затем его сжатие с использованием dbcc shrinkfile или dbcc shrinkdatabase).

В Sql 2000, вот процедура, которая обеспечивает длину без ограничения в 4000 символов, указанного выше:

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

2 голосов
/ 26 января 2017

Необходимо использовать DATALENGTH, а не LEN, чтобы получить количество байтов, а не количество символов, потому что столбец определения представления каталога sys.sql_modules - это NVARCHAR (MAX), то есть 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
2 голосов
/ 20 октября 2008

Решение Dave_H достигает предела 4000 символов в таблице information_schema.routines

Попробуйте, сначала вы сгенерируете таблицу с полным текстом звездочек, а затем суммируете длину символов.

--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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...