2017-02-14 1 views
3

Azure SQL 데이터웨어 하우스 데이터베이스에서 열 수준 통계의 새로 고침 (즉, UPDATE)을 자동화 할 계획입니다. Azure SQL 데이터웨어 하우스의 열 수준 통계 업데이트 자동화

  • ID/코드 차/외래 키 열을 갱신, 매일 업데이트

    1. DATE 컬럼 : 나는 사이트 특정 테이블에서 작업을 로그온 할 계획 동적으로 다음과 같은 방법을 사용하여 통계를 갱신하는 SQL을 생성 격주,
    2. 표시기/부울 열은 매월 새로 고침되고
    3. QTY/AMT (사실) 열은 분기별로 새로 고침됩니다.

    https://msdn.microsoft.com/library/ms190330.aspx에서 STATS_DATE 기능을 검토했지만이 기능은 열 수준 통계에 필요한 세부 정보를 지원하지 않는 것으로 보입니다.

    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] 
    

    내가 간과하거나이 기능을 오해하고 내가 할 수 있어야나요

    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; 
    

    결과 : 예를 들어 통계가 수집 한 세 개의 열이 내 테이블 중 하나에 대한 출력은 STATS_DATE에 대해 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)의 반환 값이 null이 있음을 확인 : 다음

    은보다 완벽한 데모입니다. 내 실험은 테이블 만 생성하는 것과 관련이있었습니다.

    관련 문제