Автоматизация ОБНОВЛЕНИЯ статистики на уровне столбцов в хранилище данных SQL Azure

Я планирую автоматизировать обновление (т. Е. ОБНОВЛЕНИЕ) статистики на уровне столбцов в моих базах данных хранилища данных SQL Azure. Я планирую регистрировать операции в таблице для конкретного сайта, а затем динамически генерировать SQL для обновления статистики, используя следующий подход:

  1. Столбцы DATE обновляются ежедневно,
  2. Столбцы идентификатора / кода первичного / внешнего ключа обновляются раз в две недели,
  3. Индикаторные / логические столбцы обновляются ежемесячно, и
  4. Столбцы QTY / AMT (факт) обновляются ежеквартально.

Я просмотрел функцию STATS_DATE на странице https://msdn.microsoft.com/library/ms190330.aspx, но эта функция, похоже, не поддерживает детали, необходимые для статистики на уровне столбцов. Например, результат для одной из моих таблиц, в которой есть три столбца, по которым была собрана статистика, показывает NULL для STATS_DATE:

SELECT 
  s.object_id,
  s.name,
  s.stats_id,
  s.user_created,
  STATS_DATE(object_id, stats_id) AS statistics_date  
FROM sys.stats s 
where object_id = 107141;

Возврат

  object_id         name                   stats_id user_created statistics_date
 107,141            MySchema_MyTable_Col1         2         1          [NULL]
 107,141            MySchema_MyTable_Col2         3         1          [NULL]
 107,141            MySchema_MyTable_Col3         4         1          [NULL]

Я упустил из виду или неправильно понял эту функцию, и могу ли я использовать STATS_DATE для управления статистикой моих столбцов?

Ниже приводится более полная демонстрация:

 --Create a columnar demonstration table
 create table My_Schema.steve_test_table_columnar (c1_c integer, c2_c smallint,   c3_c date, c4_c decimal(18,2) ) ; 
--Create a heap demonstration table
create table My_Schema.steve_test_table_heap (c1_h integer, c2_h smallint, c3_h date, c4_h decimal(18,2) ) with (HEAP) ;

