

# Limitações e outras informações de DML no Aurora PostgreSQL Limitless Database
<a name="limitless-reference.DML-limitations"></a>

Os tópicos a seguir descrevem as limitações ou fornecem mais informações sobre os comandos SQL de DML e processamento de consultas no Aurora PostgreSQL Limitless Database.

**Topics**
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ [CLUSTER](#limitless-reference.DML-limitations.CLUSTER)
+ [EXPLAIN](#limitless-reference.DML-limitations.EXPLAIN)
+ [INSERT](#limitless-reference.DML-limitations.INSERT)
+ [UPDATE](#limitless-reference.DML-limitations.UPDATE)
+ [VACUUM](#limitless-reference.DML-limitations.VACUUM)

## ANALYZE
<a name="limitless-reference.DML-limitations.ANALYZE"></a>

O comando `ANALYZE` coleta estatísticas sobre o conteúdo das tabelas no banco de dados. Posteriormente, o planejador de consultas usa essas estatísticas para ajudar a determinar os planos de execução mais eficientes para as consultas. Para obter mais informações, consulte [ANALYZE](https://www.postgresql.org/docs/current/sql-analyze.html) na documentação do PostgreSQL.

No Aurora PostgreSQL Limitless Database, o comando `ANALYZE` coleta estatísticas da tabela em todos os roteadores e fragmentos quando é executado.

Para evitar o cálculo de estatísticas em cada roteador durante as execuções de `ANALYZE`, as estatísticas da tabela são calculadas em um dos roteadores e depois copiadas para os roteadores de mesmo nível.

## CLUSTER
<a name="limitless-reference.DML-limitations.CLUSTER"></a>

O comando `CLUSTER` reordena fisicamente uma tabela com base em um índice. O índice já deve ter sido definido na tabela. No Aurora PostgreSQL Limitless Database, o clustering é local para a parte do índice que está presente em cada fragmento.

Para ter mais informações, consulte [CLUSTER](https://www.postgresql.org/docs/current/sql-cluster.html) na documentação do PostgreSQL.

## EXPLAIN
<a name="limitless-reference.DML-limitations.EXPLAIN"></a>

Você usa o seguinte parâmetro para configurar a saída do comando `EXPLAIN`:
+ `rds_aurora.limitless_explain_options`: o que incluir na saída de `EXPLAIN`. O valor padrão é `single_shard_optimization`: é mostrado se os planos são otimizados para fragmento único, mas os planos de fragmento não estão incluídos.

Neste exemplo, a saída de `EXPLAIN` não mostra planos de fragmentos.

```
postgres_limitless=> EXPLAIN SELECT * FROM employees where id =25;

                      QUERY PLAN
------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
 Single Shard Optimized
(2 rows)
```

Agora, configuramos `rds_aurora.limitless_explain_options` para incluir `shard_plans` e `single_shard_optimization`. Podemos ver os planos de execução das instruções em roteadores e fragmentos. Além disso, desativamos o parâmetro `enable_seqscan` para garantir que a varredura de índice seja usada na camada de fragmento.

```
postgres_limitless=> SET rds_aurora.limitless_explain_options = shard_plans, single_shard_optimization;
SET

postgres_limitless=> SET enable_seqscan = OFF;
SET

postgres_limitless=> EXPLAIN SELECT * FROM employees WHERE id = 25;

                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
   Remote Plans from Shard postgres_s4:
         Index Scan using employees_ts00287_id_idx on employees_ts00287 employees_fs00003  (cost=0.14..8.16 rows=1 width=15)
           Index Cond: (id = 25)
 Single Shard Optimized
(5 rows)
```

Para obter mais informações sobre o comando `EXPLAIN`, consulte [EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html) na documentação do PostgreSQL.

## INSERT
<a name="limitless-reference.DML-limitations.INSERT"></a>

A maioria dos comandos `INSERT` é compatível com o Aurora PostgreSQL Limitless Database.

O PostgreSQL não tem um comando `UPSERT` explícito, mas é compatível com as instruções `INSERT ... ON CONFLICT`.

`INSERT ... ON CONFLICT` não é compatível se a ação de conflito tiver uma subconsulta ou uma função mutável:

```
-- RANDOM is a mutable function.
INSERT INTO sharded_table VALUES (1, 100) ON CONFLICT (id) DO UPDATE SET other_id = RANDOM();

ERROR: Aurora Limitless Tables doesn't support pushdown-unsafe functions with DO UPDATE clauses.
```

Para obter mais informações sobre o comando `INSERT`, consulte [INSERT](https://www.postgresql.org/docs/current/sql-insert.html) na documentação do PostgreSQL.

## UPDATE
<a name="limitless-reference.DML-limitations.UPDATE"></a>

A atualização da chave de fragmento não é compatível. Por exemplo, você tem uma tabela fragmentada chamada `customers`, com uma chave de fragmento `customer_id`. As seguintes instruções DML causam erros:

```
postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_id =1;
ERROR:  Shard key column update is not supported

postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_name='abc';
ERROR:  Shard key column update is not supported
```

Para atualizar uma chave de fragmento, primeiro aplique `DELETE` à linha com a chave de fragmento e, em seguida, aplique `INSERT` a uma nova linha com o valor atualizado da chave de fragmento.

Para obter mais informações sobre o comando `UPDATE`, consulte [Updating data](https://www.postgresql.org/docs/current/dml-update.html) na documentação do PostgreSQL.

## VACUUM
<a name="limitless-reference.DML-limitations.VACUUM"></a>

É possível realizar a limpeza em tabelas fragmentadas e de referência. As seguintes funções `VACUUM` são totalmente compatíveis com o Aurora PostgreSQL Limitless Database:
+ VACUUM
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ DISABLE\$1PAGE\$1SKIPPING
+ FREEZE
+ FULL
+ INDEX\$1CLEANUP
+ PARALLEL
+ PROCESS\$1TOAST
+ TRUNCATE
+ VERBOSE

`VACUUM` no Aurora PostgreSQL Limitless Database tem as seguintes limitações:
+ A extensão [pg\$1visibility\$1map](https://www.postgresql.org/docs/current/pgvisibility.html) não é compatível.
+ A verificação de índices não utilizados com a visualização [pg\$1stat\$1all\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-INDEXES-VIEW) não é compatível.
+ As visualizações consolidadas para [pg\$1stat\$1user\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html), [pg\$1class](https://www.postgresql.org/docs/current/catalog-pg-class.html) e [pg\$1stats](https://www.postgresql.org/docs/current/view-pg-stats.html) não foram implementadas.

Para obter mais informações sobre o comando `VACUUM`, consulte [VACUUM](https://www.postgresql.org/docs/current/sql-vacuum.html) na documentação do PostgreSQL. Para obter mais informações sobre como a limpeza funciona no Aurora PostgreSQL Limitless Database, consulte [Recuperar espaço de armazenamento por meio de limpeza](limitless-vacuum.md).