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 / user-7226

Adrian Torrie's questions

Martin Hope
Adrian Torrie
Asked: 2015-11-24 15:56:02 +0800 CST

Por que devo "Evitar tabelas de dimensão de particionamento" no SQL Server?

  • 6

O SQL Cat tem uma lista de dicas intitulada Top 10 Best Practices for Building a Large Scale Relational Data Warehouse .

Na seção, 4 - Design dimension tables appropriatelyeles afirmam:

Evite particionar tabelas de dimensão.

Eles não mencionam por que isso não deve ser feito, nem consigo encontrar nada na web que aponte explicitamente por que é algo a ser evitado.

Por que devo evitar o particionamento de tabelas de dimensão?

Um exemplo mais concreto é fornecido abaixo para ajudar a facilitar uma resposta e manter uma discussão sobre por que o particionamento não deve ser feito em grandes data warehouses relacionais. Não estou procurando conselhos sobre como melhorar o modelo de dados específico do exemplo concreto. Se o exemplo não ajudar a fornecer nenhuma visão extra sobre por que as dimensões de particionamento não devem ser feitas, ignore-o.


Exemplo: você pode usar para fazer referência em sua resposta sobre por que as dimensões particionadas são uma ideia ruim/abaixo do ideal (se isso ajudar você) ...

Em nosso ambiente temos uma Accountdimensão, esta é particionada DateEffectivee carregada mensalmente . Algumas de nossas consultas envolvem WHERE DateEffective >= @ReportDate, que parece ser um bom candidato para eliminação de partições. Além disso, se precisarmos recarregar os dados do mês, excluiremos os dados de um mês inteiro, o que também parece se beneficiar do particionamento da tabela.


Atualização sobre nosso ambiente desde a postagem da pergunta...

A tabela mencionada acima possui índices não agrupados não alinhados (investigados com o seguinte código Brent Ozar ).

select
    [db_name]               = isnull(db_name(s.database_id),db_name())
    ,[schema_name]          = object_schema_name(i.object_id,db_id())
    ,[object_name]          = o.name
    ,index_name             = i.name
    ,index_type_desc        = i.type_desc
    ,data_space_name        = ds.name
    ,data_space_type_desc   = ds.type_desc
    ,s.user_seeks
    ,s.user_scans
    ,s.user_lookups
    ,s.user_updates
    ,s.last_user_seek
    ,s.last_user_update
from
    sys.objects as o

    inner join sys.indexes as i 
        on o.object_id = i.object_id

    inner join sys.data_spaces as ds 
        on ds.data_space_id = i.data_space_id

    left join sys.dm_db_index_usage_stats as s 
        on  i.object_id     = s.object_id 
        and i.index_id      = s.index_id
        and s.database_id   = db_id()
where 
        o.type      = 'u'
    and i.type      in (1, 2)
    and o.object_id in
    (
         select filter.object_id 
         from
         (
             select ob.object_id, ds.type_desc 
             from 
                sys.objects ob 
                inner join sys.indexes ind on ind.object_id = ob.object_id 
                inner join sys.data_spaces ds on ds.data_space_id = ind.data_space_id
             group by ob.object_id, ds.type_desc 
         ) as filter 
         group by filter.object_id 
         having count(*) > 1
     )
order by
    [object_name] desc
;

Isso mostrou:

  • o clusteredíndice no esquema de partição
  • 5 de 8 non-clusteredíndices no esquema de partição
  • 3 de 8 non-clusteredíndices em primary, orows_filegroup
    • 1 deles era um unique, non-clusteredíndice (por uma questão de integridade: definido como um primary key non-clusteredno script de criação de tabela no controle de origem)


outra atualização

Encontrei esta resposta de Remus Rusanu , que lança alguma luz sobre as complicações com tabelas particionadas que seriam relevantes para as dimensões.

Suas declarações são citadas em bloco com minha interpretação usando meu exemplo acima


índices não alinhados impedem operações eficientes de troca de partições

Portanto, devemos tentar alinhar os índices quando uma tabela é particionada. A troca de partição nem é usada (possivelmente evitada?) para carregar a tabela no meu exemplo, pois há índices não alinhados.

O uso de índices alinhados resolve esses problemas, mas traz seu próprio conjunto de problemas, porque essa opção física de design de armazenamento afeta o modelo de dados

Este certamente parece ser o caso do exemplo que forneci, e algumas alterações seriam necessárias para implementar índices alinhados.

Devido às dimensões que normalmente usam chaves substitutas como primary key(a unique clustered index), isso fornece uma chave estreita cada vez maior (ou seja, tamanho de dados pequeno no disco). Isso é importante porque as buscas da árvore B que ocorrem quando a união entre dimensões e fatos pode ocorrer mais rapidamente. Além disso, o clustered indexserá parte de qualquer non-clustered indexes criado, o que também evita o inchaço do índice não clusterizado, criando buscas/varreduras de índice mais eficientes aqui também.

Por que isso é importante?

índices alinhados significam que restrições exclusivas não podem mais ser criadas/aplicadas (exceto para a coluna de particionamento)

e

todas as chaves estrangeiras que fazem referência à tabela particionada devem incluir a chave de particionamento

e

isso, por sua vez, requer que todas as tabelas que fazem referência à tabela particionada contenham o valor da coluna da chave de particionamento ... para declarar corretamente a restrição de chave estrangeira.

