

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Utilizzo di suggerimenti per le query T-SQL per migliorare le prestazioni delle query Babelfish
<a name="babelfish-tsql-hints"></a>

A partire dalla versione 2.3.0, Babelfish supporta l'uso dei suggerimenti per le query utilizzando `pg_hint_plan`. In Aurora PostgreSQL, `pg_hint_plan` è installato per impostazione predefinita. Per ulteriori informazioni sull'estensione PostgreSQL `pg_hint_plan`, consulta [https://github.com/ossc-db/pg_hint_plan](https://github.com/ossc-db/pg_hint_plan). Per informazioni dettagliate sulla versione di questa estensione supportata da Aurora PostgreSQL, consulta [Extension versions for Amazon Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html) (Versioni delle estensioni di Amazon Aurora PostgreSQL) nelle *Note di rilascio per Aurora PostgreSQL*. 

 L'ottimizzatore di query è progettato per trovare il piano di esecuzione ottimale per un'istruzione SQL. Quando si seleziona un piano, l'ottimizzatore di query considera sia il modello di costo del motore sia le statistiche di colonne e tabelle. Tuttavia, il piano suggerito potrebbe non soddisfare le esigenze dei tuoi set di dati. Pertanto, i suggerimenti di query risolvono i problemi di prestazioni per migliorare i piani di esecuzione. Un `query hint` è una sintassi aggiunta allo standard SQL che indica al motore di database come eseguire la query. Ad esempio, un suggerimento può indicare al motore di seguire una scansione sequenziale e sostituire qualsiasi piano selezionato dall'ottimizzatore di query. 

## Attivazione dei suggerimenti di query T-SQL in Babelfish
<a name="babelfish-tsql-hints-turningon"></a>

Attualmente, Babelfish ignora tutti i suggerimenti T-SQL per impostazione predefinita. Per applicare i suggerimenti T-SQL, esegui il comando `sp_babelfish_configure` con il valore enable\$1pg\$1hint impostato su ON (Attivato).

```
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on' [, 'server']
```

Puoi rendere le impostazioni permanenti a livello di cluster includendo la parola chiave *server*. Per configurare l'impostazione solo per la sessione corrente, non utilizzare la parola chiave server. 

Dopo aver impostato `enable_pg_hint` su ON (Attivato), Babelfish applica i seguenti suggerimenti T-SQL.
+ Suggerimenti INDEX
+ Suggerimenti JOIN
+ Suggerimento FORCE ORDER
+ Suggerimento MAXDOP

Ad esempio, la seguente sequenza di comandi attiva `pg_hint_plan`

```
1> CREATE TABLE t1 (a1 INT PRIMARY KEY, b1 INT);
2> CREATE TABLE t2 (a2 INT PRIMARY KEY, b2 INT);
3> GO    
1> EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on';
2> GO
1> SET BABELFISH_SHOWPLAN_ALL ON;
2> GO
1> SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2; --NO HINTS (HASH JOIN)
2> GO
```

Nessun suggerimento viene applicato all'istruzione SELECT. Viene restituito il piano di query senza alcun suggerimento.

```
QUERY PLAN                                                                                                                                                                                                                                
---------------------------------------------------------------------------
Query Text: SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2
Hash Join (cost=60.85..99.39 rows=2260 width=16)
 Hash Cond: (t1.a1 = t2.a2)
 -> Seq Scan on t1 (cost=0.00..32.60 rows=2260 width=8)
 -> Hash (cost=32.60..32.60 rows=2260 width=8)
 -> Seq Scan on t2 (cost=0.00..32.60 rows=2260 width=8)
```

```
1> SELECT * FROM t1 INNER MERGE JOIN t2 ON t1.a1 = t2.a2;
2> GO
```

Il suggerimento di query viene applicato all'istruzione SELECT. L'output seguente mostra che viene restituito il piano di query con Merge Join.

```
QUERY PLAN                                                                                                                                                                                                                                
---------------------------------------------------------------------------
Query Text: SELECT/*+ MergeJoin(t1 t2) Leading(t1 t2)*/ * FROM t1 INNER JOIN t2 ON t1.a1 = t2.a2
Merge Join (cost=0.31..190.01 rows=2260 width=16)
 Merge Cond: (t1.a1 = t2.a2)
 -> Index Scan using t1_pkey on t1 (cost=0.15..78.06 rows=2260 width=8)
 -> Index Scan using t2_pkey on t2 (cost=0.15..78.06 rows=2260 width=8)
```

```
1> SET BABELFISH_SHOWPLAN_ALL OFF;
2> GO
```

## Limitazioni
<a name="babelfish-tsql-hints-limitations"></a>

Per utilizzare i suggerimenti di query, considera le seguenti restrizioni:
+ Se un piano di query viene memorizzato nella cache prima dell'attivazione di `enable_pg_hint`, i suggerimenti non vengono applicati nella stessa sessione, ma nella nuova sessione.
+ Se i nomi di schema vengono forniti in modo esplicito, i suggerimenti non possono essere applicati. È possibile utilizzare gli alias delle tabelle come soluzione alternativa.
+ Un suggerimento di query non può essere applicato a viste e query secondarie.
+ I suggerimenti non funzionano con JOINs le UPDATE/DELETE dichiarazioni.
+ Un suggerimento di indice per una tabella o un indice inesistente viene ignorato.
+ L'hint FORCE ORDER non funziona per HASH JOINs e non ANSI. JOINs