Particionamento do SQL Server - o que usar para a chave de partição?

10

Nunca trabalhei com o particionamento do SQL Server, mas atualmente enfrento o design de um banco de dados para o qual os volumes provavelmente o justificam. O sistema é para cupons. Os cupons devem ser emitidos periodicamente, geralmente a cada seis semanas, embora também haja emissão ad-hoc - por exemplo, para um evento especial. Existem 15 milhões de clientes e, para cada evento de emissão, cada cliente receberá 6 tipos diferentes de cupom, totalizando 90 milhões de ocorrências. Precisamos rastrear os dados de resgate da instância do cupom e mantê-lo por 6 meses, embora normalmente um cupom seja válido apenas por seis semanas. Qualquer solicitação de resgate de um cupom inválido não chegará ao banco de dados, pois será validada pelo PDV até.

Durante um período de seis meses, precisaremos armazenar 360 milhões de linhas na tabela Instância de cupom e até 72 milhões (assumindo uma taxa máxima de resgate de 20%) na tabela de resgate. Tenho a sensação de que esses números são grandes demais para uma única partição?

Minha pergunta é - o que usar como chave de partição? Um candidato óbvio seria por evento de emissão, fornecendo aproximadamente 6 partições. Mas acho que talvez isso daria um tamanho de partição muito grande para permitir o desempenho ideal? Seria possível particionar por duas chaves, por exemplo, por evento de emissão + último dígito do ID do cliente? Então a lógica seria:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Além disso, não tenho certeza das especificações do servidor de banco de dados que precisaremos. 16gb e 8CPUs serão suficientes? O banco de dados precisa poder retornar um resultado da tabela de instância de cupom, digitada em um valor numérico de código de barras em menos de meio segundo. A solicitação de transação esperada para validar (selecionar) e resgatar (inserir) deve atingir um pico de aproximadamente 3.500 por minuto.

O servidor SQL Server 2008r2 de 64 bits db será provisionado como VM a partir de um host muito poderoso com acesso a uma SAN de alto desempenho e grande capacidade.

Ficaria muito grato por qualquer conselho daqueles que implantaram uma solução do SQL Server para gerenciar volumes semelhantes.

Saudações

Roubar.

Rob Bowman
fonte
2
Suas tabelas ainda são pequenas - não há necessidade de partições, eu tenho uma tabela com alguns bilhões de linhas sem partição, funciona. Porém, as partições são boas para o FAST DROP.
TomTom
11
Bobagem @TomTom, as partições podem ser benéficas na contagem de linhas uma fração disso. Concedido que o esquema de partição deve ser benéfico para os padrões de acesso para obter um ganho de desempenho, mas um cobertor "sem NECESSIDADE" nesse tamanho está totalmente errado.
Mark Storey-Smith
11
Não, está correto. NECESSIDADE! = Benefício. NECESSIDADE é quando você encontra problemas ao fazer consultas sem partições.
TomTom
11
Ei, TomTom, acho que você precisa de um pequeno amigo, isso é um pouco forte, mesmo que não seja realmente ofensivo. Concordo com Mark StoreySmith, um cobertor "no Need" está completamente errado, mas sua afirmação de que provavelmente não é necessária está correta. Eu imagino que é uma questão de indexação. Eu também sei que Mark sabe o que você quer dizer com necessidade versus benefício. Cortar a todos nós um pouco de folga e deixar a cafeína, k? (E confiem em mim, eu sou conhecido por ter muito pouca paciência alguns dias, especialmente dias como hoje onde estou em analgésicos para a minha volta)
jcolebrand

Respostas:

14

As perguntas de especificação do servidor devem ser direcionadas para Serverfault ou DBA.SE.

Para a questão do particionamento, não acho que você precise particionar para isso.

360m linhas é muito, mas não é muito pesado.

Você NÃO sob quaisquer circunstâncias tentar partição com base no último dígito de um campo. Não tenho certeza se isso funcionaria, mas não é SARGable que não seria sustentável.

Se você precisar apenas procurar uma única linha com base em uma chave numérica, o particionamento provavelmente não ajudará.

Se você decidir seguir a rota da partição, lembre-se de que todas as suas consultas precisam ser eficazes para incluir suas chaves de partição, para que o mecanismo saiba qual partição verificar. Caso contrário, ele verificará todos eles e você realmente prejudicará o desempenho.