Os impactos são...

  • Uma DateEffectivecoluna precisaria ser adicionada a cada tabela que faz referência à dimensão da conta em nosso ambiente. A implementação de uma DateEffectivecoluna nas tabelas de fatos que temos é redundante, pois essa pesquisa é cuidada por nosso processo ETL que carrega o AccountIDvalor da chave correto. Além disso, alguns fatos são declarados em uma granulação que é mais seletiva do que um datetipo de dados, o que DateEffectiveclaramente é, tornando mais sem sentido incluir essa coluna nas tabelas de fatos (efeitos de ondulação do modelo de dados).
  • Alguns dos non-clustered indexes precisariam ser alterados para incluir a DateEffectivecoluna

No entanto ...

  • Armazéns de dados normalmente não têm foreign keyrestrições implementadas. Uma boa resposta no SO cobre isso .
  • Além disso, desde a edição de 2008, o Sql Server está parallel bitmap filtered hash-joinsdisponível para otimizar junções em estrela (consulte: Otimizando o desempenho da consulta do data warehouse por meio da filtragem de bitmap) e as chaves estrangeiras não são necessárias para essa otimização.
  • Isso parece indicar que não há problema em particionar uma tabela de dimensão, pois as alterações necessárias agora são "apenas" incluir a chave de partição nos índices não alinhados, porque o problema de restrição de chave estrangeira não existe em nosso ambiente ( nosso processo ETL gerencia essa integridade).
sql-server database-design
  • 1 respostas
  • 2525 Views
Martin Hope
Adrian Torrie
Asked: 2013-10-22 17:09:48 +0800 CST

Existe um método quantitativo a seguir para determinar FILLFACTOR para NONCLUSTERED INDEXes?

  • 0

Eu li ideias diferentes para definir FILLFACTORe monitorar a fragmentação ao longo do tempo ( #1: 5 coisas sobre o fator de preenchimento , #2: práticas recomendadas de manutenção de banco de dados, parte II – configuração do FILLFACTOR ).

Em vez de fazer um palpite 'educado' antecipadamente e depois ajustar, eu queria saber:

  • Se alguém soubesse de uma maneira (quantitativa) de determinar qual nível de fator de preenchimento seria necessário antecipadamente ?

(Estou preocupado principalmente com relação a NONCLUSTERED INDEXes, já que normalmente crio meus índices clusterizados em números inteiros cada vez maiores.)

sql-server nonclustered-index
  • 1 respostas
  • 79 Views
Martin Hope
Adrian Torrie
Asked: 2013-10-19 23:06:53 +0800 CST

SSIS 2012 Ftp paralelo/assíncrono download de vários arquivos

  • 1

Qualquer ajuda seria apreciada com qualquer cenário.

E se

Existem configurações disponíveis para baixar vários arquivos em paralelo de um servidor FTP?

senão

Caso contrário, acho que vou lançar o meu próprio componente de origem do script C# usando: List Directory Contents with FTP , FtpWebRequest Class e C# Multiple Download from FTP using parallel task - Duplicate Download issue to get go.

Outros detalhes

  • SSIS 2012 salvando em um diretório local do Windows Server 2012
  • 100 + arquivos de texto ascii
  • 6 pastas irmãs
  • Convenção de nome de arquivo:AAAA_YYYYMMDD.txt
  • O tamanho do arquivo varia de 5 KB a 15 MB
  • Atualmente, só é possível baixar um arquivo por vez
  • Execute uma vez por dia manualmente neste estágio via SSDT (ainda em prototipagem/desenvolvimento, portanto não em um sistema de produção ainda, mas pretendo ter o Sql Agent executando os pacotes no futuro)
  • Pacotes downstream para carregar dados de arquivo de texto em tabelas de armazenamento de dados (se a tarefa de script for usada, talvez o buffer do fluxo de resposta possa entrar em um multicast com 1 fluxo de buffer gravando em arquivos de texto, enquanto o outro fluxo de buffer grava em tabelas de teste?)
ssis c#
  • 1 respostas
  • 1641 Views
Martin Hope
Adrian Torrie
Asked: 2013-10-16 18:41:21 +0800 CST

Devo adicionar compactação no nível da página antes de adicionar a chave primária ou depois?

  • 14

Situação

  • Armazém de dados no SQL Server 2008 Enterprise
  • Heap de mais de 36 milhões de linhas (não pergunte), com mais de 60 colunas
  • 750 mil adicionados mensalmente
  • Nenhuma chave primária definida (já identifiquei uma)
  • Sem compressão

O que estou pensando em fazer (nesta ordem)

  • Adicionar compactação no nível da página
  • Adicione o PK
  • Adicionar um número de índices não clusterizados
  • Faça isso o mais rápido possível

Pergunta

  • Por fim: devo adicionar o PK ou a compactação da página primeiro? (Isso importa?)
  • Se eu adicionar a compactação primeiro à tabela, algum índice herdará as configurações de compactação no nível da tabela? A resposta a esta pergunta específica é "Não, a compactação não é herdada", encontrada aqui em dba.stackexchange

No que estou me inclinando no momento

-- Add page level compression
alter table     dbo.TableName
rebuild with    (data_compression = page)
; 
go

-- Add primary key
alter table             dbo.TableName
add constraint          PK_TableName
primary key clustered   (<Columns>)
;
go

-- Add NC_IXs here
...
...

Eu olhei aqui (documentação de criação de PK) e aqui (documentação de ALTER TABLE) , mas não consigo ver nada definitivo sobre se algum índice herda ou não as configurações de compactação da tabela. A resposta a esta pergunta específica é "Não, a compactação não é herdada", encontrada aqui em dba.stackexchange

sql-server sql-server-2008
  • 2 respostas
  • 2940 Views

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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