Account Usage¶
No banco de dados SNOWFLAKE, os esquemas ACCOUNT_USAGE e READER_ACCOUNT_USAGE permitem consultar metadados de objetos, bem como dados históricos de uso, para sua conta e todas as contas de leitor (se houver) associadas à conta.
Neste tópico:
Visão geral dos esquemas Account Usage¶
- ACCOUNT_USAGE:
Exibições que mostram metadados de objetos e métricas de uso para sua conta.
Em geral, essas exibições espelham as exibições e funções de tabela correspondentes no Snowflake Snowflake Information Schema, mas com as seguintes diferenças:
Registros de objetos descartados incluídos em cada exibição.
Maior tempo de retenção para dados históricos de uso.
Latência de dados.
Para obter mais detalhes, consulte Diferenças entre Account Usage e Information Schema (neste tópico). Para obter mais detalhes sobre cada exibição, consulte Exibições do ACCOUNT_USAGE (neste tópico).
- READER_ACCOUNT_USAGE:
Exibições que mostram metadados de objetos e métricas de uso para todas as contas de leitor que foram criadas para sua conta (como um provedor de Secure Data Sharing).
Essas exibições são um pequeno subconjunto das exibições do ACCOUNT_USAGE que se aplicam às contas de leitor, com exceção da exibição RESOURCE_MONITORS, que está disponível apenas no READER_ACCOUNT_USAGE. Além disso, cada exibição neste esquema contém uma coluna adicional
READER_ACCOUNT_NAME
para filtrar os resultados por conta de leitor.Para obter mais detalhes sobre cada exibição, consulte Exibições do READER_ACCOUNT_USAGE (neste tópico).
Observe que essas exibições ficam vazias se nenhuma conta de leitor tiver sido criada para sua conta.
Diferenças entre Account Usage e Information Schema¶
As exibições do Account Usage e as exibições correspondentes (ou funções de tabela) no Snowflake Information Schema utilizam estruturas e convenções de nomenclatura idênticas, mas com algumas diferenças importantes, como descrito nesta seção:
Diferença |
Account Usage |
Information Schema |
---|---|---|
Inclui objetos descartados |
Sim |
Não |
Latência dos dados |
De 45 minutos a 3 horas (varia de acordo com a exibição) |
Nenhum |
Retenção de dados históricos |
1 ano |
De 7 dias a 6 meses (varia de acordo com a exibição/função de tabela) |
Para obter mais detalhes, consulte as seções seguintes.
Registros de objetos descartados¶
Exibições do Account Usage incluem registros para todos os objetos que foram descartados. Muitas das exibições para tipos de objetos contêm uma coluna adicional DELETED
que exibe o carimbo de data/hora em que o objeto foi descartado.
Além disso, como os objetos podem ser descartados e recriados com o mesmo nome, para diferenciar os registros de objetos que têm o mesmo nome, as exibições do Account Usage incluem colunas de ID, quando apropriado, que exibem as IDs internas geradas e atribuídas a cada registro pelo sistema.
Se uma coluna para um nome de objeto (por exemplo, a coluna TABLE_NAME
) é NULL, esse objeto foi descartado. Neste caso, as colunas para os nomes e IDs dos objetos pai (por exemplo, as colunas DATABASE_NAME
e SCHEMA_NAME
) também são NULL.
Observe que em algumas exibições, a coluna para o nome do objeto ainda pode conter o nome do objeto, mesmo que o objeto tenha sido descartado.
Latência dos dados¶
Devido ao processo de extração dos dados do armazenamento interno de metadados do Snowflake, as exibições do Account Usage têm alguma latência natural:
Para a maioria das exibições, a latência é de 2 horas (120 minutos).
Para as demais exibições, a latência varia entre 45 minutos e 3 horas.
Para obter mais detalhes, consulte a lista de exibições para cada esquema (neste tópico). Observe também que todos estes são períodos máximos de tempo; a latência real para uma determinada exibição quando a exibição é consultada pode ser menor.
Em contraste, as exibições/funções de tabela no Snowflake Information Schema não têm latência.
Retenção de dados históricos¶
Algumas exibições de Account Usage fornecem métricas históricas de uso. O período de retenção para essas exibições é 1 ano (365 dias).
Em contraste, as exibições e funções de tabela correspondentes no Snowflake Information Schema têm períodos de retenção muito mais curtos, variando de 7 dias a 6 meses, dependendo da exibição.
Exibições de ACCOUNT_USAGE¶
O esquema ACCOUNT_USAGE contém as seguintes exibições:
Exibição |
Tipo |
Latência [1] |
Edição [3] |
Notas |
---|---|---|---|---|
Histórico |
3 horas |
Enterprise Edition (ou superior) |
Dados retidos por 1 ano. |
|
Histórico |
3 horas |
Enterprise Edition (ou superior) |
Dados retidos por 1 ano. |
|
Histórico |
3 horas |
|||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
90 minutos |
|||
Histórico |
45 minutos |
Dados retidos por 1 ano. |
||
Histórico |
2 horas [2] |
Dados retidos por 1 ano. |
||
Objeto |
3 horas |
Enterprise Edition (ou superior) |
Dados retidos enquanto a tabela existir. |
|
Objeto |
3 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
2 horas |
Dados retidos por 1 ano. |
||
Objeto |
90 minutos |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
2 horas |
Dados retidos por 1 ano. |
||
Objeto |
90 minutos |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Objeto |
3 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
3 horas |
|||
Objeto |
3 horas |
|||
Histórico |
90 minutos [2] |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
2 horas |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Enterprise Edition (ou superior) |
Dados retidos por 1 ano. |
|
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Histórico |
3 horas |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Enterprise Edition (ou superior) |
Dados retidos por 1 ano. |
|
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
45 minutos |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Enterprise Edition (ou superior) |
Dados retidos por 1 ano. |
|
Objeto |
2 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
3 horas |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
2 horas |
Dados retidos por 1 ano. |
||
Histórico |
12 horas |
Dados retidos por 1 ano. |
||
Objeto |
2 horas |
|||
Histórico |
2 horas |
Dados retidos por 1 ano. |
||
Histórico |
2 horas |
Utilização combinada em todas as tabelas do banco de dados e estágios internos. Dados retidos por 1 ano. |
||
Objeto |
90 minutos |
|||
Objeto |
2 horas |
|||
Objeto |
90 minutos |
|||
Objeto |
2 horas |
|||
Objeto |
2 horas |
|||
Histórico |
45 minutos |
|||
Objeto |
3 horas |
|||
Objeto |
2 horas |
|||
Objeto |
90 minutos |
|||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
||
Histórico |
3 horas |
Dados retidos por 1 ano. |
[1] Todos os tempos de latência são aproximados; em alguns casos, a latência real pode ser menor.
[2] A latência das exibições de uma determinada tabela pode ser de até 2 dias se ambas as condições a seguir forem verdadeiras: 1. Menos de 32 instruções DML foram adicionadas à tabela fornecida desde a última atualização em LOAD_HISTORY ou COPY_HISTORY. 2. Menos de 100 linhas foram adicionadas à tabela fornecida desde a última atualização em LOAD_HISTORY ou COPY_HISTORY.
[3] A menos que seja observado o contrário, a exibição do Account Usage está disponível para todas as contas.
Funções de tabela do Account Usage¶
Atualmente, o Snowflake oferece suporte a uma função de tabela ACCOUNT_USAGE:
Função de tabela |
Retenção de dados |
Notas |
---|---|---|
N/A |
Os resultados retornam apenas para a função que tem acesso ao objeto especificado. |
Nota
Assim como nas exibições do Account Usage, considere a latência ao chamar esta função de tabela. A latência esperada para esta função de tabela é semelhante à latência para a exibição TAG_REFERENCES.
Exibições de READER_ACCOUNT_USAGE¶
O esquema READER_ACCOUNT_USAGE contém as seguintes exibições:
Exibição |
Tipo |
Latência [1] |
Notas |
---|---|---|---|
Histórico |
2 horas |
Dados retidos por 1 ano. |
|
Histórico |
45 minutos |
Dados retidos por 1 ano. |
|
Objeto |
2 horas |
||
Histórico |
2 horas |
Utilização combinada em todas as tabelas do banco de dados e estágios internos. Dados retidos por 1 ano. |
|
Histórico |
3 horas |
Dados retidos por 1 ano. |
[1] Todos os tempos de latência são aproximados; em alguns casos, a latência real pode ser menor.
Habilitação do uso do banco de dados SNOWFLAKE para outras funções¶
Por padrão, o banco de dados SNOWFLAKE fica visível para todos os usuários, mas o acesso aos esquemas nesse banco de dados pode ser concedido por um usuário com a função ACCOUNTADMIN usando uma das seguintes abordagens:
Concessão de IMPORTED PRIVILEGES no banco de dados SNOWFLAKE.
Conceda uma função de banco de dados SNOWFLAKE a uma função de conta.
Importante
Seja cuidadoso ao conceder privilégios ao banco de dados SNOWFLAKE em uma conta que tenha a função ORGADMIN habilitada. Dentro dessa conta, qualquer pessoa com privilégios para o banco de dados SNOWFLAKE pode acessar o esquema ORGANIZATION_USAGE.
Para evitar a concessão involuntária de acesso aos dados no nível de organização, considere o uso de funções de banco de dados SNOWFLAKE para conceder acesso às exibições no esquema ACCOUNT_USAGE.
Para obter mais informações, consulte GRANT DATABASE ROLE.
Por exemplo, para conceder IMPORTED PRIVILEGES no banco de dados SNOWFLAKE a duas funções adicionais:
USE ROLE ACCOUNTADMIN; GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE TO ROLE SYSADMIN; GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE TO ROLE customrole1;
Um usuário com a função customrole1
pode consultar uma exibição da seguinte maneira:
USE ROLE customrole1; SELECT database_name, database_owner FROM SNOWFLAKE.ACCOUNT_USAGE.DATABASES;
Para exemplos adicionais, consulte Consulta das exibições do Account Usage.
Esquema ACCOUNT_USAGE Funções do banco de dados SNOWFLAKE¶
Além disso, você pode conceder um controle mais preciso às contas usando as funções do banco de dados SNOWFLAKE. Para obter mais informações nas funções do banco de dados, consulte funções do banco de dados.
Os esquemas ACCOUNT_USAGE têm quatro funções de banco de dados SNOWFLAKE definidas, cada uma concedendo o privilégio SELECT em exibições específicas.
Função |
Objetivo e descrição |
---|---|
OBJECT_VIEWER |
A função OBJECT_VIEWER dá visibilidade aos metadados do objeto. |
USAGE_VIEWER |
A função USAGE_VIEWER dá visibilidade às informações históricas de uso. |
GOVERNANCE_VIEWER |
A função GOVERNANCE_VIEWER dá visibilidade às informações relacionadas às políticas. |
SECURITY_VIEWER |
A função SECURITY_VIEWER dá visibilidade às informações baseadas em segurança. |
Exibições do ACCOUNT_USAGE por função do banco de dados¶
As funções OBJECT_VIEWER, USAGE_VIEWER, GOVERNANCE_VIEWER e SECURITY_VIEWER têm o privilégio SELECT de consultar as exibições de Account Usage no banco de dados compartilhado SNOWFLAKE.
Uma marca de verificação (ou seja, ✔) indica que a função tem o privilégio SELECT na exibição.
Exibição |
Função OBJECT_VIEWER |
Função USAGE_VIEWER |
Função GOVERNANCE_VIEWER |
Função SECURITY_VIEWER |
---|---|---|---|---|
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
✔ |
|||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
✔ |
|||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
||||
✔ |
Esquema READER_ACCOUNT_USAGE Funções do banco de dados SNOWFLAKE¶
A função READER_USAGE_VIEWER SNOWFLAKE do banco de dados recebe o privilégio SELECT em todas as exibições READER_ACCOUNT_USAGE. Como as contas de leitores são criadas pelos clientes, espera-se que a função READER_USAGE_VIEWER seja concedida às funções usadas para monitorar o uso das contas de leitores.
Exibição |
---|
Consulta das exibições do Account Usage¶
Esta seção inclui considerações ao consultar as exibições de Account Usage, juntamente com exemplos de consulta.
Como selecionar colunas¶
As exibições específicas do Snowflake estão sujeitas a mudanças. Evite selecionar todas as colunas dessas exibições. Em vez disso, selecione as colunas que você deseja. Por exemplo, se você quiser a coluna name
, use SELECT name
em vez de SELECT *
.
Reconciliação de exibições de custos¶
Há várias exibições de Account Usage que contêm dados relacionados ao custo de recursos de computação, armazenamento e transferências de dados. Se estiver tentando reconciliar essas exibições com uma exibição correspondente no esquema ORGANIZATION_USAGE, primeiro será necessário definir o fuso horário da sessão como UTC.
Por exemplo, se você estiver tentando reconciliar ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY com os dados da conta em ORGANIZATION_USAGE.WAREHOUSE_METERING_HISTORY, você deverá executar o seguinte comando antes de consultar a exibição de Account Usage:
ALTER SESSION SET TIMEZONE = UTC;
Exemplos¶
Os exemplos a seguir mostram algumas consultas típicas/úteis usando as exibições no esquema ACCOUNT_USAGE.
Nota
Estes exemplos consideram que o banco de dados do SNOWFLAKE e o esquema ACCOUNT_USAGE estão em uso para a sessão atual. Os exemplos também consideram que a função ACCOUNTADMIN (ou uma função que possui IMPORTED PRIVILEGES no banco de dados) está em uso. Se não estiverem em uso, execute os seguintes comandos antes de executar as consultas nos exemplos:
USE ROLE ACCOUNTADMIN; USE SCHEMA snowflake.account_usage;
Exemplos: métricas de login de usuário¶
Número médio de segundos entre tentativas de login com falha pelo usuário (mês até a data):
select user_name, count(*) as failed_logins, avg(seconds_between_login_attempts) as average_seconds_between_login_attempts from ( select user_name, timediff(seconds, event_timestamp, lead(event_timestamp) over(partition by user_name order by event_timestamp)) as seconds_between_login_attempts from login_history where event_timestamp > date_trunc(month, current_date) and is_success = 'NO' ) group by 1 order by 3;
Logins com falha por usuário (mês até a data):
select user_name, sum(iff(is_success = 'NO', 1, 0)) as failed_logins, count(*) as logins, sum(iff(is_success = 'NO', 1, 0)) / nullif(count(*), 0) as login_failure_rate from login_history where event_timestamp > date_trunc(month, current_date) group by 1 order by 4 desc;
Logins com falha por usuário e cliente de conexão (mês até a data):
select reported_client_type, user_name, sum(iff(is_success = 'NO', 1, 0)) as failed_logins, count(*) as logins, sum(iff(is_success = 'NO', 1, 0)) / nullif(count(*), 0) as login_failure_rate from login_history where event_timestamp > date_trunc(month, current_date) group by 1,2 order by 5 desc;
Exemplos: desempenho de warehouse¶
Esta consulta calcula as métricas de desempenho do warehouse, como rendimento e latência para intervalos de tempo de 15 minutos no decorrer de um dia.
Na amostra de código abaixo, você pode substituir CURRENT_WAREHOUSE()
pelo nome de um warehouse para calcular as métricas para aquele warehouse. Além disso, altere as datas time_from
e time_to
na cláusula WITH para especificar o período.
WITH params AS ( SELECT CURRENT_WAREHOUSE() AS warehouse_name, '2021-11-01' AS time_from, '2021-11-02' AS time_to ), jobs AS ( SELECT query_id, time_slice(start_time::timestamp_ntz, 15, 'minute','start') as interval_start, qh.warehouse_name, database_name, query_type, total_elapsed_time, compilation_time AS compilation_and_scheduling_time, (queued_provisioning_time + queued_repair_time + queued_overload_time) AS queued_time, transaction_blocked_time, execution_time FROM snowflake.account_usage.query_history qh, params WHERE qh.warehouse_name = params.warehouse_name AND start_time >= params.time_from AND start_time <= params.time_to AND execution_status = 'SUCCESS' AND query_type IN ('SELECT','UPDATE','INSERT','MERGE','DELETE') ), interval_stats AS ( SELECT query_type, interval_start, COUNT(DISTINCT query_id) AS numjobs, MEDIAN(total_elapsed_time)/1000 AS p50_total_duration, (percentile_cont(0.95) within group (order by total_elapsed_time))/1000 AS p95_total_duration, SUM(total_elapsed_time)/1000 AS sum_total_duration, SUM(compilation_and_scheduling_time)/1000 AS sum_compilation_and_scheduling_time, SUM(queued_time)/1000 AS sum_queued_time, SUM(transaction_blocked_time)/1000 AS sum_transaction_blocked_time, SUM(execution_time)/1000 AS sum_execution_time, ROUND(sum_compilation_and_scheduling_time/sum_total_duration,2) AS compilation_and_scheduling_ratio, ROUND(sum_queued_time/sum_total_duration,2) AS queued_ratio, ROUND(sum_transaction_blocked_time/sum_total_duration,2) AS blocked_ratio, ROUND(sum_execution_time/sum_total_duration,2) AS execution_ratio, ROUND(sum_total_duration/numjobs,2) AS total_duration_perjob, ROUND(sum_compilation_and_scheduling_time/numjobs,2) AS compilation_and_scheduling_perjob, ROUND(sum_queued_time/numjobs,2) AS queued_perjob, ROUND(sum_transaction_blocked_time/numjobs,2) AS blocked_perjob, ROUND(sum_execution_time/numjobs,2) AS execution_perjob FROM jobs GROUP BY 1,2 ORDER BY 1,2 ) SELECT * FROM interval_stats;Nota
Analise diferentes tipos de instrução separadamente (por exemplo, instruções SELECT independentes de INSERT ou DELETE ou outras instruções).
O valor NUMJOBS representa o rendimento para esse intervalo de tempo.
Os valores P50_TOTAL_DURATION (mediana) e P95_TOTAL_DURATION (pico) representam a latência.
O SUM_TOTAL_DURATION é a soma dos valores SUM_<job_stage>_TIME para os diferentes estágios do trabalho (COMPILATION_AND_SCHEDULING, QUEUED, BLOCKED, EXECUTION).
Analise os valores <job_stage>_RATIO quando a carga (NUMJOBS) aumentar. Procure mudanças de proporção ou desvios em relação à média.
Se QUEUED_RATIO for alto, pode não haver capacidade suficiente no warehouse. Adicione mais clusters ou aumente o tamanho do warehouse.
Exemplos: uso de crédito do warehouse¶
Créditos utilizados por cada warehouse em sua conta (mês até a data):
select warehouse_name, sum(credits_used) as total_credits_used from warehouse_metering_history where start_time >= date_trunc(month, current_date) group by 1 order by 2 desc;
Créditos utilizados ao longo do tempo por cada warehouse em sua conta (mês até a data):
select start_time::date as usage_date, warehouse_name, sum(credits_used) as total_credits_used from warehouse_metering_history where start_time >= date_trunc(month, current_date) group by 1,2 order by 2,1;
Exemplos: uso do armazenamento de dados¶
Terabytes faturáveis armazenados em sua conta ao longo do tempo:
select date_trunc(month, usage_date) as usage_month , avg(storage_bytes + stage_bytes + failsafe_bytes) / power(1024, 4) as billable_tb from storage_usage group by 1 order by 1;
Exemplos: totais de consultas de usuário e tempos de execução¶
Total de trabalhos executados em sua conta (mês até a data):
select count(*) as number_of_jobs from query_history where start_time >= date_trunc(month, current_date);
Total de trabalhos executados por cada warehouse em sua conta (mês até a data):
select warehouse_name, count(*) as number_of_jobs from query_history where start_time >= date_trunc(month, current_date) group by 1 order by 2 desc;
Tempo médio de execução da consulta por usuário (mês até a data):
select user_name, avg(execution_time) as average_execution_time from query_history where start_time >= date_trunc(month, current_date) group by 1 order by 2 desc;
Tempo médio de execução da consulta por tipo de consulta e tamanho do warehouse (mês até a data):
select query_type, warehouse_size, avg(execution_time) as average_execution_time from query_history where start_time >= date_trunc(month, current_date) group by 1,2 order by 3 desc;
Exemplos: obter uma contagem de consultas para cada evento de login¶
Junte colunas de LOGIN_HISTORY, QUERY_HISTORY e SESSIONS para obter uma contagem de consultas para cada evento de login de usuário.
Nota
A exibição SESSIONS registra informações a partir de 20-21 julho de 2020, portanto o resultado da consulta conterá apenas informações sobrepostas para cada uma das três exibições a partir dessa data.
select l.user_name, l.event_timestamp as login_time, l.client_ip, l.reported_client_type, l.first_authentication_factor, l.second_authentication_factor, count(q.query_id) from snowflake.account_usage.login_history l join snowflake.account_usage.sessions s on l.event_id = s.login_event_id join snowflake.account_usage.query_history q on q.session_id = s.session_id group by 1,2,3,4,5,6 order by l.user_name ;