JNK
fonte
Eu também concordo. Às vezes, você só precisa de índices melhores.
jcolebrand
Discordo de @JNK. Uma busca de linha única com base em uma chave numérica que se beneficia da eliminação da partição está reduzindo a E / S. Se os padrões de acesso forem tais que as partições acessadas com frequência permaneçam no buffer pool em partições acessadas com pouca frequência, você terá outros benefícios de desempenho. E nem tocamos no meu recurso favorito que o particionamento oferece a você, disponibilidade parcial.
Mark Storey-Smith
Para o registro, em seus outros pontos Concordo plenamente :)
Mark Storey-Smith
@ MarkStorey-Smith - Vai depender da chave dele. Conforme definido atualmente no OP, a partição não agregaria nenhum valor. Também parece que ele não poderá usar uma chave de duas partes com um campo de data ou um esquema de partição "normal".
JNK
5

Você pode particionar em várias chaves se usar uma coluna computada persistente; como outros disseram, no entanto, o particionamento não funciona para todas as situações. Não sei se entendi o seu cenário o suficiente para lhe dar conselhos específicos, mas aqui estão algumas diretrizes gerais:

  • O particionamento é útil na leitura de dados quando a chave de particionamento faz parte da instrução SQL, que permite ao otimizador invocar a exclusão de partição. Você precisa ter certeza de que a chave escolhida é útil para a maioria das consultas.

  • Um benefício de uma boa estratégia de particionamento é o envelhecimento dos dados; por exemplo, se sua chave de partição é baseada em data (ou seja, o dia do ano) e você deseja remover todos os dados anteriores a uma determinada data, é muito fácil alternar essas partições para uma tabela vazia e truncar.

Stuart Ainsworth
fonte
4

Você realmente precisa definir seus requisitos um pouco mais claramente. Você mencionou que terá aproximadamente 360 ​​milhões de linhas em 6 meses. Que tal daqui a 2 anos? Você continuará crescendo apenas na taxa em que está crescendo atualmente? Ou existe uma chance de você experimentar um crescimento exponencial. Deseja manter os dados nesta tabela para sempre; ou você deseja arquivar dados regularmente.

O particionamento pode ser usado para arquivamento de dados. Veja o cenário da janela deslizante. Veja este white paper e este .

O particionamento também pode ser usado para gerenciar a fragmentação do índice. Você pode reconstruir / reorganizar partições específicas.

Você também deve considerar as visualizações particionadas em oposição às tabelas particionadas. As visualizações particionadas não exigem licença do SQL Server Enterprise. As visualizações particionadas também permitem executar reconstruções de índice online em uma "partição" específica.

O particionamento também pode ser considerado ao fazer o planejamento de recuperação de desastres. Pode ser usado para recuperação parcial do banco de dados. Por exemplo: você pode ter suas partições antigas em um grupo de arquivos diferente das partições principais / atuais. E então, quando você está se recuperando, recupera o grupo de arquivos primário, o grupo de arquivos em que suas partições atuais residem e, por fim, você pode restaurar os grupos de arquivos nos quais as partições antigas residem. Isso pode reduzir a quantidade de tempo que seu aplicativo precisa ser desativado.

Confira este ótimo vídeo de Kimberly Tripp sobre particionamento .

Dharmendar Kumar 'DK'
fonte
Só precisamos manter os dados por seis meses. Toda semana, executaríamos um trabalho de limpeza que excluiria os cupons emitidos mais de seis meses antes.
Rob Bowman
3
Então, basicamente, você teria que excluir / remover aproximadamente 15 milhões de linhas por semana. Qual a largura da mesa? Eu sugiro que você particione a tabela por coluna de data. Dessa forma, as exclusões semanais seriam uma simples operação meta. Você simplesmente precisa COMUTAR a partição mais antiga da tabela particionada principal em uma tabela intermediária. Em seguida, solte a mesa de preparação. Isso é chamado de cenário do Windows deslizante. Procure o primeiro white paper que publiquei, oh, como fazer isso.
Dharmendar Kumar 'DK'
-2

A menos que você faça o particionamento por causa do arquivamento de dados antigos, está fazendo isso pelo motivo errado e não deve fazê-lo.

Ryk
fonte
2
Existem várias razões para usar o particionamento além do arquivamento; a exclusão de partição é de grande benefício para muitos tipos diferentes de consultas, se usadas corretamente.
Stuart Ainsworth
Eu concordo com Stuart, este é um conselho um tanto ruim.
jcolebrand