2017-01-05 4 views
2

У меня проблемы с производительностью, когда я получаю 20k-50k и больше строк от SELECT * FROM table в rows.scan(&a, &b...). Я не знаю, как использовать параллелизм в этом случае, потому что мне нужно использовать rows.Next() для итерации, и я не могу сделать это в параллелизме.Как быстро получить несколько строк в Go?

Производительность падает только тогда, когда я сканирую результаты из строк в поля структуры в rows.Scan.

Запрос занимает 5-15 мс, но сканирование занимает (40 тыс. Строк) 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

Является ли причиной снижения производительности сканирование в Голанге? Это не зависит от БД? Если я использую 'OFFSET' для расщепления запроса, это послужило бы причиной падения? – arzonus

+0

@arzonus Он варьируется от случая к случаю, вам нужно сравнить вашу конкретную настройку, чтобы получить окончательный ответ на это. И в отношении использования 'OFFSET', если вас беспокоит одновременная запись, вы можете выполнять инструкции в транзакции. –

Смежные вопросы