O SCAN HINT direciona instruções SQL para todos os shards de tabela física ou para um subconjunto deles, em todos os shards de banco de dados ou apenas nos selecionados, e depois mescla os resultados. Utilize esse recurso quando precisar ignorar o roteamento padrão do PolarDB-X 1.0 e acessar tabelas físicas específicas diretamente.
Casos de uso típicos:
Contagem de linhas em cada tabela física associada a uma determinada tabela lógica
Consulta de todos os shards de tabela em um shard de banco de dados específico
O SCAN HINT está disponível no PolarDB-X 1.0 V5.3 e versões posteriores. Ele é compatível com instruções DML, DDL e algumas instruções da Linguagem de Acesso a Dados (DAL).
Este tópico se aplica ao PolarDB-X 1.0 5.3 e versões posteriores.
Sintaxe
-- Scan all table shards in all database shards
SCAN()
-- Scan all table shards in specified database shards
SCAN(NODE="node_list")
-- Scan table shards calculated from conditions
SCAN(
[TABLE=]"table_name_list" -- Logical table names
, CONDITION="condition_string" -- Calculates physical table names from TABLE and CONDITION values
[, NODE="node_list"] ) -- Filters results to only the specified physical databases
-- Scan explicitly specified physical table shards
SCAN(
[TABLE=]"table_name_list" -- Logical table names
, REAL_TABLE=("table_name_list") -- Physical table names, applied across all physical databases
[, NODE="node_list"] ) -- Filters results to only the specified physical databases
Parâmetros
|
Parâmetro |
Descrição |
||
|
|
Define os shards de banco de dados de destino. Use valores de |
group_index} [, {group_key |
group_index}]...` |
|
|
Especifique os nomes das tabelas lógicas. Formato: |
||
|
|
Cláusula WHERE do SQL que filtra as tabelas físicas de destino. Defina condições para cada tabela, por exemplo: |
||
|
|
Especifique explicitamente os nomes das tabelas físicas. Essas tabelas são consultadas em todos os bancos de dados físicos. |
Escolha do modo de varredura
|
Modo |
Quando usar |
|
|
Ideal para varrer todos os shards físicos, oferecendo o escopo mais amplo |
|
|
Recomendado quando você já conhece os nós de destino e precisa limitar a busca a shards de banco de dados específicos |
|
|
Permite que o PolarDB-X 1.0 calcule automaticamente quais tabelas físicas correspondem às suas condições |
|
|
Indicado para nomear explicitamente as tabelas físicas, exigindo conhecimento prévio dos nomes exatos das tabelas |
Observações de uso
Os hints do PolarDB-X 1.0 suportam dois formatos:
/*+TDDL:hint_command*//!+TDDL:hint_command*/
Ao utilizar o formato /*+TDDL:hint_command*/ com o cliente de linha de comando do MySQL, adicione a flag -c durante a conexão:
mysql -c -h <host> -P <port> -u <username> -p
Sem a flag -c, o cliente MySQL remove os comentários das instruções SQL antes de enviá-las ao servidor. Como os hints do PolarDB-X 1.0 no formato /*+TDDL:...*/ são definidos como comentários do MySQL, eles seriam excluídos e não teriam efeito.
Os hints do PolarDB-X 1.0 no formato /*+TDDL:...*/ são tratados como comentários do MySQL. Para mais informações, consulte opções do cliente mysql.
Exemplos
Varredura de todos os shards de tabela em todos os shards de banco de dados
SELECT /*+TDDL:scan()*/ COUNT(1) FROM t1
O DRDS roteia a instrução para todas as tabelas físicas da tabela lógica t1, mescla os conjuntos de resultados e retorna a contagem final.
Varredura de todos os shards de tabela em shards de banco de dados especificados
SELECT /*+TDDL:scan(node='0.1.2')*/ COUNT(1) FROM t1
O DRDS calcula os nomes das tabelas físicas para a tabela lógica t1 nos shards de banco de dados 0000, 0001 e 0002, roteia a instrução para esses shards, mescla os conjuntos de resultados e retorna a contagem final.
Varredura de shards de tabela calculados a partir de condições
SELECT /*+TDDL:scan('t1', condition='t1.id = 2')*/ COUNT(1) FROM t1
O DRDS calcula quais tabelas físicas da tabela lógica t1 correspondem à condição, roteia a instrução para esses shards, mescla os conjuntos de resultados e retorna a contagem final.
Para consultas JOIN envolvendo múltiplas tabelas:
SELECT /*+TDDL:scan('t1, t2', condition='t1.id = 2 and t2.id = 2')*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHERE b.name = "test"
O DRDS calcula as tabelas físicas para t1 e t2 que atendem às respectivas condições, roteia a instrução e mescla os resultados.
Ao usar CONDITION com um JOIN, ambas as tabelas devem pertencer ao mesmo shard de banco de dados e possuir a mesma quantidade de shards. Caso esses requisitos não sejam atendidos, o PolarDB-X 1.0 tentará resolver shards de tabela provenientes de shards de banco de dados diferentes, e o DRDS reportará um erro.
Varredura de shards de tabela física especificados explicitamente
SELECT /*+TDDL:scan('t1', real_table=("t1_00", "t1_01"))*/ COUNT(1) FROM t1
O DRDS roteia a instrução para os shards de tabela física t1_00 e t1_01 em todos os shards de banco de dados, mescla os conjuntos de resultados e retorna a contagem final.
Para consultas JOIN com tabelas físicas especificadas explicitamente:
SELECT /*+TDDL:scan('t1, t2', real_table=("t1_00,t2_00", "t1_01,t2_01"))*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHERE b.name = "test";
O DRDS roteia a instrução para t1_00, t2_00, t1_01 e t2_01 em todos os shards de banco de dados, mescla os conjuntos de resultados e retorna o resultado final.