2017-02-17 11 views
0

私はGoコードでクエリを実行するためにsqlxを使用しています。クエリには、WHERE IN(?)句でフィルタリングする必要がある値の長いリスト(〜10,000)があります。これにより、パフォーマンスが大幅に低下します。どのようにしてそのようなクエリを最適化できますか?また、このクエリはRedshiftクラスタで実行されているため、クエリのパフォーマンスを向上させるために列のインデックスを作成する方法はありません。Sqlx長いリストを含むクエリ

values := []int64{143, 123, 123, 542....} // ~10,000 elements 
query, args, err := sqlx.In(query, values) 
if err != nil { 
    return nil, err 
} 

query = dbInterface.Rebind(query) 
err = dbInterface.Select(&list, query, args...) 

問合せ:

SELECT * FROM table_name WHERE some_id IN (?) ORDER BY created_at; 
+0

挿入するクエリの種類と値の種類を表示してください。これらの値はどこから来ていますか?あなたの行くコードから?ファイル?別のテーブル? – Patrick

+0

@Patrickはちょうどそれを更新しました –

+0

あなたの値の最小/最大を取って、その範囲を照会して、Goコードで必要なレコードだけをフィルタリングしてみてください。 – saarrrr

答えて

0

私は最終的にIDの一時テーブルを作成し、JOIN行きました。これにより、クエリのパフォーマンスが大幅に向上しました。

0

あなたはsqlxは、これらのいずれかを生成させる必要があります。

  • values構文:

    where some_id in (values (143), (123)) 
    
  • は、アレイに参加します:

    select * 
    from 
        t 
        inner join 
        unnest(array[143, 123]) u (id) on u.id = t.id 
    
+0

残念ながら、Redshiftには値のサポートやネスト解除はありません。 –

関連する問題