В SQL статистика є об'єктами метаданих, які зберігають інформацію про розподіл даних у таблицях і індексах. Вони використовуються оптимізатором запитів SQL для оцінки найбільш ефективного способу виконання запиту. Без точних статистичних даних оптимізатор може створити неефективні плани запитів, що призведе до поганої продуктивності.
Статистика для оптимізації запитів є двійковими великими об'єктами (BLOB), які містять статистичну інформацію про розподіл значень в одному або кількох стовпцях таблиці або індексованого виду. Оптимізатор запитів використовує ці статистичні дані для оцінки кардинальності (cardinality) або кількості рядків у результаті запиту. Ці оцінки кардинальності дозволяють оптимізатору створити високоякісний план запиту. Наприклад, залежно від ваших умов (predicates), оптимізатор запитів може вибрати оператор пошуку за індексом замість більш ресурсоємного оператора сканування індексу, якщо це покращує продуктивність запиту.
Кожен об'єкт статистики створюється на основі списку одного або кількох стовпців таблиці і включає гістограму, яка відображає розподіл значень у першому стовпці.
Об'єкти статистики для кількох стовпців також зберігають статистичну інформацію про кореляцію значень серед стовпців. Ці статистики кореляції, або щільності (densities), отримуються на основі кількості унікальних рядків значень стовпців.
Якщо стовпець ідентичності визначений як частина первинного ключа, кластеризованого індексу або некластеризованого індексу, SQL Server створить статистику для цього індексу. Ці статистики покривають стовпець ідентичності неявно, оскільки він є частиною індексу.
sys.stats
Містить рядок для кожного об'єкта статистики, що існує для таблиць, індексів і індексованих видів у базі даних SQL Server. Кожен індекс має відповідний рядок статистики з таким самим іменем та ID (index_id
= stats_id
), але не кожен рядок статистики має відповідний індекс.
Перегляд каталогу sys.stats_columns надає статистичну інформацію для кожного стовпця в базі даних.
Цей перегляд каталогу надає такі деталі:
- object_id: ID об'єкта, до якого належать ці статистики.
- name: Ім'я статистики. Має бути унікальним в межах об'єкта.
- statsid: ID статистики, є унікальним в межах об'єкта. Якщо статистика відповідає індексу, то значення statid збігається з значенням index_id з перегляду каталогу sys.indexes.
- auto_created: Вказує, чи була статистика створена автоматично SQL Server чи ні.
У Azure Synapse Analytics, коли ви створюєте таблицю без вказівки індексу, автоматично створюється кластеризований стовпцевий індекс (CCI). На відміну від традиційних індексів B-дерева, які мають окремі статистики для кожного індексованого стовпця, для всього стовпцевого індексу створюється один об'єкт статистики. Ось чому ви бачите лише один рядок у sys.stats
, пов'язаний з таблицею.
Об'єкт статистики використовується оптимізатором запитів для розуміння розподілу даних для аналітичних навантажень.
sys.stats_columns
надає інформацію про те, які стовпці залучені до статистики.
sys.stats
містить один рядок для всього стовпцевого індексу (один об'єкт статистики).sys.stats_columns
перераховує кожен стовпець, який бере участь у статистиці, надаючи гранулярність для окремих стовпців у стовпцевому індексі.- Обидві таблиці разом дають уявлення про те, як підтримуються статистики для кластеризованого стовпцевого індексу в Azure Synapse Analytics.
Наступні записи створюються за замовчуванням після створення таблиці!
Немає потреби в статистиці для RowID (Identity): Оскільки значення в стовпці ідентичності є послідовними і передбачуваними, оптимізатор запитів не потребує окремих статистичних даних для стовпця ідентичності. Статистика стовпцевого індексу достатня, і стовпець ідентичності включено в ці статистики.
У моєму коді (для того, щоб пам'ятати): умова l.stats_column_id = 1
означає, що запит перевіряє, чи є стовпець частиною об'єкта статистики і зокрема першим стовпцем у цьому об'єкті. (це фільтрує RowID). Треба перевірити!!!
Цей скрипт використовується для отримання дати останнього оновлення для кожного об'єкта статистики:
SELECT
sm.[name] AS [schema_name],
tb.[name] AS [table_name],
co.[name] AS [stats_column_name],
st.[name] AS [stats_name],
STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
FROM
sys.objects ob
JOIN sys.stats st
ON ob.[object_id] = st.[object_id]
JOIN sys.stats_columns sc
ON st.[stats_id] = sc.[stats_id]
AND st.[object_id] = sc.[object_id]
JOIN sys.columns co
ON sc.[column_id] = co.[column_id]
AND sc.[object_id] = co.[object_id]
JOIN sys.types ty
ON co.[user_type_id] = ty.[user_type_id]
JOIN sys.tables tb
ON co.[object_id] = tb.[object_id]
JOIN sys.schemas sm
ON tb.[schema_id] = sm.[schema_id]
WHERE
st.[user_created] = 1;
Перекладено з: [SQL Server Statistics](https://medium.com/@kwtrelbakouri1/sql-server-statistics-0864ef0b9811)