Published on

March 10, 2008

Запрос к системным каталогам SQL Server для определения использования пространства

Как администратор баз данных SQL Server, управление пространством на жестком диске является обычной задачей. Важно определить таблицы и схемы, которые используют больше всего пространства, чтобы оптимизировать хранение и улучшить производительность. В этой статье мы рассмотрим, как выполнить запрос к системным каталогам SQL Server для получения информации об использовании пространства.

Шаг 1: Войдите в экземпляр SQL Server

Сначала войдите в экземпляр SQL Server, который вы хотите проанализировать. Это можно сделать с помощью SQL Server Management Studio или любого другого клиентского инструмента SQL Server.

Шаг 2: Перейдите к базе данных

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

Шаг 3: Выполните запрос

Скопируйте и вставьте следующий код в новое окно запроса и выполните его:

begin try
SELECT 
    (row_number() over(order by a3.name, a2.name))%2 as l1, 
    a3.name AS [schemaname], 
    a2.name AS [tablename], 
    a1.rows as row_count, 
    (a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved, 
    a1.data * 8 AS data, 
    (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) – a1.data ELSE 0 END) * 8 AS index_size, 
    (CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) – a1.used ELSE 0 END) * 8 AS unused 
FROM 
    (SELECT 
        ps.object_id, 
        SUM ( CASE WHEN (ps.index_id < 2) THEN row_count ELSE 0 END ) AS [rows], 
        SUM (ps.reserved_page_count) AS reserved, 
        SUM ( CASE WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count) ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count) END ) AS data, 
        SUM (ps.used_page_count) AS used 
    FROM 
        sys.dm_db_partition_stats ps 
    GROUP BY 
        ps.object_id) AS a1 
LEFT OUTER JOIN 
    (SELECT 
        it.parent_id, 
        SUM(ps.reserved_page_count) AS reserved, 
        SUM(ps.used_page_count) AS used 
    FROM 
        sys.dm_db_partition_stats ps 
    INNER JOIN 
        sys.internal_tables it ON (it.object_id = ps.object_id) 
    WHERE 
        it.internal_type IN (202,204) 
    GROUP BY 
        it.parent_id) AS a4 ON (a4.parent_id = a1.object_id) 
INNER JOIN 
    sys.all_objects a2  ON ( a1.object_id = a2.object_id ) 
INNER JOIN 
    sys.schemas a3 ON (a2.schema_id = a3.schema_id) 
WHERE 
    a2.type <> 'S' and a2.type <> 'IT' 
ORDER BY 
    a3.name, a2.name 
end try 
begin catch 
select 
    -100 as l1 , 
    1 as schemaname , 
    ERROR_NUMBER() as tablename , 
    ERROR_SEVERITY() as row_count , 
    ERROR_STATE() as reserved , 
    ERROR_MESSAGE() as data , 
    1 as index_size , 
    1 as unused 
end catch

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

Изменение запроса для использования пространства схемы

Если вы хотите получить информацию об использовании пространства на уровне схемы, вы можете изменить запрос, используя функции SUM, COUNT и оператор GROUP BY. Скопируйте и вставьте следующий код в новое окно запроса и выполните его:

begin try
SELECT 
    –(row_number() over(order by a3.name, a2.name))%2 as l1, 
    a3.name AS [schemaname], 
    count(a2.name ) as NumberOftables, 
    sum(a1.rows) as row_count, 
    sum((a1.reserved + ISNULL(a4.reserved,0))* 8) AS reserved, 
    sum(a1.data * 8) AS data, 
    sum((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) – a1.data ELSE 0 END) * 8 )AS index_size, 
    sum((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) – a1.used ELSE 0 END) * 8) AS unused 
FROM 
    (SELECT 
        ps.object_id, 
        SUM ( CASE WHEN (ps.index_id < 2) THEN row_count ELSE 0 END ) AS [rows], 
        SUM (ps.reserved_page_count) AS reserved, 
        SUM ( CASE WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count) ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count) END ) AS data, 
        SUM (ps.used_page_count) AS used 
    FROM 
        sys.dm_db_partition_stats ps 
    GROUP BY 
        ps.object_id) AS a1 
LEFT OUTER JOIN 
    (SELECT 
        it.parent_id, 
        SUM(ps.reserved_page_count) AS reserved, 
        SUM(ps.used_page_count) AS used 
    FROM 
        sys.dm_db_partition_stats ps 
    INNER JOIN 
        sys.internal_tables it ON (it.object_id = ps.object_id) 
    WHERE 
        it.internal_type IN (202,204) 
    GROUP BY 
        it.parent_id) AS a4 ON (a4.parent_id = a1.object_id) 
INNER JOIN 
    sys.all_objects a2  ON ( a1.object_id = a2.object_id ) 
INNER JOIN 
    sys.schemas a3 ON (a2.schema_id = a3.schema_id) 
WHERE 
    a2.type <> 'S' and a2.type <> 'IT' 
GROUP BY 
    a3.name 
ORDER BY 
    a3.name 
end try 
begin catch 
select 
    -100 as l1 , 
    1 as schemaname , 
    ERROR_NUMBER() as tablename , 
    ERROR_SEVERITY() as row_count , 
    ERROR_STATE() as reserved , 
    ERROR_MESSAGE() as data , 
    1 as index_size , 
    1 as unused 
end catch

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

Заключение

Путем выполнения запросов к системным каталогам SQL Server вы можете легко получить

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.