Статистика SQL Server

В SQL статистика є об'єктами метаданих, які зберігають інформацію про розподіл даних у таблицях і індексах. Вони використовуються оптимізатором запитів SQL для оцінки найбільш ефективного способу виконання запиту. Без точних статистичних даних оптимізатор може створити неефективні плани запитів, що призведе до поганої продуктивності.

Статистика для оптимізації запитів є двійковими великими об'єктами (BLOB), які містять статистичну інформацію про розподіл значень в одному або кількох стовпцях таблиці або індексованого виду. Оптимізатор запитів використовує ці статистичні дані для оцінки кардинальності (cardinality) або кількості рядків у результаті запиту. Ці оцінки кардинальності дозволяють оптимізатору створити високоякісний план запиту. Наприклад, залежно від ваших умов (predicates), оптимізатор запитів може вибрати оператор пошуку за індексом замість більш ресурсоємного оператора сканування індексу, якщо це покращує продуктивність запиту.

Кожен об'єкт статистики створюється на основі списку одного або кількох стовпців таблиці і включає гістограму, яка відображає розподіл значень у першому стовпці.

Об'єкти статистики для кількох стовпців також зберігають статистичну інформацію про кореляцію значень серед стовпців. Ці статистики кореляції, або щільності (densities), отримуються на основі кількості унікальних рядків значень стовпців.

pic

Якщо стовпець ідентичності визначений як частина первинного ключа, кластеризованого індексу або некластеризованого індексу, 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.

Наступні записи створюються за замовчуванням після створення таблиці!

pic

pic

Немає потреби в статистиці для RowID (Identity): Оскільки значення в стовпці ідентичності є послідовними і передбачуваними, оптимізатор запитів не потребує окремих статистичних даних для стовпця ідентичності. Статистика стовпцевого індексу достатня, і стовпець ідентичності включено в ці статистики.

У моєму коді (для того, щоб пам'ятати): умова l.stats_column_id = 1 означає, що запит перевіряє, чи є стовпець частиною об'єкта статистики і зокрема першим стовпцем у цьому об'єкті. (це фільтрує RowID). Треба перевірити!!!

pic

Створення та оновлення статистики за допомогою ресурсів Azure Synapse SQL — Azure Synapse Analytics | Microsoft Learn

Цей скрипт використовується для отримання дати останнього оновлення для кожного об'єкта статистики:

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)

Leave a Reply

Your email address will not be published. Required fields are marked *