Esta página descreve como monitorar a utilização do mecanismo de colunas.
Verificar o uso do mecanismo de colunas usando EXPLAIN
É possível verificar o uso do mecanismo de colunas usando a instrução EXPLAIN
para
observar os novos operadores de coluna que aparecem no plano de consulta gerado
de uma consulta.
Cliente psql
EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF) SELECT l_returnflag, l_linestatus, l_quantity, l_extendedprice, l_discount, l_tax FROM lineitem WHERE l_shipdate <= date '1992-08-06' ; QUERY PLAN ----------------------------------------------------------------------------- Append (actual rows=3941797 loops=1) Buffers: shared hit=9 -> Custom Scan (columnar scan) on lineitem (actual rows=3941797 loops=1) Filter: (l_shipdate <= '1992-08-06'::date) Rows Removed by Columnar Filter: 56054083 Columnar cache search mode: columnar filter only Buffers: shared hit=9 -> Seq Scan on lineitem (never executed) Filter: (l_shipdate <= '1992-08-06'::date)
Custom Scan (columnar scan)
indica que a verificação do mecanismo columnar está sendo incluída no plano de consulta.Rows Removed by Columnar Filter
lista o número de linhas filtradas pela execução vetorial de coluna.Columnar cache search mode
pode sercolumnar filter only
,native
ourow store scan
. O planejador escolhe o modo de pesquisa automaticamente com base no recurso de avaliação de custo e pushdown.
Quando o planejador escolhe o modo native
, ele envia alguns dos operadores de coluna para a verificação:
Rows Aggregated by Columnar Scan
lista o número de linhas agregadas.Rows Sorted by Columnar Scan
lista o número de linhas que são classificadas.Rows Limited by Columnar Scan
lista o número limitado de linhas que foram verificadas.
Com as mesclagens, os operadores de verificação de colunas também podem usar o modo Late Materialization
.
Cliente psql
EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF) SELECT l_shipmode, o_orderpriority FROM orders, lineitem WHERE o_orderkey = l_orderkey AND l_shipmode in ('AIR', 'FOB') AND l_receiptdate >= date '1995-01-01' ; QUERY PLAN ----------------------------------------------------------------------------- Hash Join (actual rows=9865288 loops=1) Hash Cond: (lineitem.l_orderkey = orders.o_orderkey) Buffers: temp read=127738 written=127738 -> Append (actual rows=9865288 loops=1) -> Custom Scan (columnar scan) on lineitem (actual rows=9865288 loops=1) Filter: ((l_shipmode = ANY ('{AIR,FOB}'::bpchar[])) AND (l_receiptdate >= '1995-01-01'::date)) Rows Removed by Columnar Filter: 50130592 Columnar cache search mode: native -> Index Scan using idx_lineitem_orderkey_fkidx on lineitem (never executed) Filter: ((l_shipmode = ANY ('{AIR,FOB}'::bpchar[])) AND (l_receiptdate >= '1995-01-01'::date)) -> Hash (actual rows=15000000 loops=1) Buckets: 1048576 Batches: 32 Memory Usage: 37006kB Buffers: temp written=83357 -> Append (actual rows=15000000 loops=1) -> Custom Scan (columnar scan) on orders (actual rows=15000000 loops=1) Rows Removed by Columnar Filter: 0 Columnar projection mode: late materialization Columnar cache search mode: native -> Seq Scan on orders (never executed)
Columnar projection mode
pode ser late materialization
.
Os operadores de colunas escolhem esse modo automaticamente quando o planejador otimiza
a projeção adiando a materialização de alguns valores de coluna.
Use a opção COLUMNAR_ENGINE
para EXPLAIN
O comando EXPLAIN
é compatível com a opção COLUMNAR_ENGINE
. Quando especificado, o comando imprime mensagens Columnar Check
no plano EXPLAIN para mostrar o que pode ter levado o planejador ou executor a fazer determinadas escolhas relacionadas ao mecanismo de colunas para o plano. O comando também mostra outros detalhes específicos do mecanismo de colunas. A mensagem está associada ao nó de verificação não colunar. Ele normalmente indica a primeira causa que impede que uma varredura colunar seja escolhida para uma varredura. Alguns exemplos de causas são the table is too small
, a needed column of the table is not in the CE store
ou a needed column has a CE unsupported data type
.
O exemplo de saída do comando a seguir mostra uma mensagem Columnar Check
:
Cliente psql
EXPLAIN (COLUMNAR_ENGINE, COSTS OFF) SELECT * FROM sample_small_table WHERE col1 > 10000; QUERY PLAN -------------------------------------- Seq Scan on sample_small_table Filter: (col1 > 10000) Columnar Check: table is too small
Com base na mensagem, o usuário pode fazer uma das seguintes ações:
- Corrija a causa específica e execute o comando novamente para confirmar o plano de colunas.
- Iterar sobre o mesmo processo. Pode haver mais de uma causa, e a cláusula tenta listar apenas a primeira.
O exemplo a seguir mostra outros detalhes sendo impressos que são específicos para o mecanismo de colunas:
Cliente psql
EXPLAIN (ANALYZE, COLUMNAR_ENGINE, COSTS OFF, TIMING OFF, SUMMARY OFF, VERBOSE) SELECT SUM(c1) FROM counter_table WHERE c2 > 0 and c2 < 80000; QUERY PLAN --------------------------------------------------------------------------------------------- Aggregate (actual rows=1 loops=1) Output: sum(c1) -> Append (actual rows=79999 loops=1) -> Custom Scan (columnar scan) on public.counter_table (actual rows=79999 loops=1) Output: c1 Filter: ((counter_table.c2 > 0) AND (counter_table.c2 < 80000)) Rows Removed by Columnar Filter: 1 Rows Aggregated by Columnar Scan: 79999 Bytes fetched from storage cache: 1392655 Columnar cache search mode: native -> Seq Scan on public.counter_table (never executed) Output: c1 Filter: ((counter_table.c2 > 0) AND (counter_table.c2 < 80000)) (13 rows)
Conferir informações sobre tabelas com colunas no repositório de colunas
É possível consultar informações sobre as tabelas ou as visualizações materializadas com colunas
no repositório de colunas consultando a visualização g_columnar_relations
.
Cliente psql
SELECT * FROM g_columnar_relations; ┌─[ RECORD 1 ]────────┬───────────────────┐ │ relation_name │ tbl_parallel_test │ │ schema_name │ public │ │ database_name │ advisor │ │ status │ Usable │ │ size │ 581431259 │ │ columnar_unit_count │ 3 │ │ invalid_block_count │ 0 │ │ total_block_count │ 8337 │ ├─[ RECORD 2 ]────────┼───────────────────┤ │ relation_name │ lineitem │ │ schema_name │ public │ │ database_name │ advisor │ │ status │ Usable │ │ size │ 423224944 │ │ columnar_unit_count │ 29 │ │ invalid_block_count │ 0 │ │ total_block_count │ 115662 │ ├─[ RECORD 3 ]────────┼───────────────────┤
Conferir informações sobre as colunas no repositório de colunas
Para conferir informações sobre as colunas no armazenamento de colunas, consulte
a visualização g_columnar_columns
, incluindo o tamanho dessas colunas e o
último horário de acesso.
Cliente psql
SELECT database_name, schema_name, relation_name, column_name, size_in_bytes, last_accessed_time FROM g_columnar_columns;
Conferir estatísticas de execução do mecanismo colunar para consultas recentes
É possível conferir as estatísticas de execução do mecanismo de colunas para consultas recentes usando a
visualização g_columnar_stat_statements
. Essa visualização adiciona estatísticas do mecanismo colunar à visualização pg_stat_statements
fornecida pela extensão pg_stat_statements
. Para usar essa visualização, primeiro ative a extensão pg_stat_statements
.
Cliente psql
- Ative a extensão
pg_stat_statements
:CREATE EXTENSION pg_stat_statements;
- Faça as consultas com as estatísticas que você quer consultar.
Você pode fazer isso manualmente ou deixar passar tempo suficiente para
que seus aplicativos façam essas consultas com
pg_stat_statements
ativado. - Consulte as visualizações
g_columnar_stat_statements
epg_stat_statements
. A consulta a seguir recupera todas as estatísticas de execução de colunas, incluindo aquelas coletadas antes da criação da extensãopg_stat_statements
. O valor nulouserid
indica que as estatísticas foram coletadas antes da criação da extensãopg_stat_statements
.SELECT * FROM pg_stat_statements(TRUE) AS pg_stats FULL JOIN g_columnar_stat_statements AS g_stats ON pg_stats.userid = g_stats.user_id AND pg_stats.dbid = g_stats.db_id AND pg_stats.queryid = g_stats.query_id WHERE columnar_unit_read > 0; ┌─[ RECORD 1 ]────────┬─────────────────────────────── │ userid │ 10 │ │ dbid │ 33004 │ │ queryid │ 6779068104316758833 │ │ query │ SELECT l_returnflag, ↵│ │ │ l_linestatus, ↵│ │ │ l_quantity, ↵│ │ │ l_extendedprice, ↵│ │ │ l_discount, ↵│ │ │ l_tax ↵│ │ │FROM lineitem ↵│ │ │WHERE l_shipdate <= date $1│ │ calls │ 1 │ │ total_time │ 299.969983 │ │ min_time │ 299.969983 │ │ max_time │ 299.969983 │ │ mean_time │ 299.969983 │ │ stddev_time │ 0 │ │ rows │ 392164 │ │ shared_blks_hit │ 0 │ │ shared_blks_read │ 0 │ │ shared_blks_dirtied │ 0 │ │ shared_blks_written │ 0 │ │ local_blks_hit │ 0 │ │ local_blks_read │ 0 │ │ local_blks_dirtied │ 0 │ │ local_blks_written │ 0 │ │ temp_blks_read │ 0 │ │ temp_blks_written │ 0 │ │ blk_read_time │ 0 │ │ blk_write_time │ 0 │ │ user_id │ 10 │ │ db_id │ 33004 │ │ query_id │ 6779068104316758833 │ │ columnar_unit_read │ 29 │ │ page_read │ 115662 │ │ rows_filtered │ 0 │ │ columnar_scan_time │ 0 │ └─────────────────────┴───────────────────────────────┘
Conferir o uso da memória do armazenamento de colunas
Para conferir a quantidade de RAM não utilizada disponível para o mecanismo de colunas, você pode consultar a função google_columnar_engine_memory_available()
. O
número inteiro resultante mostra a memória disponível em megabytes (MB).
SELECT google_columnar_engine_memory_available();