Подтвердить что ты не робот

Оптимизация сгенерированного SQL-запроса Slick

У меня очень простой запрос, который в SQL может быть представлен следующим образом:

SELECT
  c.id,
  count(cp.product_id)
FROM cart c LEFT OUTER JOIN cart_product cp ON c.id = cp.cart_id
WHERE c.id = 3
GROUP BY c.id;

Я был очень удивлен при использовании Slick DSL для представления выше запроса, запрос, созданный из следующего DSL:

Cart.joinLeft(CartProduct)
  .on { case (c, cp) => c.id === cp.cartId }
  .filter { case (c, cp) => c.id === 3 }
  .groupBy { case (c, cp) => c.id }
  .map { case (c, pr) => (c, pr.length)
}

Посмотрел:

SELECT
  x2.x3,
  count(1)
FROM (SELECT
        x4.x5  AS x3,
        x4.x6  AS x7,
        x8.x9  AS x10,
        x8.x11 AS x12,
        x8.x13 AS x14,
        x8.x15 AS x16
      FROM (SELECT
              x17."id"      AS x5,
              x17."user_id" AS x6
            FROM "cart" x17) x4 LEFT OUTER JOIN (SELECT
                                                   1                AS x9,
                                                   x18."id"         AS x11,
                                                   x18."cart_id"    AS x13,
                                                   x18."product_id" AS x15
                                                 FROM "cart_product" x18) x8 ON x4.x5 = x8.x13) x2
WHERE x2.x3 = 3
GROUP BY x2.x3;

Что я делаю неправильно? Нормально ли видеть такие вложенные запросы? Какой смысл использовать Slick DSL, если сложность запроса растет так быстро? Возможно, я мог бы написать родной SQL, но мне очень понравился Slick DSL. Каковы методы оптимизации Slick запросов?

4b9b3361

Ответ 1

Поскольку вы написали, что используете PostgreSQL, я бы не стал беспокоиться, так как PostgreSQL известен действительно хорошим оптимизатором запросов. Такое простое преобразование является легким, ему не требуется никакого дополнительного времени. Единственное, что вы ждете, проблема в конечном итоге будет исправлена ​​вверх по течению (где-то около Slick версии 3.1), и вам не нужно ничего делать.

p.s.: Почему вы не просто используете этот запрос? Он должен возвращать точно такой же результат, если у вас есть внешнее ограничение для таблиц:

SELECT id, COUNT(*) FROM cart_product WHERE id=3