Índices columnstore clusterizados e chaves estrangeiras

18

Estou ajustando o desempenho de um data warehouse usando índices. Eu sou bastante novo no SQL Server 2014.A Microsoft descreve o seguinte:

"Vemos o índice columnstore clusterizado como o padrão para armazenar grandes tabelas de fatos de data warehousing e esperamos que ele seja usado na maioria dos cenários de data warehousing. Como o índice columnstore clusterizado é atualizável, sua carga de trabalho pode executar um grande número de inserções, atualizações, e excluir operações ". http://msdn.microsoft.com/en-us/library/gg492088.aspx

No entanto, se você ler mais na documentação, encontrará limitações e restrições:

"Não pode ter restrições exclusivas, restrições de chave primária ou restrições de chave estrangeira."

Isso me confunde muito! É uma boa prática (não obrigatória) ter chaves estrangeiras no data warehouse por vários motivos (integridade dos dados, relações visíveis para a camada semântica ...)

Portanto, a Microsoft defende índices columnstore clusterizados para cenários de data warehouse; no entanto, ele não pode lidar com relacionamentos de chave estrangeira ?!

Estou correto nisso? Quais outras abordagens você recomendaria? No passado, usei um índice columnstore não clusterizado em cenários de data warehouse, com descarte e reconstrução para carregamentos de dados. No entanto, o SQL Server 2014 não adiciona nenhum novo valor real aos data warehouses ??

OverflowStack
fonte
À medida que o recurso amadurece, você verá mais e mais desses recursos sendo suportados (diabos, em 2012, os índices columnstore eram somente leitura!). Enquanto isso, é oferecido um trade-off - ótimo desempenho com limitações ou a mesma idade. Também não acredito que eles pretendiam que isso significasse que todas as tabelas em seu DW deveriam ter índices columnstore clusterizados e que nenhuma tabela deveria ter restrições - provavelmente há um número limitado de tabelas em qualquer DW que daria um grande estrondo para o bode.
Aaron Bertrand
3
Cuidado - ele pode lidar com junções. Um relacionamento FK não é totalmente necessário para uma associação. Ele existe para lidar com a integridade referencial - o que é bom ter, mas em um data warehouse pode ser omitido. Em risco, sim, mas também com um ganho de desempenho.
TomTom
8
Também - "nenhum novo valor real"? Você quer dizer que ser gravável e agrupado não parece uma melhoria para você? O fato de os usuários poderem consultar dados em tempo real, em vez de esperar uma queda e reconstruir para obter dados mais atuais, não parece uma coisa boa para seus usuários e menos manutenção para você? encolher de ombros
Aaron Bertrand
Você pode ter índices (exclusivos) criando uma exibição indexada. Parece que a infraestrutura para manutenção de índice já está lá. É que os índices normais ainda não foram implementados.
usr
@AaronBertrand Em um cenário DWH com tabelas de fatos com chave estrangeira, o índice Clustered Columnstore não funciona. Isso contrasta com a Microsoft, esperando que isso seja o padrão para armazenar grandes tabelas de fatos. Espero que você possa provar que estou errado ...? Porque eu gosto do SQL Server.
OverflowStack

Respostas:

13

Você tem muitas perguntas aqui:

P: (A falta de chaves estrangeiras) me confunde muito! É uma boa prática (não obrigatória) ter Fk's no DWH por vários motivos (integridade dos dados, relações visíveis para a camada semântica, ...)

R: Correto, normalmente é uma boa prática ter chaves estrangeiras em um data warehouse. No entanto, os índices columnstore clusterizados ainda não suportam isso.

P: Portanto, a MS defende os índices de armazenamento de colunas em cluster para cenários DWH. No entanto, ele não pode lidar com relacionamentos FK ?!

R: A Microsoft fornece ferramentas. Depende de você como você usa essas ferramentas.

Se o seu maior desafio for a falta de integridade dos dados em seu data warehouse, a ferramenta que você deseja é tabelas convencionais com chaves estrangeiras.

Se o seu maior desafio for o desempenho da consulta e você estiver disposto a verificar sua própria integridade de dados como parte do processo de carregamento, a ferramenta desejada será o índice columnstore clusterizado.

P: No entanto, o SQL 2014 não agrega nenhum valor real para DWH ??

