Política de particionamento
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer
A política de particionamento define se e como as extensões (fragmentos de dados) devem ser particionadas para uma tabela específica ou uma exibição materializada.
A política dispara um processo adicional em segundo plano que ocorre após a criação de extensões, após a ingestão de dados. Esse processo inclui a redefinição de dados das extensões de origem e a produção de extensões homogêneas , nas quais todos os valores da coluna designada como a chave de partição residem em uma única partição.
O objetivo principal da política de particionamento é melhorar o desempenho da consulta em cenários específicos com suporte.
Observação
Por padrão, quando uma política de particionamento de dados não é definida (é null
), as extensões são particionadas por hora de criação (ingestão). Na maioria dos casos, não há necessidade de definir uma política de particionamento de dados.
Cenários com suporte
Veja a seguir os únicos cenários em que a configuração de uma política de particionamento de dados é recomendada. Em todos os outros cenários, não é recomendável definir a política.
-
guid
média ou alta:- Por exemplo: soluções multilocatários ou uma tabela de métricas em que a maioria ou todas as consultas são filtradas em uma coluna do tipo
string
ou , como o ou oguid
TenantId
.MetricId
- A cardinalidade média é de pelo menos 10.000 valores distintos.
- Defina a chave de partição de hash como a
string
coluna ouguid
e defina aPartitionAssignmentMode
propriedade comouniform
.
- Por exemplo: soluções multilocatários ou uma tabela de métricas em que a maioria ou todas as consultas são filtradas em uma coluna do tipo
-
Agregações ou junções frequentes em uma alta cardinalidade
string
ouguid
coluna:- Por exemplo, informações de IoT de muitos sensores diferentes ou registros acadêmicos de muitos alunos diferentes.
- A alta cardinalidade é de pelo menos 1.000.000 de valores distintos, em que a distribuição de valores na coluna é aproximadamente uniforme.
- Nesse caso, defina a chave de partição de hash como a coluna frequentemente agrupada por ou associada e defina a
PartitionAssignmentMode
propriedade comoByPartition
.
-
Ingestão de dados fora de ordem:
- Os dados ingeridos em uma tabela podem não ser ordenados e particionados em extensões (fragmentos) de acordo com uma coluna específica
datetime
que representa o tempo de criação de dados e é comumente usada para filtrar dados. Isso pode ser devido a um preenchimento de arquivos de origem heterogêneos que incluem valores de data e hora em um grande período de tempo. - Nesse caso, defina a chave de partição datetime de intervalo uniforme como a
datetime
coluna. - Se você precisar que as políticas de retenção e armazenamento em cache se alinhem com os valores de data e hora na coluna, em vez de se alinhar com a hora da ingestão, defina a
OverrideCreationTime
propriedade comotrue
.
- Os dados ingeridos em uma tabela podem não ser ordenados e particionados em extensões (fragmentos) de acordo com uma coluna específica
Cuidado
- Não há limites embutidos em código definidos para o número de tabelas com a política de particionamento definida. No entanto, cada tabela adicional adiciona sobrecarga ao processo de particionamento de dados em segundo plano. Definir uma política em mais tabelas resultará em mais recursos sendo usados e em custos mais altos devido a transações de armazenamento subjacentes. Para obter mais informações, consulte capacidade.
- Não é recomendável definir uma política de particionamento se o tamanho compactado dos dados por partição for menor que 1 GB.
- O processo de particionamento resulta em artefatos de armazenamento residuais para todas as extensões substituídas durante o processo de particionamento e durante o processo de mesclagem. Espera-se que a maioria dos artefatos de armazenamento residual seja excluída durante o processo de limpeza automática. Aumentar o valor da
MaxPartitionCount
propriedade aumenta o número de artefatos de armazenamento residuais e pode reduzir o desempenho da limpeza. - Antes de aplicar uma política de particionamento em uma exibição materializada, examine as recomendações para a política de particionamento de exibições materializadas.
Chaves de partição
Os seguintes tipos de chaves de partição são suportados.
Kind | Tipo de coluna | Propriedades da partição | Valor da partição |
---|---|---|---|
Hash |
string ou guid |
Function , MaxPartitionCount , Seed , PartitionAssignmentMode |
Function (ColumnName , MaxPartitionCount , Seed ) |
Gama uniforme | datetime |
RangeSize , Reference , OverrideCreationTime |
bin_at (ColumnName , RangeSize , Reference ) |
Chave de partição de hash
Se a política incluir uma chave de partição de hash, todas as extensões homogêneas que pertencem à mesma partição serão atribuídas ao mesmo nó de dados.
Observação
A operação de particionamento de dados adiciona uma carga de processamento significativa. Recomendamos aplicar uma chave de partição de hash em uma tabela somente nas seguintes condições:
- Se a maioria das consultas usar filtros de igualdade (
==
,in()
). - A maioria das consultas agrega/une em uma coluna específica do tipo
string
ouguid
que é de grande dimensão (cardinalidade de 10M ou superior), como umdevice_ID
, ouuser_ID
. - O padrão de uso das tabelas particionadas está em alta carga de consulta de simultaneidade, como em aplicativos de monitoramento ou painéis.
- Uma função de módulo de hash é usada para particionar os dados.
- Os dados em extensões homogêneas (particionadas) são ordenados pela chave de partição hash.
- Você não precisa incluir a chave de partição de hash na política de ordem de linha, se uma estiver definida na tabela.
- Espera-se que as consultas que usam a estratégia de embaralhamento e nas quais o
shuffle key
usado emjoin
,summarize
oumake-series
é a chave de partição de hash da tabela, tenham um desempenho melhor porque a quantidade de dados necessária para se mover entre nós é reduzida.
Propriedades da partição
Propriedade | Descrição | Valor(es) suportado(s) | Valor recomendado |
---|---|---|---|
Function |
O nome de uma função de módulo de hash a ser usada. | XxHash64 |
|
MaxPartitionCount |
O número máximo de partições a serem criadas (o argumento modulo para a função hash-modulo) por período de tempo. | Na gama (1,2048] . |
Valores mais altos levam a uma maior sobrecarga do processo de particionamento de dados e a um número maior de extensões para cada período de tempo. O valor recomendado é 128 . Valores mais altos aumentarão significativamente a sobrecarga de particionamento dos dados após a ingestão e o tamanho dos metadados e, portanto, não são recomendados. |
Seed |
Use para randomizar o valor de hash. | Um número inteiro positivo. |
1 , que também é o valor padrão. |
PartitionAssignmentMode |
O modo usado para atribuir partições a nós. |
ByPartition : Todas as extensões homogêneas (particionadas) que pertencem à mesma partição são atribuídas ao mesmo nó. Uniform : Os valores de partição de uma extensão são desconsiderados. As extensões são atribuídas uniformemente aos nós. |
Se as consultas não se unirem ou agregarem na chave de partição de hash, use Uniform . Caso contrário, use ByPartition . |
Exemplo de chave de partição de hash
Uma chave de partição de hash sobre uma string
coluna tenant_id
de tipo .
Ele usa a XxHash64
função hash, com MaxPartitionCount
definido como o valor 128
recomendado e o padrão Seed
de 1
.
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
}
Chave de partição de data e hora de intervalo uniforme
Observação
Aplique apenas uma chave de partição datetime de intervalo uniforme em uma datetime
coluna do tipo em uma tabela quando for improvável que os dados ingeridos na tabela sejam ordenados de acordo com essa coluna.
Nesses casos, você pode reorganizar os dados entre as extensões para que cada extensão inclua registros de um intervalo de tempo limitado. Esse processo faz com que os filtros na coluna sejam mais eficazes no momento da datetime
consulta.
A função de partição usada é bin_at() e não é personalizável.
Propriedades da partição
Propriedade | Descrição | Valor recomendado |
---|---|---|
RangeSize |
Uma timespan constante escalar que indica o tamanho de cada partição datetime. |
Comece com o valor 1.00:00:00 (um dia). Não defina um valor mais curto, pois isso pode resultar na tabela com um grande número de pequenas extensões que não podem ser mescladas. |
Reference |
Uma datetime constante escalar que indica um ponto fixo no tempo, de acordo com o qual as partições de data e hora estão alinhadas. |
Inicie com 1970-01-01 00:00:00 . Se houver registros nos quais a chave de partição datetime tenha null valores, o valor da partição será definido como o valor de Reference . |
OverrideCreationTime |
A bool indicando se os tempos de criação mínimo e máximo da extensão de resultado devem ou não ser substituídos pelo intervalo dos valores na chave de partição. |
Assume o padrão de false . Defina como true se os dados não forem ingeridos na ordem de hora de chegada. Por exemplo, um único arquivo de origem pode incluir valores de data e hora distantes e/ou você pode querer impor a retenção ou o armazenamento em cache com base nos valores de data e hora em vez da hora da ingestão.Quando OverrideCreationTime é definido como true , as extensões podem ser perdidas no processo de mesclagem. As extensões serão perdidas se o tempo de criação for mais antigo que o Lookback período da política de mesclagem de extensões da tabela. Para garantir que as extensões sejam detectáveis, defina a Lookback propriedade como HotCache . |
Exemplo de partição de data e hora de intervalo uniforme
O snippet mostra uma chave de partição de intervalo de data e hora uniforme em uma datetime
coluna digitada chamada timestamp
.
Ele usa datetime(2021-01-01)
como ponto de referência, com um tamanho de para cada partição, e não substitui os tempos de criação das 7d
extensões.
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
O objeto de política
Por padrão, a política de particionamento de dados de uma tabela é null
, caso em que os dados na tabela não serão reparticionados após serem ingeridos.
A política de particionamento de dados tem as seguintes propriedades principais:
PartitionKeys:
- Uma coleção de chaves de partição que definem como particionar os dados na tabela.
- Uma tabela pode ter até
2
chaves de partição, com uma das seguintes opções: - Cada chave de partição tem as seguintes propriedades:
-
ColumnName
:string
- O nome da coluna de acordo com a qual os dados serão particionados. -
Kind
:string
- O tipo de particionamento de dados a ser aplicado (Hash
ouUniformRange
). -
Properties
:property bag
- Define os parâmetros de acordo com os quais o particionamento é feito.
-
EffectiveDateTime:
- A data e hora UTC a partir da qual a política é efetiva.
- Essa propriedade é opcional. Se não for especificado, a política entrará em vigor para os dados ingeridos depois que a política for aplicada.
Cuidado
- Você pode definir um valor de data e hora no passado e particionar dados já ingeridos. No entanto, essa prática pode aumentar significativamente os recursos usados no processo de particionamento.
- Na maioria dos casos, é recomendável ter apenas dados recém-assimilados particionados e evitar o particionamento de grandes quantidades de dados históricos.
- Se você optar por particionar dados históricos, considere fazer isso gradualmente, definindo o EffectiveDateTime como um anterior
datetime
em etapas de até alguns dias cada vez que você alterar a política.
Exemplo de particionamento de dados
Objeto de política de particionamento de dados com duas chaves de partição.
- Uma chave de partição de hash sobre uma
string
colunatenant_id
de tipo .- Ele usa a
XxHash64
função hash, comMaxPartitionCount
definido como o valor128
recomendado e o padrãoSeed
de1
.
- Ele usa a
- Uma chave de partição de intervalo de data e hora uniforme sobre uma
datetime
coluna de tipo chamadatimestamp
.- Ele usa
datetime(2021-01-01)
como ponto de referência, com um tamanho de7d
para cada partição.
- Ele usa
{
"PartitionKeys": [
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
},
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
]
}
Propriedades adicionais
As propriedades a seguir podem ser definidas como parte da política. Essas propriedades são opcionais e recomendamos não alterá-las.
Propriedade | Descrição | Valor recomendado | Valor padrão |
---|---|---|---|
MinRowCountPerOperation | Destino mínimo para a soma da contagem de linhas das extensões de origem de uma única operação de particionamento de dados. | 0 |
|
MaxRowCountPerOperation | Destino máximo para a soma da contagem de linhas das extensões de origem de uma única operação de particionamento de dados. | Defina um valor inferior a 5M se você perceber que as operações de particionamento consomem uma grande quantidade de memória ou CPU por operação. |
0 , com uma meta padrão de 5.000.000 de registros. |
MaxOriginalSizePerOperation | Destino máximo para a soma do tamanho original (em bytes) das extensões de origem de uma única operação de particionamento de dados. | Se as operações de particionamento consumirem uma grande quantidade de memória ou CPU por operação, defina um valor inferior a 5 GB. |
0 , com um destino padrão de 5.368.709.120 bytes (5 GB). |
O processo de particionamento de dados
- O particionamento de dados é executado como um processo em segundo plano pós-ingestão.
- Espera-se que uma tabela ingerida continuamente sempre tenha uma "cauda" de dados que ainda não foi particionada (extensões não homogêneas).
- O particionamento de dados é executado somente em extensões frequentes, independentemente do valor da
EffectiveDateTime
propriedade na política.- Se o particionamento de extensões frias for necessário, você precisará ajustar temporariamente a política de cache.
Você pode monitorar o status de particionamento de tabelas com políticas definidas em um banco de dados usando o comando .show database extents partitioning statistics e as métricas de particionamento.
Capacidade de particionamento
O processo de particionamento de dados resulta na criação de mais extensões. A capacidade de mesclagem de extensões pode aumentar gradualmente, para que o processo de mesclagem de extensões possa acompanhar.
Se houver uma taxa de transferência de ingestão alta ou um número grande o suficiente de tabelas que tenham uma política de particionamento definida, a capacidade de partição de Extensões poderá aumentar gradualmente, para que o processo de particionamento de extensões possa acompanhar.
- Para evitar o consumo de muitos recursos, esses aumentos dinâmicos são limitados. Pode ser necessário aumentá-los gradual e linearmente além do limite, se eles forem totalmente usados.
- Se o aumento das capacidades causar um aumento significativo no uso dos recursos do cluster, você poderá escalar/ verticalmente o cluster, manualmente ou habilitando o dimensionamento automático.
Limitações
- As tentativas de particionar dados em um banco de dados que já tem mais de 5.000.000 de extensões serão limitadas.
- Nesses casos, a
EffectiveDateTime
propriedade de particionamento de políticas de tabelas no banco de dados será automaticamente atrasada por várias horas, para que você possa reavaliar sua configuração e políticas.
- Nesses casos, a
Valores discrepantes em colunas particionadas
- As seguintes situações podem contribuir para a distribuição desequilibrada de dados entre nós e degradar o desempenho da consulta:
- Se uma chave de partição de hash incluir valores muito mais prevalentes do que outros, por exemplo, uma cadeia de caracteres vazia ou um valor genérico (como
null
ouN/A
). - Os valores representam uma entidade (como
tenant_id
) que é mais prevalente no conjunto de dados.
- Se uma chave de partição de hash incluir valores muito mais prevalentes do que outros, por exemplo, uma cadeia de caracteres vazia ou um valor genérico (como
- Se uma chave de partição datetime de intervalo uniforme tiver uma porcentagem grande o suficiente de valores que estão "longe" da maioria dos valores na coluna, a sobrecarga do processo de particionamento de dados será aumentada e poderá levar a muitas pequenas extensões a serem controladas. Um exemplo dessa situação são os valores de data e hora do passado ou futuro distante.
Em ambos os casos, "corrija" os dados ou filtre todos os registros irrelevantes nos dados antes ou no momento da ingestão, para reduzir a sobrecarga do particionamento de dados. Por exemplo, use uma política de atualização.