-CREATE STATISTICS statements:
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_COLUMNAR_C1_C ON My_Schema.STEVE_TEST_TABLE_COLUMNAR ( C1_C ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_COLUMNAR_C2_C ON My_Schema.STEVE_TEST_TABLE_COLUMNAR ( C2_C ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_COLUMNAR_C3_C ON My_Schema.STEVE_TEST_TABLE_COLUMNAR ( C3_C ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_COLUMNAR_C4_C ON My_Schema.STEVE_TEST_TABLE_COLUMNAR ( C4_C ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_HEAP_C1_H ON My_Schema.STEVE_TEST_TABLE_HEAP ( C1_H ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_HEAP_C2_H ON My_Schema.STEVE_TEST_TABLE_HEAP ( C2_H ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_HEAP_C3_H ON My_Schema.STEVE_TEST_TABLE_HEAP ( C3_H ) ;
CREATE STATISTICS My_Schema_STEVE_TEST_TABLE_HEAP_C4_H ON My_Schema.STEVE_TEST_TABLE_HEAP ( C4_H ) ;

--UPDATE (aka "REFRESH") STATISTICS statements:
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_COLUMNAR ( My_Schema_STEVE_TEST_TABLE_COLUMNAR_C3_C ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_HEAP ( My_Schema_STEVE_TEST_TABLE_HEAP_C3_H ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_COLUMNAR ( My_Schema_STEVE_TEST_TABLE_COLUMNAR_C2_C ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_HEAP ( My_Schema_STEVE_TEST_TABLE_HEAP_C2_H ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_COLUMNAR ( My_Schema_STEVE_TEST_TABLE_COLUMNAR_C1_C ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_COLUMNAR ( My_Schema_STEVE_TEST_TABLE_COLUMNAR_C1_C ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_HEAP ( My_Schema_STEVE_TEST_TABLE_HEAP_C1_H ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_COLUMNAR ( My_Schema_STEVE_TEST_TABLE_COLUMNAR_C4_C ) ;
UPDATE STATISTICS My_Schema.STEVE_TEST_TABLE_HEAP ( My_Schema_STEVE_TEST_TABLE_HEAP_C4_H ) ;

--Validation Steps

select s.[schema_id] , s.[name] from sys.[schemas] s where s.[name] = 'My_Schema';

--Results:
schema_id name
24        My_Schema

--Get Table Object ID
select t.[object_id] , t.[name] from sys.[tables] t 
inner join sys.[schemas] s 
on t.[schema_id] = s.[schema_id] 
where s.[name] = 'My_Schema' and t.[name]  in ('STEVE_TEST_TABLE_HEAP' , 'STEVE_TEST_TABLE_COLUMNAR');

--Results:
object_id   name
516,196,889 steve_test_table_columnar
532,196,946 steve_test_table_heap


--Get Columnd IDs
select t.[object_id] , c.[column_id], t.[name] , c.[name] as Column_Name 
from 
     sys.[tables] t 
inner join 
     sys.[schemas] s 
on 
     t.[schema_id] = s.[schema_id] 
INNER JOIN
     sys.[columns] c
ON
     t.[object_id]       = c.[object_id]
where 
     s.[name] = 'My_Schema' 
 and t.[name]  in ('STEVE_TEST_TABLE_HEAP' , 'STEVE_TEST_TABLE_COLUMNAR')

--Results:
object_id   column_id   name                       Column_Name
516,196,889 1           steve_test_table_columnar   c1_c
516,196,889 2           steve_test_table_columnar   c2_c
516,196,889 3           steve_test_table_columnar   c3_c
516,196,889 4           steve_test_table_columnar   c4_c
532,196,946 1           steve_test_table_heap       c1_h
532,196,946 2           steve_test_table_heap       c2_h
532,196,946 3           steve_test_table_heap       c3_h
532,196,946 4           steve_test_table_heap       c4_h

--Final review of statistics metadata
select t.[object_id] , c.[column_id], t.[name] as table_name
, c.[name] as Column_Name  ,st.stats_id , st.name   as Stats_Name  
,stc.stats_column_id 
,STATS_DATE(st.object_id, st.stats_id) AS statistics_date
from  
     sys.[tables] t 
inner join 
     sys.[schemas] s 
on 
     t.[schema_id] = s.[schema_id] 
INNER JOIN
     sys.[columns] c
ON
     t.[object_id]       = c.[object_id]
INNER JOIN
     sys.stats st
ON
     st.[object_id]      = t.[object_id]
 and user_created = 1
INNER JOIN
  sys.[stats_columns] stc
on
     st.stats_id = stc.stats_id
 and st.[object_id] = stc.[object_id]
 and c.[column_id] = stc.[column_id]
where 
     s.[name] = 'My_Schema' 
 and t.[name]  in ('STEVE_TEST_TABLE_HEAP' , 'STEVE_TEST_TABLE_COLUMNAR')
 ;



object_id   column_id   table_name                  Column_Name stats_id    Stats_Name                                  stats_column_id statistics_date
516,196,889 1           steve_test_table_columnar   c1_c         2             My_Schema_STEVE_TEST_TABLE_COLUMNAR_C1_C 1               [NULL]
516,196,889 2           steve_test_table_columnar   c2_c         3             My_Schema_STEVE_TEST_TABLE_COLUMNAR_C2_C 1               [NULL]
516,196,889 3           steve_test_table_columnar   c3_c         4             My_Schema_STEVE_TEST_TABLE_COLUMNAR_C3_C 1               [NULL]
516,196,889 4           steve_test_table_columnar   c4_c         5             My_Schema_STEVE_TEST_TABLE_COLUMNAR_C4_C 1               [NULL]
532,196,946 1           steve_test_table_heap       c1_h         2             My_Schema_STEVE_TEST_TABLE_HEAP_C1_H     1               [NULL]
532,196,946 2           steve_test_table_heap       c2_h         3             My_Schema_STEVE_TEST_TABLE_HEAP_C2_H     1               [NULL]
532,196,946 3           steve_test_table_heap       c3_h         4             My_Schema_STEVE_TEST_TABLE_HEAP_C3_H     1               [NULL]
532,196,946 4           steve_test_table_heap       c4_h         5             My_Schema_STEVE_TEST_TABLE_HEAP_C4_H     1               [NULL]

person Steve    schedule 14.02.2017    source источник
comment
Привет, Стив, я выполнил создание + обновление статистики для своей таблицы и запросил таблицу статистики с тем же запросом, что и в этом вопросе, и все сработало, как ожидалось. Это была воспроизводимая проблема?   -  person hirokibutterfield    schedule 15.02.2017
comment
Я обновил ОП более подробно.   -  person Steve    schedule 22.02.2017
comment
Эти таблицы по-прежнему оставались NULL после того, как вы вставили данные? Статистика по пустым таблицам возвращает NULL   -  person hirokibutterfield    schedule 15.03.2017


Ответы (1)


Я подтвердил, что если таблицы загружены, возвращаемое значение STATS_DATE (id, id) не равно нулю. Мой эксперимент заключался только в создании таблиц.

person Steve    schedule 31.03.2017