Capire il buffering delle righe

Il buffering delle righe AE può aumentare le prestazioni. Poiché gli AE vengono eseguiti in un processo del sistema operativo separato, una parte significativa dell'overhead delle prestazioni può essere rappresentata dal costo del marshalling dei dati di riga tra il processo NPS e un processo AE.

Il costo delle prestazioni è influenzato dalla quantità grezza di dati trasferiti e dal numero di viaggi di andata e ritorno dei dati tra il sistema NPS e un AE. Il costo delle prestazioni è dovuto al fatto che un gran numero di commutazioni di contesto dei processi del sistema operativo può essere costoso.

Un modo per ridurre questo costo all'interno di un'applicazione è quello di inserire più informazioni in ogni riga, creando righe di dimensioni maggiori. Questo approccio può essere utile per gli AE richiamati da qualsiasi tipo di funzione SQL. Tenere presente, tuttavia, che la dimensione delle righe del sistema Netezza è limitata a 64K byte.

Un altro modo per migliorare le prestazioni è utilizzare il buffering delle righe AE. Questa funzionalità può essere utilizzata solo per gli AE invocati tramite funzioni di tabelle SQL. Il buffering di riga AE è molto utile quando si immette o si emette un gran numero di righe di piccole dimensioni. Quando è attivato, l'AE inserisce automaticamente le righe in un buffer e trasmette il buffer tra il sistema NPS e l'AE solo quando è pieno o quando viene raggiunta la fine dei dati. Il buffering delle righe AE può essere impostato sia per le righe di ingresso che per quelle di uscita (buffering completo) o solo per le righe di uscita (buffering dei risultati solo B).

La dimensione del buffer è un dettaglio di implementazione interna del sistema Netezza. È sufficientemente grande da essere utile, ma non così grande da far sì che una singola funzione sovraccarichi le risorse di memoria. Ne consegue che il buffering delle righe aumenta le prestazioni con i record più piccoli (approssimativamente inferiori a 1000 byte) e le riduce con i record più grandi.

Si noti che quando si utilizza il buffering completo, la connessione di output SQL tra le righe di input e di output viene persa. Ad esempio, una funzione tabella implementata utilizzando un AE che restituisce esattamente una riga di output per ogni riga di input viene chiamata in questo modo:
SELECT t.col1, f.result from mytable t, table WITH
final(mytablefunction(t.col1)) f;

Quando non si utilizza il buffering delle righe AE, l'output f.result corrisponde sempre all'input t.col1 che lo ha prodotto. L'uso del buffering delle righe AE comporta la perdita di questa corrispondenza nell'output. Ci sono molti scenari applicativi in cui questa corrispondenza non è necessaria.., tuttavia, se è necessario, una possibile soluzione consiste nel far sì che la funzione tabella restituisca sia il risultato che l'input che lo ha prodotto, in modo che i valori corrispondano.

Il buffering delle righe AE è controllato dalla variabile d'ambiente AE NZAE_ROW_BUFFER. Per ulteriori informazioni, vedere Buffering delle righe.