SQL Server: как получить размеры статистики?

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я хотел бы запросить размеры всех результатов, созданных CREATE STATISTICS : гистограммами и векторами плотности.

Я попробовал следующий фрагмент:

 SELECT
    t.Name AS TableName,
    p.rows AS RowCounts,
    CAST(ROUND((SUM(a.used_pages) / 128.00), 2) AS NUMERIC(36, 2)) AS Used_MB,
    CAST(ROUND((SUM(a.total_pages) - SUM(a.used_pages)) / 128.00, 2) AS NUMERIC(36, 2)) AS Unused_MB,
    CAST(ROUND((SUM(a.total_pages) / 128.00), 2) AS NUMERIC(36, 2)) AS Total_MB
FROM 
    sys.stats t
INNER JOIN 
    sys.partitions p ON t.object_id = p.OBJECT_ID --AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY 
    t.Name, p.Rows
ORDER BY 
    t.Name;
 

Однако возвращаемые результаты в разделе «Used_MB», очевидно, содержат исходный размер таблицы.

Есть ли способ быстро получить только размеры статистики?

Комментарии:

1. Не знаю, зачем вам это нужно или заботится об этом, но, вероятно, нужно что-то сделать на основе этого. dba.stackexchange.com/a/27171/3690

2. Быстрый ответ, я почти уверен, что когда-то читал, что любой заданный набор статистики (для столбца или для индекса) хранится на одной странице (8k).

3. Даже для инкрементной статистики в секционированных таблицах размер, занимаемый гистограммами статистики, абсолютно незначителен по сравнению с данными, поэтому неясно, зачем это было бы полезно. Обратите внимание, что увеличение размера выборки улучшит качество статистики (и время, необходимое для ее создания), но не приведет к заметному увеличению размера — всегда присутствует не более 200 шагов гистограммы. Может быть, если вам нужно учитывать каждый последний выделенный байт…

4. Я вижу, что 200 ячеек будут составлять, возможно, около 16 * 200 байт. Что насчет «векторов плотности», что именно в них хранится — это всего лишь одно число, средняя плотность, на (col1, …, col K) комбо?

5. В принципе, да, так что даже меньше, чем гистограммы.