2017-02-14 40 views
3

我计划自动化Azure SQL数据仓库数据库的列级别统计信息的刷新(即更新)。我打算登录特定站点表的操作,然后动态生成SQL使用下面的方法来刷新统计:每天更新Azure SQL数据仓库的列级别统计信息的自动更新

  1. DATE列,
  2. ID /密码主/外键列刷新每周更新
  3. 每月更新指标/布尔列,
  4. QTY/AMT(事实)列每季刷新一次。

我查看了https://msdn.microsoft.com/library/ms190330.aspx的STATS_DATE函数,但是此函数似乎不支持列级统计信息所需的详细信息。例如输出为我的一个表有三列其中有收集的统计信息显示为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] 
+0

嘿史蒂夫,我执行了一个创建+更新我的表的统计数据和查询与该问题相同的查询统计表,并按预期工作。这是一个可重现的问题吗? – hirokibutterfield

+0

我更新了更详细的OP。 – Steve

+0

插入数据后,这些表是否仍为NULL?空表上的统计信息返回NULL – hirokibutterfield

回答

0

我证实,如果表加载,STATS_DATE(ID,ID)的返回值不为空。我的实验只涉及创建表格。