2017-01-05 4 views
2

私が20k-50kを取得し、SELECT * FROM tableより多くの行がrows.scan(&a, &b...)に入ると、パフォーマンスに問題があります。この場合、並行処理を使用する方法はわかりません。なぜなら、反復処理にはrows.Next()を使用する必要があります。同時実行はできません。Goで複数の行を高速化するにはどうすればよいですか?

行の構造体のフィールドの結果をrows.Scanにスキャンすると、パフォーマンスが低下します。

クエリには5〜15ミリ秒かかるが、スキャンには(40k行)800〜2000ミリ秒かかる。

ありがとうございました!

+0

mysqlまたはpostgresql?私の場合は – GurV

+0

がpostgresqlです。しかし、私はそれがデータベースに依存しないと思う。 – arzonus

+0

テーブルスキーマも同様に投稿してください。 – Rahul

答えて

1

'rows.Next()'はシーケンシャルなので、クエリを複数のステートメントに分割してから同時に処理する必要があります。あなたのユースケースに基づいて必要な、など

func main() { 

    queries := []string{ 
     "SELECT * FROM abc where a < 10000", 
     "SELECT * FROM abc where a >= 10000 && a <= 30000", 
     "SELECT * FROM abc where a > 30000", 
    } 

    for _, query := range queries { 
     go dbCall(query) 
    } 
} 

func dbCall(query string) { 

    rows, _ := db.Query(query) 
    for rows.Next() { 
     var a, b, c int 
     _ = rows.Scan(&a, &b, &c) 
     // Process row 
    } 
} 

使用チャネル、ロック、。

+0

Golangでパフォーマンスが低下しますか?それはDBに依存しない?クエリを分割するために 'OFFSET'を使用すると、それは落ちる原因になりますか? – arzonus

+0

@ arzonusケースごとに異なるので、特定の設定をベンチマークして決定的な答えを得る必要があります。 'OFFSET'の使用に関しては、並行書き込みが心配な場合は、トランザクション内の文を実行することができます。 –

関連する問題