行バッファリングを理解する

AE行バッファリングはパフォーマンスを向上させることができる。 AEは別のOSプロセスで実行されるため、パフォーマンスオーバーヘッドの大部分は、NPSプロセスとAEプロセスの間で行データをマーシャリングするコストである可能性がある。

この性能コストは、転送されるデータ量と、NPS システムと AE 間のデータ往復数に影響される。 OSのプロセス・コンテキスト・スイッチの回数が多いと、パフォーマンスが低下する。

アプリケーション内でこのコストを下げる一つの方法は、各行により多くの情報を入れ、行のサイズを大きくすることである。 この方法は、あらゆるタイプのSQL関数から呼び出されるAEに有効である。 ただし、Netezzaシステムの行サイズは64Kバイトに制限されていることに注意してください。

パフォーマンスを向上させるもう一つの方法は、AE行バッファリングを使用することである。 この機能は、SQLテーブル関数を介して呼び出されたAEにのみ使用できる。 AE行バッファリングは、小さな行を大量に入出力する場合に最も有効である。 有効化されると、AE は自動的に行をバッファに入れ、バッファが一杯になるか、データの終端に達したときのみ、NPS システムと AE の間でバッファを送信する。 AE行バッファリングは、入力行と出力行の両方(フルバッファリング)または出力行のみ(結果のみBバッファリング)に設定できる。

バッファのサイズはNetezzaシステムの内部実装の詳細である。 有用であるには十分な大きさだが、ひとつの関数がメモリリソースを使いすぎるほどには大きくない。 その意味するところは、行バッファリングは(およそ1000バイト以下の)小さなレコードではパフォーマンスを向上させ、大きなレコードではパフォーマンスを低下させるということである。

フルバッファリングを使用すると、入力行と出力行の間のSQL出力接続が失われることに注意してください。 例えば、入力1行につき出力1行を正確に返すAEを使用して実装された表関数は、この方法で呼び出される:
SELECT t.col1, f.result from mytable t, table WITH
final(mytablefunction(t.col1)) f;

AE行バッファリングを使用しない場合、出力f.resultは常にそれを生成した入力t.col11に対応する。 AE行バッファリングの使用は、この対応関係が出力で失われることを意味する。 この対応を必要としないアプリケーションのシナリオはたくさんある、 しかし、それが必要な場合、可能な回避策は、テーブル関数が結果とそれを生成した入力の両方を返し、値が対応するようにすることである。

AE行バッファリングは、AE環境変数NZAE_ROW_BUFFERによって制御される。 詳細は行バッファリングを参照。