2016-12-30 14 views
0

私は1M +行テーブルで作業しています。データを挿入するソフトウェアは、すべての行を選択しようとすることがあります。それをしようとするならば。それはクラッシュします。制限するSELECTクエリを変更

私はソフトウェアを変更できないので、私はPostgreSQL側で修正を実装しようとしています。

私はRULEを実装しようとしたが、成功でそれを行うことができませんでしたPostgreSQLは1

に特別なユーザーから来ているSELECTクエリ結果を制限したいです。どんな提案も大歓迎です。

Brで、

答えて

0

あなたは、テーブルの名前を変更し、(名前が変更されたテーブルから選択)テーブルの名前を持つビューを作成することができます。

次に、ビュー定義にLIMIT句を含めることができます。

+0

この場合、INSERTをどのようにして権利テーブルに保存できますか?トリガーを使用することによって? –

+0

はい、 'LIMIT'のために、 –

+0

の代わりにトリガーが必要な場合、これはソフトウェアに見えない行をいくつか作ります。これは他のバグを引き起こす可能性があります。 – Jasen

0

インデックスが必要な場合があります。いくつかのシナリオを教えてください。

  1. フィールドの1つに固有の制約がありますが、対応するインデックスはありません。この方法でレコードを挿入すると、PostgreSQLはテーブルをスキャンして、そのフィールドに同じ値を持つ既存のレコードがあるかどうかを調べる必要があります。

  2. あなたのソフトウェアは一意のフィールド制約を模倣しています。新しいレコードを挿入する前に、テーブルの1つのフィールドに同じ値のレコードをスキャンして、そのようなレコードがすでに存在するかどうかを確認します。右のフィールドの索引は間違いなく助けになるでしょう。

  3. ソフトウェアは、次の「id」値を計算します。この場合、次の利用可能な値を見つけるためにSELECT MAX(id)を実行します。 "id"にはインデックスが必要です。

テーブルフィールドのインデックス付けに役立つかどうかを確認してください。また、サーバーに送信された照会をトレースして分析し、それらの照会が表の索引付けの恩恵を受けることができるかどうかを確認することもできます。この方法でクエリのログを有効にすることができますHow to log PostgreSQL queries?

また、ソフトウェアはすべてのレコードを処理する前にバッファリングすることがあります。 1Mレコードをメモリに読み込むとクラッシュする可能性があります。 fetchSizeを制限する(たとえば、ソフトウェアでJDBCを使用する場合、接続文字列にdefaultRowFetchSize接続パラメータを追加できます)、既存のソフトウェアがDBからデータをフェッチする方法を変更する手段がないかもしれません。

+0

"*フィールドの一意な制約がありますが、対応するインデックスはありません*" - 不可能 –

+0

実際には、テーブルにbtreeインデックスがあります。問題はSELECTの検索速度ではなく、すべての行を返すために必要な時間です。クエリで100行を超えるとすると、100行を返すようなsometingが必要です。 –