Какие имеются варианты для оптимизации функции, в которой 5 тысяч раз отправляется запрос в БД
Имеется функция, в теле которой происходит такая вот магия:
rows, err = Select(RT)
if err != nil {
logger.Errors.Println("Select: %v", err)
return
}
defer redispk.CloseStream(rows)
for rows.Next() {
var pol ProductOrderList
err = rows.Scan(&pol.PointHash, &pol.ProductHash, &pol.PriceID)
if err != nil {
logger.Errors.Println("Scan: %v", err)
return
}
var elements *sql.Rows
elements, err = postgresql.Requests.QueryLocal("Select.ProductOrder.Price_id2", pol.PriceID, pol.PointHash)
if err != nil {
logger.Errors.Println("Query (Select.ProductOrder.Price_id2) pol.PriceID=%v, pol.PointHash=%s: %v", pol.PriceID, pol.PointHash, err)
return
}
defer elements.Close()
for elements.Next() {
var PO ProductOrder
err = elements.Scan(
&PO.Price_id,
&PO.PriceName,
&PO.Type_id,
&PO.TypeName,
&PO.Parent_id,
&PO.ParentName,
)
if err != nil {
logger.Errors.Println("Scan (Select.ProductOrder.Price_id2): %v", err)
return
}
pol.OrderList = append(pol.OrderList, PO)
}
result = append(result, pol)
}
в цикле верхнего уровня будет около 5 тысяч итераций, следовательно запрос Select.ProductOrder.Price_id2 тоже будет выполняться 5 тысяч раз, а он очень большой и сложный, как можно оптимизировать данную функцию, либо запрос?
Запрос первого селекта выглядит вот так и 5к записей возвращается, если параметры пустые:
SELECT ppa.point_hash, ppa.product_hash, pp."Price_id"
FROM product_price_active ppa
INNER JOIN "ParametersPrice" pp ON pp."ProductHash" = ppa.product_hash
WHERE (ppa.point_hash = $1 OR $1 = '') AND
(pp."Price_id" = $2 OR $2 = 0)
и возвращает вот такие данные:
