0

次のことで私を助けてくれますか?

1つはテーブルからのストレート( columnA)で、もう1つはサブクエリ(columnB )から生成された2つの列になるクエリがあります。columnB で並べ替え (つまり、ORDER BY) を行うと、columnA で同じことを行うときよりも応答が遅くなります (50 回以上)。columnAをソートするときに達成される速度に近づくために、 columnBのソートを高速化する方法はありますか?

注: エンジンは Postgres です

更新: クエリは次のようになります。

select columnA, array_to_string(array(select ... from tableB where ...), '%') as columnB
from tableA
where ... 
order by columnA

どんなアドバイスでも大歓迎です。

更新#2:新しいクエリで並べ替えを行い、結果をメインクエリにフィードすることで解決しました(whereステートメントを使用して、必要なパフォーマンスを提供するセット全体ではなく行の一部のみを選択しました)。答えてくれたみんなありがとう。

4

3 に答える 3

2

あなたのクエリで

select columnA, array_to_string(array(select ... from tableB where ...), '%') as columnB
from tableA
where ... 
order by columnA

columnB に対する操作では、インデックスを利用できません。それだけでなく、並べ替えでは、連結された多くの行の幅の列を処理する必要があります。

array_to_string(...)式の並べ替え順序は任意であるため、これを並べ替える必要がある理由を再考することをお勧めしますへの引数である SELECT ステートメント内でソートしていないと言うので、それは任意ですarray()


array_to_string を使用して、後で処理する必要がある多数の値を取得しています。代替案はありますか?

SELECT ステートメントは、任意の数の値をキャプチャします。

いくつかの値をソートされた順序で「さらに処理する」必要がある場合は、配列関数を使用せずに SELECT...ORDER BY ステートメントの結果を返す方がよいでしょう。こうすることで、アプリケーション コードは結果セットをウォークするだけで値を順番に処理できます。「%」で区切られた文字列から値を解析する必要はありません。

于 2013-05-14T21:55:03.090 に答える
2

並べ替えられていないデータを一時テーブルに入れてから、列 b にインデックスを付けることができます。次に、現在インデックスが作成されている列で order by を使用して単純な選択を実行します。これが高速になるという保証はありませんが、試してみる価値はあります。

于 2013-05-14T22:12:22.560 に答える
1

「ColumnB」は計算された値であるため、ソートを高速化するために使用できるインデックスはありません。ColumnA はおそらく既にソートされているため、高速です。これらの計算された値の並べ替えを高速化するためにできることは、事前に計算してテーブルに入れる以外にありません。これが、データ ウェアハウスが通常、ライブ データに対して機能せず、代わりに毎日のロールアップをエクスポートする大きな理由です。

于 2013-05-14T21:43:20.423 に答える