Eu tenho uma tabela de fatos CardTransactionFact
Estrutura da Tabela
TABLE [dbo].[CardTransactionFact]
[CardTransactionID] [int] IDENTITY(1,1) NOT NULL,
[TransactionTerminalID] [int] NOT NULL,
[SourceAccountTypeID] [int] NULL,
[DestinationAccountTypeID] [int] NULL,
[RimNo] [varchar](15) NULL,
[CaptureCodeID] [int] NOT NULL,
[RoutingCodeID] [int] NOT NULL,
[ProcessingCodeID] [int] NOT NULL,
[ActionCodeID] [int] NOT NULL,
[NetworkCodeID] [int] NOT NULL,
[ProductCodeID] [int] NOT NULL,
[AcquiringCountryCodeID] [int] NOT NULL,
[IssuingCountryCodeID] [int] NOT NULL,
[TransactionCurrencyCodeID] [int] NOT NULL,
[AmountBD] [decimal](18, 3) NOT NULL,
[LocalCurrencyCodeID] [int] NOT NULL,
[CardIssuerBank] [int] NOT NULL,
[CardTypeID] [int] NOT NULL,
[SuspectTransactionFlag] [char](1) NOT NULL,
[ReversalTransactionFlag] [char](1) NOT NULL,
[LocalTransactionDateKey] [int] NOT NULL,
[LocalTransactionHourKey] [int] NOT NULL,
[BBKRole] [char](1) NOT NULL,
[AmountRangeKey] [int] NULL,
[CustomerKey] [int] NULL
Tamanho: 11 GB Número de linhas: 56.959.828
Tornou-se muito difícil acessar esta tabela agora, um simples Select count(*) from CardTransactionFact
leva horas para ser executado.
a maioria das colunas na tabela são apenas números inteiros, é por isso que não fiz nenhuma indexação.
O que você acha que devo fazer para melhorar esta tabela e aumentar a velocidade das consultas a esta tabela
- Se estiver indexando quais colunas devo indexar e por quê
- É uma boa ideia particionar a tabela
- Qualquer outra sugestão
Muitas coisas erradas aqui, felizmente muitas que podem ser consertadas.
Problemas:
Conserta:
11 GB não cabem em 6 GB, é realmente simples assim. Uma estimativa muito aproximada sugere que a tabela ocupará aproximadamente 1,5 milhão de páginas de 8 KB, o que, com 100 IOPS, levaria aproximadamente 4 horas para ser lida do disco (assumindo o pior caso, leitura 100% aleatória, sem leitura antecipada, etc.).
Substitua sua consulta
Com Abaixo
Você deve ter
Clustered Index
em sua Tabela. Execute DBCC CONTIG para verificar a fragmentação em sua tabela heapUm problema que ocorre na mesa é a questão de ela ficar fragmentada. Dependendo da atividade executada, como DELETES, INSERTS e UPDATES, suas tabelas heap e tabelas clusterizadas podem se tornar fragmentadas. Muito disso depende da atividade, bem como dos valores-chave usados para o índice clusterizado.
Estatísticas antes da reconstrução do índice
Execute DBCC CONTIG novamente para verificar a fragmentação em sua tabela heap
Estatísticas após a reconstrução do índice
Recriar consulta de índice para remover o índice
Referência
Tanto a indexação quanto o particionamento podem ajudar muito. Mas quais índices e como você divide as partições depende muito das consultas que você executa nelas.
Sem índices ou particionamento, o otimizador de consulta terá que ler a tabela completa para cada consulta.
Para a parte de particionamento, existe uma coluna lógica que você possa usar facilmente para separar os dados em várias partições? E é possível adicionar esta coluna à cláusula where da maioria das consultas?