Во-первых, любой вопрос о производительности необходимо проверить на ваших данных и в вашей среде.
Во-вторых, номер строки должен присвоить значение всем строкам. Он должен использовать индекс, если он доступен, поэтому он должен иметь разумную производительность.
Производительность по таким запросам непростая, если учесть крайности:
- Одна линейка продуктов на всю таблица, поэтому результирующий набор состоит из трех строк.
- Другая линейка продуктов в каждой строке, поэтому остальным набором является вся таблица.
Однако с правильными индексами он Возможно, что коррелированный подзапрос будет быстрее при многих разумных условиях - особенно при относительно небольшом количестве продуктовых линий:
SELECT p.*
FROM products p
WHERE p.quantityInStock <= (SELECT p2.quantityInStock
FROM products p2
WHERE p2.productline = p.productline
ORDER BY p2.quantityInStock DESC
LIMIT 1 OFFSET 2
);
Правильный индекс находится на products(productline, quantityInStock desc)
.
Примечание. Вышеизложенное предполагает, что каждая «продуктовая линейка» включает как минимум три продукта. Также предполагается, что количества уникальны, поэтому в вашем запросе он больше похож на rank()
, чем на row_number()
. Обе эти проблемы можно решить.