PostgreSQL, где предложение не сбрасывается при использовании группирования - PullRequest
0 голосов
/ 30 октября 2018
SELECT *
FROM (
    SELECT SUM(quantity) AS quantity,
        product_location_id,
        location_bin_id,
        product_lot_id,
        product_serial_id,
        CASE
            WHEN GROUPING (product_location_id, location_bin_id, product_lot_id, product_serial_id) = 0 AND product_serial_id IS NOT NULL THEN
                'Serial'
            WHEN GROUPING (product_location_id, location_bin_id, product_lot_id, product_serial_id) = 0 THEN
                'Lot'
            ELSE
                'Quantity'
        END AS pick_by
    FROM product_location_bins
    WHERE status != 'Void'
        AND has_quantity = 'Yes'
    GROUP BY GROUPING SETS (
        (product_location_id, location_bin_id, product_lot_id, product_serial_id),
        (product_location_id, location_bin_id)
      )
    HAVING SUM(quantity) > 0
) x
WHERE x.product_serial_id = 5643

У меня есть запрос выше. Использование обычного GROUP BY postgres может «вытолкнуть» внешнее предложение where и использовать индекс для product_serial_id. Когда я использую наборы группировки, это невозможно. Он разрешает весь внутренний запрос, а затем фильтрует результаты. Мне интересно, почему это так. Это ограничение для группировок?

1 Ответ

0 голосов
/ 30 октября 2018

Ваш запрос нечетный. Ваше внешнее предложение where исключает второй набор результатов из grouping sets, потому что product_serial_id будет NULL для второго набора. Это отфильтровывается во внешнем where.

Я думаю, вы хотите что-то вроде этого для внешнего запроса:

WHERE x.product_serial_id = 5643 OR x.product_serial_id IS NULL

Я полагаю, что Postgres мог бы добавить оптимизации для плохо написанного кода, то есть исключить работу для второго набора grouping sets, поскольку он отфильтровывается внешним where. Однако это обычно не является целью оптимизации.

...