Consulta aleatória
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
A consulta shuffle
é uma transformação de preservação semântica usada com um conjunto de operadores que suportam a estratégia de shuffle
. Dependendo dos dados envolvidos, consultar a estratégia shuffle
pode gerar um melhor desempenho. É melhor usar a estratégia de consulta aleatória quando a chave shuffle
(uma chave join
, chave summarize
, chave make-series
ou chave partition
) tem uma cardinalidade alta e a consulta do operador regular atinge os limites de consulta.
Você pode usar os seguintes operadores com o comando shuffle:
Para usar a estratégia de consulta shuffle
, adicione a expressão hint.strategy = shuffle
ou hint.shufflekey = <key>
. Quando você usa hint.strategy=shuffle
, os dados do operador serão embaralhados por todas as chaves. Use esta expressão quando a chave composta for exclusiva, mas cada chave não for única o suficiente, então você embaralhará os dados usando todas as chaves do operador embaralhado.
Ao particionar dados com a estratégia shuffle, a carga de dados é compartilhada em todos os nós do cluster. Cada nó processa uma partição dos dados. O número padrão de partições é igual ao número de nós de cluster.
O número da partição pode ser substituído usando a sintaxe hint.num_partitions = total_partitions
, que controlará o número de partições. Isso é útil quando o cluster tem um pequeno número de nós de cluster e o número de partições padrão será pequeno e a consulta falhar ou levar um longo tempo de execução.
Observação
O uso de muitas partições pode consumir mais recursos de cluster e degradar o desempenho. Escolha o número da partição com cuidado, começando com o hint.strategy = shuffle
e comece a aumentar as partições gradualmente.
Em alguns casos, o hint.strategy = shuffle
é ignorado e a consulta não será executada em shuffle
estratégia. Isto pode acontecer quando:
- O operador
join
tem outro operador compatível comshuffle
(join
,summarize
,make-series
oupartition
) no lado esquerdo ou direito. - O operador
summarize
aparece depois de outro operador compatível comshuffle
(join
,summarize
,make-series
oupartition
) na consulta.
Sintaxe
Com hint.strategy
= shuffle
T|
DataExpression|
join
hint.strategy
= shuffle
(
DataExpression)
T|
summarize
hint.strategy
= shuffle
DataExpression
T|
Consulta|
partição hint.strategy
= shuffle
(
SubQuery)
Com hint.shufflekey
= chave
T|
DataExpression|
join
hint.shufflekey
= chave(
DataExpression)
T|
summarize
hint.shufflekey
= chaveDataExpression
T|
make-series
hint.shufflekey
= chaveDataExpression
T|
Query|
partition hint.shufflekey
= key(
SubQuery)
Saiba mais sobre convenções de sintaxe.
Parâmetros
Designação | Tipo | Necessário | Descrição |
---|---|---|---|
T | string |
✔️ | A fonte tabular cujos dados devem ser processados pelo operador. |
DataExpression | string |
Uma expressão de transformação tabular implícita ou explícita. | |
de consulta | string |
Uma expressão de transformação executada nos registros de T. | |
chave | string |
Use uma chave join , summarize chave, make-series chave ou partition chave. |
|
SubQuery | string |
Uma expressão de transformação. |
Observação
DataExpression ou Query devem ser especificados dependendo da sintaxe escolhida.
Exemplos
O exemplo nesta seção mostra como usar a sintaxe para ajudá-lo a começar.
Os exemplos neste artigo usam tabelas disponíveis publicamente no de cluster de ajuda, como a tabela
StormEvents
no banco de dados Samples.
Os exemplos neste artigo usam tabelas disponíveis publicamente, como a tabela
StormEvents
na análise do tempo dados de exemplo.
Use resumir com embaralhar
A consulta de estratégia shuffle
com summarize
operador compartilha a carga em todos os nós do cluster, onde cada nó processa uma partição dos dados.
StormEvents
| summarize hint.strategy = shuffle count(), avg(InjuriesIndirect) by State
| count
Output
Contagem |
---|
67 |
Use a junção com shuffle
StormEvents
| where State has "West"
| where EventType has "Flood"
| join hint.strategy=shuffle
(
StormEvents
| where EventType has "Hail"
| project EpisodeId, State, DamageProperty
)
on State
| count
Output
Contagem |
---|
103 |
Use make-series com shuffle
StormEvents
| where State has "North"
| make-series hint.shufflekey = State sum(DamageProperty) default = 0 on StartTime in range(datetime(2007-01-01 00:00:00.0000000), datetime(2007-01-31 23:59:00.0000000), 15d) by State
Output
Estado | sum_DamageProperty | Horário de Início |
---|---|---|
DAKOTA DO NORTE | [60000,0,0] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:00:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
CAROLINA DO NORTE | [20000,0,1000] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:00:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
ATLÂNTICO NORTE | [0,0,0] | ["2006-12-31T00:00:00.0000000Z","2007-01-15T00:00:00.0000000Z","2007-01-30T00:00:00.0000000Z"] |
Usar partição com shuffle
StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
top 3 by DamageProperty
| project EpisodeId, State, DamageProperty
)
| count
Output
Contagem |
---|
22345 |
Compare hint.strategy=shuffle e hint.shufflekey=key
Quando você usa hint.strategy=shuffle
, o operador embaralhado será embaralhado por todas as chaves. No exemplo a seguir, a consulta embaralha os dados usando EpisodeId
e EventId
como chaves:
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| join kind = inner hint.strategy=shuffle (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
| count
Output
Contagem |
---|
14 |
A consulta a seguir usa hint.shufflekey = key
. A consulta acima é equivalente a esta consulta.
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| join kind = inner hint.shufflekey = EpisodeId hint.shufflekey = EventId (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
Output
Contagem |
---|
14 |
Embaralhe os dados com várias teclas
Em alguns casos, o hint.strategy=shuffle
será ignorado e a consulta não será executada na estratégia de embaralhamento. Por exemplo, no exemplo a seguir, a junção tem um resumo no lado esquerdo, portanto, usar hint.strategy=shuffle
não aplicará a estratégia de embaralhar à consulta:
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| summarize count() by EpisodeId, EventId
| join kind = inner hint.strategy=shuffle (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
Output
EpisodeId | ID do Evento | ... | EpisodeId1 | EventId1 | ... |
---|---|---|---|---|---|
1030 | 4407 | ... | 1030 | 4407 | ... |
1030 | 13721 | ... | 1030 | 13721 | ... |
2477 | 12530 | ... | 2477 | 12530 | ... |
2103 | 10237 | ... | 2103 | 10237 | ... |
2103 | 10239 | ... | 2103 | 10239 | ... |
... | ... | ... | ... | ... | ... |
Para superar esse problema e executar a estratégia de shuffle, escolha a chave que é comum para as operações summarize
e join
. Neste caso, esta chave é EpisodeId
. Use o hint.shufflekey
de dicas para especificar a tecla shuffle no join
para hint.shufflekey = EpisodeId
:
StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| summarize count() by EpisodeId, EventId
| join kind = inner hint.shufflekey=EpisodeId (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
Output
EpisodeId | ID do Evento | ... | EpisodeId1 | EventId1 | ... |
---|---|---|---|---|---|
1030 | 4407 | ... | 1030 | 4407 | ... |
1030 | 13721 | ... | 1030 | 13721 | ... |
2477 | 12530 | ... | 2477 | 12530 | ... |
2103 | 10237 | ... | 2103 | 10237 | ... |
2103 | 10239 | ... | 2103 | 10239 | ... |
... | ... | ... | ... | ... | ... |
Use resumir com embaralhar para melhorar o desempenho
Neste exemplo, usar o operador summarize
com shuffle
estratégia melhora o desempenho. A tabela de origem tem 150M registros e a cardinalidade do grupo por chave é 10M, que está espalhada por 10 nós de cluster.
Usando summarize
operador sem estratégia shuffle
, a consulta termina após 1:08 e o pico de uso de memória é de ~3 GB:
orders
| summarize arg_max(o_orderdate, o_totalprice) by o_custkey
| where o_totalprice < 1000
| count
Output
Contagem |
---|
1086 |
Ao usar shuffle
estratégia com summarize
, a consulta termina após ~7 segundos e o pico de uso de memória é de 0,43 GB:
orders
| summarize hint.strategy = shuffle arg_max(o_orderdate, o_totalprice) by o_custkey
| where o_totalprice < 1000
| count
Output
Contagem |
---|
1086 |
O exemplo a seguir demonstra o desempenho em um cluster que tem dois nós de cluster, com uma tabela que tem registros de 60M, onde a cardinalidade do grupo por chave é 2M.
Executar a consulta sem hint.num_partitions
usará apenas duas partições (como número de nós de cluster) e a seguinte consulta levará ~1:10 minutos:
lineitem
| summarize hint.strategy = shuffle dcount(l_comment), dcount(l_shipdate) by l_partkey
| consume
Se definir o número das partições como 10, a consulta terminará após 23 segundos:
lineitem
| summarize hint.strategy = shuffle hint.num_partitions = 10 dcount(l_comment), dcount(l_shipdate) by l_partkey
| consume
Use a junção com shuffle para melhorar o desempenho
O exemplo a seguir mostra como o uso de shuffle
estratégia com o operador join
melhora o desempenho.
Os exemplos foram amostrados em um cluster com 10 nós onde os dados estão espalhados por todos esses nós.
A tabela de origem do lado esquerdo da consulta tem 15 milhões de registros onde a cardinalidade da chave join
é ~14 milhões. A fonte do lado direito da consulta tem 150 milhões de registros e a cardinalidade da chave join
é 10 milhões. A consulta termina após ~28 segundos e o pico de utilização de memória é de 1,43 GB:
customer
| join
orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey
Ao usar shuffle
estratégia com um operador join
, a consulta termina após ~4 segundos e o pico de uso de memória é de 0,3 GB:
customer
| join
hint.strategy = shuffle orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey
Em outro exemplo, tentamos as mesmas consultas em um conjunto de dados maior com as seguintes condições:
- A fonte do lado esquerdo do
join
é 150M e a cardinalidade da chave é 148M. - A fonte do lado direito do
join
é 1.5B, e a cardinalidade da chave é ~100M.
A consulta com apenas o operador join
atinge limites e tempos limite após 4 minutos. No entanto, ao usar shuffle
estratégia com o operador join
, a consulta termina após ~34 segundos e o pico de uso de memória é de 1,23 GB.
O exemplo a seguir mostra a melhoria em um cluster que tem dois nós de cluster, com uma tabela de registros de 60M, onde a cardinalidade da chave join
é 2M.
Executar a consulta sem hint.num_partitions
usará apenas duas partições (como número de nós de cluster) e a seguinte consulta levará ~1:10 minutos:
lineitem
| summarize dcount(l_comment), dcount(l_shipdate) by l_partkey
| join
hint.shufflekey = l_partkey part
on $left.l_partkey == $right.p_partkey
| consume
Ao definir o número das partições como 10, a consulta terminará após 23 segundos:
lineitem
| summarize dcount(l_comment), dcount(l_shipdate) by l_partkey
| join
hint.shufflekey = l_partkey hint.num_partitions = 10 part
on $left.l_partkey == $right.p_partkey
| consume