AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 8128
Accepted
Matt Palmerlee
Matt Palmerlee
Asked: 2011-11-19 13:20:40 +0800 CST2011-11-19 13:20:40 +0800 CST 2011-11-19 13:20:40 +0800 CST

Projeto de datawarehouse: dimensão combinada de data e hora versus dimensões e fusos horários separados de dia e hora

  • 772

Estamos apenas começando a projetar um novo data warehouse e estamos tentando projetar como nossas dimensões de data e hora funcionarão. Precisamos ser capazes de suportar vários fusos horários (provavelmente pelo menos GMT, IST, PST e EST). Inicialmente, estávamos pensando que teríamos uma dimensão de data e hora combinada ampla com granularidade de talvez 15 minutos, dessa forma, temos uma chave em nossas tabelas de fatos e todos os dados de data e hora diferentes para todos os fusos horários suportados estão em uma tabela de dimensão. (isto é, chave de data, data GMT, hora GMT, data IST, hora IST, etc...)

Kimball sugere ter uma dimensão de dia separada da dimensão de hora do dia para evitar que a tabela fique muito grande (The data warehouse toolkit p. 240), o que parece bom, mas isso significaria que temos duas chaves em nossas tabelas de fatos para cada fuso horário precisamos apoiar (uma para a data e outra para a hora do dia).

Como sou muito inexperiente nesta área, espero que alguém conheça as compensações entre as duas abordagens, ou seja, desempenho versus gerenciamento de todas as chaves de fuso horário diferentes. Talvez existam outras abordagens também, já vi algumas pessoas falando sobre ter uma linha separada na tabela de fatos por fuso horário, mas isso parece um problema se as tabelas de fatos tiverem milhões de linhas, então você precisa quadruplicar para adicionar fusos horários .

Se fizermos o grão de 15 minutos, teremos 131.400 (24 * 15 * 365) linhas por ano em nossa tabela de dimensão de data e hora, o que não parece muito ruim para o desempenho, mas não saberemos com certeza até testarmos alguns consultas de protótipo. A outra preocupação em ter chaves de fuso horário separadas na tabela de fatos é que a consulta precisa juntar a tabela de dimensão a uma coluna diferente com base no fuso horário desejado, talvez isso seja algo que o SSAS cuida para você, não tenho certeza .

obrigado por qualquer pensamento, -Matt

sql-server ssis
  • 3 3 respostas
  • 13099 Views

3 respostas

  • Voted
  1. Best Answer
    Dharmendar Kumar 'DK'
    2011-11-19T14:00:39+08:002011-11-19T14:00:39+08:00

    Ter a data e a hora separadas permitirá que você faça agregações por tempo com muita facilidade. por exemplo: se você deseja executar uma consulta para saber qual período do dia é mais movimentado. Isso é muito facilmente realizado usando uma dimensão de tempo separada.

    Além disso, você deve ter apenas uma chave de tempo. Decida o horário GMT/EST - então use isso na tabela de fatos. Se você precisar executar relatórios com base em outro fuso horário, basta convertê-lo em seu aplicativo ou consulta.

    • 5
  2. Matt Palmerlee
    2012-03-03T23:01:21+08:002012-03-03T23:01:21+08:00

    Apenas um acompanhamento de como decidimos implementar nosso DataWarehouse para suportar múltiplos fusos horários e ser o mais eficiente possível: Escolhemos criar uma tabela de fusos horários (id, nome, etc...) bridge" que se parece com isso:

    time_zone_bridge
    ---------------
    date_key_utc
    time_key_utc
    timezone_id
    date_key_local
    time_key_local
    

    Desta forma, podemos manter nossas tabelas normais de dimensão de data e hora pequenas, todos os nossos fatos vinculados às chaves de data/hora UTC; e vincule as chaves locais de data/hora de volta às tabelas de dimensão de data e hora. Preenchemos nossa tabela de pontes de fuso horário usando o código C# invocado do SSIS, pois isso era muito menos complicado do que fazer coisas TZ diretamente do SqlServer.

    • 5
  3. Jon of All Trades
    2014-08-23T15:22:49+08:002014-08-23T15:22:49+08:00

    Já vi a ideia de um armazém usando uma DateTimedimensão combinada rejeitada, mas não vi um motivo muito claro para isso. Simplificando um pouco, aqui está a tabela de fatos que estou construindo agora:

    Transactions
    (
    ...
    CreatedDateTimeSK         INT NOT NULL,  -- Four bytes per date...
    AuthorizedDateTimeSK      INT NOT NULL,
    BatchSubmittedDateTimeSK  INT NOT NULL,
    BatchApprovedDateTimeSK   INT NOT NULL,
    SettlementDateTimeSK      INT NOT NULL,
    LocalTimeZoneSK           TINYINT NOT NULL  -- ...plus one byte for the time zone
    )
    

    Os DateTimecampos se juntam a uma tabela DateTime:

    DateTimes
    (
    DateTimeSK   INT NOT NULL PRIMARY KEY,
    SQLDate      DATE NOT NULL,
    SQLDateTime  DATETIME2(0) NOT NULL,
    Year         SMALLINT NOT NULL,
    Month        TINYINT NOT NULL,
    Day          TINYINT NOT NULL,
    Hour         TINYINT NOT NULL,
    Minute       TINYINT NOT NULL CHECK (Minute IN (0, 30)),
    ...
    )
    

    Isso está em uma resolução de meia hora, então são 48 registros por dia, 350.400 em 20 anos - bastante gerenciáveis.

    As datas/horas dos eventos são traduzidas para UTC quando armazenadas, mas com o LocalTimeZoneSKcampo e uma tabela de ponte podemos facilmente juntar para obter a hora local:

    TimeZoneBridge
    (
    DateTimeSK       INT NOT NULL,
    TimeZoneSK       TINYINT NOT NULL,
    PRIMARY KEY (DateTimeSK, TimeZoneSK),
    LocalDateTimeSK  INT NOT NULL
    )
    

    Para obter as transações criadas hoje, horário UTC:

    SELECT COUNT(*)
    FROM Transactions AS T
      INNER JOIN DateTimes AS CD ON T.CreatedDateTimeSK = CD.DateTimeSK
    WHERE CD.SQLDate = '2014-08-22'
    

    Para obter as transações criadas hoje, no horário local da transação:

    SELECT COUNT(*)
    FROM Transactions AS T
      INNER JOIN TimeZoneBridge AS TZB ON T.CreatedDateTimeSK = TZB.DateTimeSK AND T.TimeZoneSK = TZB.TimeZoneSK
      INNER JOIN DateTimes AS CD ON TZB.LocalDateTimeSK = CD.DateTimeSK
    WHERE CD.SQLDate = '2014-08-22'
    

    Você pode ficar tentado a simplificar as coisas substituindo o TimeZoneSKpor um REALdeslocamento (por exemplo, -5,0 para o horário de verão central dos EUA), mas isso será interrompido se algumas datas/horas de um registro de fato estiverem no horário de verão e outras não.

    Se os eventos para um registro de fato puderem ocorrer em fusos horários diferentes, como uma remessa ou um voo, você precisará de um campo de fuso horário para cada data e terá até cinco bytes por data.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve