- Categorias:
Funções do sistema (Informações de consulta) , Funções de tabela
GET_QUERY_OPERATOR_STATS¶
Retorna estatísticas sobre os operadores de consulta individual dentro de uma consulta que tenha sido concluída. Você pode executar esta função para qualquer consulta concluída que tenha sido executada nos últimos 14 dias.
You can use this information to understand the structure of a query and identify query operators — for example, the join operator — that cause performance problems.
For example, you can use this information to determine which operators are consuming the most resources. As another example, you can use this function to identify joins that have more output rows than input rows, which can be a sign of an «exploding» join; for example, an unintended Cartesian product.
Estas estatísticas também estão disponíveis na guia perfil da consulta em Snowsight. A função GET_QUERY_OPERATOR_STATS() torna as mesmas informações disponíveis através de uma interface programática.
Para obter mais informações sobre como encontrar operadores de consulta problemáticos, consulte Problemas comuns de consulta identificados pelo perfil de consulta.
Sintaxe¶
GET_QUERY_OPERATOR_STATS( <query_id> )
Argumentos¶
query_idA ID de uma consulta. Você pode usar:
Uma cadeia de caracteres literal (uma cadeia de caracteres entre aspas simples).
Uma variável de sessão contendo um ID de consulta.
O valor de retorno de uma chamada para a função LAST_QUERY_ID.
Retornos¶
Se a função GET_QUERY_OPERATOR_STATS for uma função de tabela. Ela retorna linhas com estatísticas sobre cada operador de consulta na consulta. Para obter mais informações, consulte as seções Notas de uso e Saída abaixo.
Notas de uso¶
This function returns statistics only for queries that have completed.
Você deve ter privilégios OPERATE ou MONITOR no warehouse onde executou a consulta.
This function provides detailed statistics about each query operator used in the specified query. The following list shows the possible query operators:
Aggregate: agrupa entradas e computa funções agregadas.
CartesianJoin: um tipo especializado de junção.
Delete: remove um registro de uma tabela.
ExternalFunction: representa o processamento por uma função externa.
ExternalScan: representa o acesso a dados armazenados em objetos de preparação.
Filter: representa uma operação que filtra as linhas.
Flatten: processa registros VARIANT, possivelmente nivelando-os em um caminho especificado.
Generator: Generates records by using the TABLE(GENERATOR(…)) construct.
GroupingSets: Represents constructs, such as GROUPING SETS, ROLLUP, and CUBE.
Insert: adiciona registros a uma tabela através de uma operação INSERT ou COPY.
InternalObject: Represents access to an internal data object; for example, in an Information Schema or the result of a previous query.
Join: combina duas entradas em uma determinada condição.
JoinFilter: operação de filtragem especial que remove tuplas que podem ser identificadas como possivelmente não correspondendo à condição de uma junção mais além no plano da consulta.
Merge: realiza uma operação MERGE em uma tabela.
Pivot: transforma valores únicos de uma coluna em várias colunas e faz qualquer agregação necessária.
Result: retorna o resultado da consulta.
Sort: ordena a entrada em uma determinada expressão.
SortWithLimit: produz uma parte da sequência de entrada após a classificação, normalmente um resultado de um constructo
ORDER BY ... LIMIT ... OFFSET ....TableScan: representa o acesso a uma única tabela.
UnionAll: concatena duas entradas.
Unload: representa uma operação COPY que exporta dados de uma tabela para um arquivo em um estágio.
Unpivot: gira uma tabela transformando colunas em linhas.
Update: atualiza um registro em uma tabela.
ValuesClause: lista de valores fornecidos com a cláusula VALUES.
WindowFunction: computa funções de janela.
WithClause: precede o corpo da instrução SELECT e define um ou mais CTEs.
WithReference: instância de uma cláusula WITH.
A informação é devolvida como uma tabela. Cada linha na tabela corresponde a um operador. A linha contém a divisão da execução e as estatísticas de consulta para esse operador.
A linha também pode listar atributos do operador (estes dependem do tipo de operador).
Statistics that break down query execution time are expressed as a percentage of the total query execution time.
Para obter mais informações sobre estatísticas específicas, consulte Saída (neste tópico).
Como esta função é uma função de tabela, você deve usá-la em uma cláusula FROM e deve encapsulá-la em
TABLE(). Por exemplo:SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS(last_query_id()));
Para cada execução individual de uma consulta específica (ou seja, um UUID específico), esta função é determinista; ela retorna os mesmos valores a cada vez.
Entretanto, para diferentes execuções de um mesmo texto de consulta, esta função pode retornar estatísticas de tempo de execução diferentes. As estatísticas dependem de muitos fatores. Os seguintes fatores podem ter um grande impacto na execução e, portanto, nas estatísticas retornadas por esta função:
O volume de dados.
A disponibilidade de exibições materializadas e as mudanças (se houver) nos dados desde que essas exibições materializadas foram atualizadas pela última vez.
A presença ou ausência de clustering.
A presença ou ausência de dados previamente armazenados em cache.
O tamanho do warehouse virtual.
Os valores também podem ser afetados por fatores fora da consulta e dos dados do usuário. Estes fatores são geralmente pequenos. Os fatores incluem:
Tempo de inicialização do warehouse virtual.
Latência com funções externas.
Saída¶
A função retorna as seguintes colunas:
Column name |
Data type |
Descrição |
|---|---|---|
QUERY_ID |
VARCHAR |
Um ID de consulta, que é um identificador interno gerado pelo sistema para a instrução SQL. |
STEP_ID |
NUMBER(38, 0) |
Identificador da etapa no plano de consulta. |
OPERATOR_ID |
NUMBER(38, 0) |
O identificador do operador. Isto é único dentro da consulta. Os valores começam em 0. |
PARENT_OPERATORS |
ARRAY contendo um ou mais NUMBER(38, 0) |
Identificadores dos operadores pai para este operador ou NULL se este for o operador final no plano de consulta (que normalmente é o operador Resultado). |
OPERATOR_TYPE |
VARCHAR |
The type of query operator; for example, |
VARIANT contendo um OBJECT |
Statistics about the operator (for example, the number of output rows from the operator). |
|
VARIANT contendo um OBJECT |
Informações sobre o tempo de execução do operador. |
|
VARIANT contendo um OBJECT |
Information about the operator. This information depends on the operator type. |
Se não houver informações para a coluna específica do operador, o valor será NULL.
Three of these columns contain OBJECTs. Each object contains key/value pairs. The tables below describe the keys in these objects.
OPERATOR_STATISTICS¶
Os campos em OBJECTs da coluna OPERATOR_STATISTICS fornecem informações adicionais sobre o operador. As informações podem incluir:
Chave |
Nested key (if applicable) |
Data type |
Descrição |
|---|---|---|---|
|
Statistics for Data Manipulation Language (DML) queries. |
||
|
DOUBLE |
Number of rows inserted into a table or tables. |
|
|
DOUBLE |
Number of rows updated in a table. |
|
|
DOUBLE |
Number of rows deleted from a table. |
|
|
DOUBLE |
Number of rows unloaded during data export. |
|
|
Information about calls to extension functions. If the value of a field is zero, then the field is not displayed. |
||
|
DOUBLE |
Amount of time for the Java UDF handler to load. |
|
|
DOUBLE |
Number of times the Java UDF handler is invoked. |
|
|
DOUBLE |
Maximum amount of time for the Java UDF handler to execute. |
|
|
DOUBLE |
Average amount of time to execute the Java UDF handler. |
|
|
DOUBLE |
Number of times the Java UDTF process method was invoked. |
|
|
DOUBLE |
Amount of time to execute the Java UDTF process. |
|
|
DOUBLE |
Average amount of time to execute the Java UDTF process. |
|
|
DOUBLE |
Number of times the Java UDTF constructor was invoked. |
|
|
DOUBLE |
Amount of time to execute the Java UDTF constructor. |
|
|
DOUBLE |
Average amount of time to execute the Java UDTF constructor. |
|
|
DOUBLE |
Number of times the Java UDTF endPartition method was invoked. |
|
|
DOUBLE |
Amount of time to execute the Java UDTF endPartition method. |
|
|
DOUBLE |
Average amount of time to execute the Java UDTF |
|
|
DOUBLE |
Maximum amount of time to download the Java UDF dependencies. |
|
|
DOUBLE |
Peak memory usage as reported by the JVM. |
|
|
DOUBLE |
Compile time for the Java UDF inline code. |
|
|
DOUBLE |
Number of times the Python UDF handler was invoked. |
|
|
DOUBLE |
Total execution time for the Python UDF handler. |
|
|
DOUBLE |
Average amount of time to execute the Python UDF handler. |
|
|
DOUBLE |
Peak memory usage by the Python sandbox environment. |
|
|
DOUBLE |
Average amount of time to create the Python environment, including downloading and installing packages. |
|
|
DOUBLE |
Amount of time to run the Conda solver to solve Python packages. |
|
|
DOUBLE |
Amount of time to create the Python environment. |
|
|
DOUBLE |
Amount of time to initialize the Python UDF. |
|
|
DOUBLE |
Number of external file bytes read for UDFs. |
|
|
DOUBLE |
Number of external files accessed for UDFs. |
|
|
Information about calls to external functions. If the value of a field — for example
|
||
|
DOUBLE |
Number of times that an external function was called. This number can be different from the number of external function calls in the text of the SQL statement because of the number of batches that rows are divided into, the number of retries if there are transient network problems, and so on. |
|
|
DOUBLE |
Number of rows sent to external functions. |
|
|
DOUBLE |
Number of rows received back from external functions. |
|
|
DOUBLE |
Number of bytes sent to external functions. If the key includes |
|
|
DOUBLE |
Number of bytes received from external functions. If the key includes |
|
|
DOUBLE |
Number of retries because of transient errors. |
|
|
DOUBLE |
Average amount of time per invocation (call) in milliseconds between the time Snowflake sent the data and received the returned data. |
|
|
INTEGER |
Número total de solicitações de HTTP que retornaram um código de status 4xx. |
|
|
INTEGER |
Número total de solicitações de HTTP que retornaram um código de status 5xx. |
|
|
DOUBLE |
Latência média para solicitações de HTTP bem-sucedidas. |
|
|
DOUBLE |
Average overhead per successful request because of a slowdown caused by throttling (HTTP 429). |
|
|
DOUBLE |
Number of batches that were retried because of HTTP 429 errors. |
|
|
DOUBLE |
Latência de percentil 50 para solicitações de HTTP bem-sucedidas. 50 por cento de todas as solicitações bem-sucedidas levaram menos do que esse tempo para serem concluídas. |
|
|
DOUBLE |
Latência de percentil 90 para solicitações de HTTP bem-sucedidas. 90 por cento de todas as solicitações bem-sucedidas levaram menos do que esse tempo para serem concluídas. |
|
|
DOUBLE |
Latência de percentil 95 para solicitações de HTTP bem-sucedidas. 95 por cento de todas as solicitações bem-sucedidas levaram menos do que esse tempo para serem concluídas. |
|
|
DOUBLE |
Latência de percentil 99 para solicitações de HTTP bem-sucedidas. 99 por cento de todas as solicitações bem-sucedidas levaram menos do que esse tempo para serem concluídas. |
|
|
INTEGER |
Number of input rows. This can be missing for an operator with no input edges from other operators. |
|
|
Informações sobre as operações de I/O (entrada/saída) realizadas durante a consulta. |
||
|
DOUBLE |
Percentage of data scanned for a given table so far. |
|
|
DOUBLE |
Number of bytes scanned so far. |
|
|
DOUBLE |
Percentage of data scanned from the local disk cache. |
|
|
DOUBLE |
Bytes written; for example, when loading into a table. |
|
|
DOUBLE |
Bytes gravados em um objeto de resultado. For example, Em geral, o objeto de resultado representa tudo o que é produzido como resultado da consulta, e |
|
|
DOUBLE |
Bytes lidos de um objeto resultado. |
|
|
DOUBLE |
Bytes read from an external object; for example, a stage. |
|
|
|
DOUBLE |
Amount of data sent over the network. |
|
INTEGER |
Number of output rows. This can be missing for the operator that returns the results to the user; which is usually the RESULT operator. |
|
|
Informações sobre a remoção realizada na tabela. |
||
|
DOUBLE |
Number of partitions pruned by Snowflake Optima. |
|
|
DOUBLE |
Number of partitions scanned so far. |
|
|
DOUBLE |
Total number of partitions in a given table. |
|
|
Informações sobre o uso do disco para operações nas quais os resultados intermediários não cabem na memória. |
||
|
DOUBLE |
Volume of data spilled to remote disk. |
|
|
DOUBLE |
Volume of data spilled to local disk. |
|
|
Informações sobre consultas que usam o serviço de otimização de pesquisa. |
||
|
DOUBLE |
Number of partitions pruned by search optimization. |
|
|
DOUBLE |
Número de partições removidas pela otimização de pesquisa e pelo Snowflake Optima. |
EXECUTION_TIME_BREAKDOWN¶
Os campos em OBJECTs da coluna EXECUTION_TIME_BREAKDOWN são mostrados abaixo.
Chave |
Data type |
Descrição |
|---|---|---|
|
DOUBLE |
Percentage of the total query time spent by this operator. |
|
DOUBLE |
Tempo gasto na preparação do processamento da consulta. |
|
DOUBLE |
Tempo gasto no processamento dos dados pela CPU. |
|
DOUBLE |
Tempo gasto sincronizando as atividades entre os processos participantes. |
|
DOUBLE |
Tempo durante o qual o processamento foi bloqueado enquanto se aguardava o acesso ao disco local. |
|
DOUBLE |
Tempo durante o qual o processamento foi bloqueado enquanto se aguardava o acesso remoto ao disco. |
|
DOUBLE |
Tempo durante o qual o processamento aguardava a transferência dos dados da rede. |
OPERATOR_ATTRIBUTES¶
Each output row describes one operator in the query. The following table shows the possible types of operators; for example, the Filter operator. For each type of operator, the table shows the possible attributes; for example, the expression used to filter the rows.
Os atributos do operador são armazenados na coluna OPERATOR_ATTRIBUTES, que é do tipo VARIANT e contém um OBJECT. O OBJECT contém pares de chave/valor. Cada chave corresponde a um atributo do operador.
Operator name |
Chave |
Data type |
Descrição |
|---|---|---|---|
|
|||
|
ARRAY de VARCHAR |
Lista de funções computadas. |
|
|
ARRAY de VARCHAR |
Group-by expression. |
|
|
|||
|
VARCHAR |
Expressão de junção de não equidade. |
|
|
VARCHAR |
Expressão de junção de equidade. |
|
|
VARCHAR |
Tipo de junção (INNER). |
|
|
|
VARCHAR |
Nome da tabela atualizada. |
|
|||
|
VARCHAR |
O nome do estágio a partir do qual os dados são lidos. |
|
|
VARCHAR |
O tipo do estágio. |
|
|
|
VARCHAR |
A expressão utilizada para filtrar dados. |
|
|
VARCHAR |
Input expression used to flatten data. |
|
|||
|
NUMBER |
Valor do parâmetro de entrada ROWCOUNT. |
|
|
NUMBER |
Valor do parâmetro de entrada TIMELIMIT. |
|
|
|||
|
ARRAY de VARCHAR |
Lista de funções computadas. |
|
|
ARRAY de VARCHAR |
Lista de conjuntos de agrupamento. |
|
|
|||
|
VARCHAR |
Quais expressões são inseridas. |
|
|
ARRAY de VARCHAR |
Lista dos nomes das tabelas às quais são adicionados os registros. |
|
|
|
VARCHAR |
Name of the accessed object. |
|
|||
|
VARCHAR |
Expressão de junção de não equidade. |
|
|
VARCHAR |
Expressão de junção de equidade. |
|
|
VARCHAR |
Tipo de junção (INNER, OUTER, LEFT JOIN etc.). |
|
|
|
NUMBER |
Operator id of the join used to identify tuples that can be filtered out. |
|
|
VARCHAR |
Nome da tabela atualizada. |
|
|||
|
ARRAY de VARCHAR |
Colunas restantes nas quais os resultados são agregados. |
|
|
ARRAY de VARCHAR |
Colunas resultantes de valores articulados. |
|
|
|
ARRAY de VARCHAR |
Lista de expressões produzidas. |
|
|
ARRAY de VARCHAR |
Expressão que define a classificação. |
|
|||
|
NUMBER |
Posição na sequência ordenada a partir da qual as tuplas produzidas são emitidas. |
|
|
NUMBER |
Número de linhas produzidas. |
|
|
ARRAY de VARCHAR |
Expressão que define a classificação. |
|
|
|||
|
ARRAY de VARCHAR |
Lista de colunas verificadas. |
|
|
ARRAY de VARCHAR |
Lista de caminhos extraídos das colunas de variantes. |
|
|
VARCHAR |
Alias da tabela sendo acessada. |
|
|
VARCHAR |
Nome da tabela sendo acessada. |
|
|
|
VARCHAR |
Estágio onde os dados são salvos. |
|
|
ARRAY de VARCHAR |
Colunas de saída da consulta não articulada. |
|
|
VARCHAR |
Nome da tabela atualizada. |
|
|||
|
NUMBER |
Número de valores produzidos. |
|
|
VARCHAR |
Lista de valores. |
|
|
|
ARRAY de VARCHAR |
Lista de funções computadas. |
|
|
VARCHAR |
Alias da cláusula WITH. |
Se um operador não for listado, nenhum atributo será produzido e o valor será informado como {}.
Nota
The following operators do not have any operator attributes and therefore are not included in the table of
OPERATOR_ATTRIBUTES:UnionAllExternalFunction
Exemplos¶
Os exemplos a seguir chamam a função GET_QUERY_OPERATOR_STATS.
Recuperação de dados de uma única consulta¶
Este exemplo mostra as estatísticas para um SELECT que une duas pequenas tabelas.
Execute a instrução SELECT:
SELECT x1.i, x2.i
FROM x1 INNER JOIN x2 ON x2.i = x1.i
ORDER BY x1.i, x2.i;
Obtenha o ID da consulta:
SET lqid = (SELECT LAST_QUERY_ID());
Chame GET_QUERY_OPERATOR_STATS() para obter estatísticas dos operadores da consulta individual na consulta:
SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS($lqid));
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
| QUERY_ID | STEP_ID | OPERATOR_ID | PARENT_OPERATORS | OPERATOR_TYPE | OPERATOR_STATISTICS | EXECUTION_TIME_BREAKDOWN | OPERATOR_ATTRIBUTES |
|--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------|
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 0 | NULL | Result | { | { | { |
| | | | | | "input_rows": 64 | "overall_percentage": 0.000000000000000e+00 | "expressions": [ |
| | | | | | } | } | "X1.I", |
| | | | | | | | "X2.I" |
| | | | | | | | ] |
| | | | | | | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 1 | [ 0 ] | Sort | { | { | { |
| | | | | | "input_rows": 64, | "overall_percentage": 0.000000000000000e+00 | "sort_keys": [ |
| | | | | | "output_rows": 64 | } | "X1.I ASC NULLS LAST", |
| | | | | | } | | "X2.I ASC NULLS LAST" |
| | | | | | | | ] |
| | | | | | | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 2 | [ 1 ] | Join | { | { | { |
| | | | | | "input_rows": 128, | "overall_percentage": 0.000000000000000e+00 | "equality_join_condition": "(X2.I = X1.I)", |
| | | | | | "output_rows": 64 | } | "join_type": "INNER" |
| | | | | | } | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 3 | [ 2 ] | TableScan | { | { | { |
| | | | | | "io": { | "overall_percentage": 0.000000000000000e+00 | "columns": [ |
| | | | | | "bytes_scanned": 1024, | } | "I" |
| | | | | | "percentage_scanned_from_cache": 1, | | ], |
| | | | | | "scan_progress": 1 | | "table_name": "MY_DB.MY_SCHEMA.X2" |
| | | | | | }, | | } |
| | | | | | "output_rows": 64, | | |
| | | | | | "pruning": { | | |
| | | | | | "partitions_scanned": 1, | | |
| | | | | | "partitions_total": 1 | | |
| | | | | | } | | |
| | | | | | } | | |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 4 | [ 2 ] | JoinFilter | { | { | { |
| | | | | | "input_rows": 64, | "overall_percentage": 0.000000000000000e+00 | "join_id": "2" |
| | | | | | "output_rows": 64 | } | } |
| | | | | | } | | |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 5 | [ 4 ] | TableScan | { | { | { |
| | | | | | "io": { | "overall_percentage": 0.000000000000000e+00 | "columns": [ |
| | | | | | "bytes_scanned": 1024, | } | "I" |
| | | | | | "percentage_scanned_from_cache": 1, | | ], |
| | | | | | "scan_progress": 1 | | "table_name": "MY_DB.MY_SCHEMA.X1" |
| | | | | | }, | | } |
| | | | | | "output_rows": 64, | | |
| | | | | | "pruning": { | | |
| | | | | | "partitions_scanned": 1, | | |
| | | | | | "partitions_total": 1 | | |
| | | | | | } | | |
| | | | | | } | | |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
Identificação da “explosão” de operadores de junção¶
O exemplo a seguir mostra como usar GET_QUERY_OPERATOR_STATS para examinar uma consulta complicada. Este exemplo procura por operadores dentro de uma consulta que produzam muito mais linhas do que foram entradas para aquele operador.
Esta é a consulta a ser analisada:
SELECT *
FROM t1
JOIN t2 ON t1.a = t2.a
JOIN t3 ON t1.b = t3.b
JOIN t4 ON t1.c = t4.c;
Obtenha o ID da consulta anterior:
SET lid = LAST_QUERY_ID();
The following query shows the ratio of output rows to input rows for each of the join operators in the query:
SELECT operator_id,
operator_attributes,
operator_statistics:output_rows / operator_statistics:input_rows AS row_multiple
FROM TABLE(GET_QUERY_OPERATOR_STATS($lid))
WHERE operator_type = 'Join'
ORDER BY step_id, operator_id;
+---------+-------------+--------------------------------------------------------------------------+---------------+
| STEP_ID | OPERATOR_ID | OPERATOR_ATTRIBUTES | ROW_MULTIPLE |
+---------+-------------+--------------------------------------------------------------------------+---------------+
| 1 | 1 | { "equality_join_condition": "(T4.C = T1.C)", "join_type": "INNER" } | 49.969249692 |
| 1 | 3 | { "equality_join_condition": "(T3.B = T1.B)", "join_type": "INNER" } | 116.071428571 |
| 1 | 5 | { "equality_join_condition": "(T2.A = T1.A)", "join_type": "INNER" } | 12.20657277 |
+---------+-------------+--------------------------------------------------------------------------+---------------+
Após identificar as junções com explosão, você pode rever cada condição de junção para verificar se a condição está correta.