R: Felizmente, o columnstore clusterizado não foi o único recurso novo no SQL Server 2014. Por exemplo, confira o novo estimador de cardinalidade.

P: Por que estou tão bravo e irritado com a maneira como meu recurso favorito foi implementado?

A: Você me pegou - você realmente não fez essa pergunta - mas eu responderei de qualquer maneira. Bem-vindo ao mundo do software de terceiros, onde nem tudo é construído de acordo com suas especificações exatas. Se você se sente apaixonado por uma alteração que gostaria de ver em um produto da Microsoft, consulte Connect.Microsoft.com . É o processo de feedback deles, onde você pode enviar uma alteração, outras pessoas podem votar e, em seguida, a equipe do produto lê e diz por que não a implementou. As vezes. Na maioria das vezes, eles apenas o marcam como "não consertam, funcionam na minha máquina", mas, ei, às vezes você recebe algumas respostas.

Brent Ozar
fonte
"Correto, normalmente é uma boa prática ter chaves estrangeiras em um data warehouse" -> SQLCAT - As 10 melhores práticas para criar um data warehouse relacional em larga escala ... "Crie índices não clusterizados para cada chave estrangeira." -> Nada sobre impor o relacionamento FK mencionado no link, e o CI não é redundante devido ao columnstore, portanto, não indicaria a necessidade de FK na tabela de fatos, você concorda? Interessado em seus pensamentos sobre isso.
Adrian Torrie 03/02
11
... e para dimensões: "Evite aplicar relações de chave estrangeira entre o fato e as tabelas de dimensões, para permitir carregamentos mais rápidos de dados. Você pode criar restrições de chave estrangeira com o NOCHECK para documentar os relacionamentos; mas não os imponha. Garanta a integridade dos dados. através de transformar pesquisas ou executar as verificações de integridade de dados na fonte dos dados "
Adrian Torrie
6

Entendo que você sente algumas peças que costumava estar faltando. Mas isso é apenas porque eles estão desaparecidos.

No entanto, o SQL Server estava sendo usado com êxito quando Chaves Estrangeiras eram apenas um conceito (que implementamos por meio de gatilhos naqueles dias), não uma implementação física, como uma restrição. A integridade referencial declarativa estava presente pelo menos no SQL Server 7.0, mas muito mais fraca que a implementação atual.

Em relação ao valor do Índice de ColumnStore em Cluster, ele fornece um índice e as linhas são atualizáveis. Você pode achar esta discussão valiosa: http://sqlwithmanoj.com/2014/07/24/maintaining-uniqueness-with-clustered-columnstore-index-sql-server-2014/

Manoj ressalta que existe uma maneira de criar uma Visualização Indexada / Materializada no topo desta tabela, com a Chave de Cluster como a PK (1ª coluna da tabela / visualização). Se isso combina com você, é claro, é uma decisão que você deve tomar.

Mas, como Aaron Bertrand e TomTom comentaram, isso tem tudo a ver com melhor desempenho. Se você puder gerenciar os outros problemas que lhe dizem respeito (e acredito que sejam administráveis), você obterá alguns benefícios. Portanto, use o ColumnStore para saber o que é capaz de fazer e gerenciar os recursos ausentes.

RLF
fonte
2

Esta pergunta pertence ao SQL 2014, mas desejo fornecer informações adicionais à luz das alterações feitas no SQL 2016 nos índices columnstore, pois pode ser difícil resolver as limitações em diferentes versões e essa pergunta ainda aparece bastante alta no Google:

Para o SQL 2016, a Microsoft descreve um método para usar índices btree não clusterizados (que agora podem ser adicionados como índices secundários em uma tabela columnstore clusterizada) para impor restrições de chave estrangeira, desde que a restrição seja adicionada antes do índice columnstore: https: // docs .microsoft.com / pt-br / sql / bancos de dados relacionais / índices / columnstore-indexes-design-guidance

Niko Neugebauer também tem um post sobre isso; é realmente possível criar diretamente restrições exclusivas / estrangeiras nas tabelas columnstore (eu tenho aplicado essa abordagem no meu trabalho): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- more-clusterstore-columnstore-improvement-in-sql-server-2016 /

hexalm
fonte