#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. В принципе, да, так что даже меньше, чем гистограммы.