table products
id primary_key
table transactions
product_id foreign_key references products
Приведенный ниже SQL-запрос выполняется очень медленно:
SELECT products.*
FROM products
LEFT JOIN transactions
ON ( products.id = transactions.product_id )
WHERE transactions.product_id IS NULL;
Из 100 сотен миллионов записей продуктов может быть только 100 записей, в которых у продукта нет соответствующих транзакций.
Этот запрос очень медленный, поскольку я подозреваю, что он выполняет полное сканирование таблицы, чтобы найти эти нулевые записи продукта внешнего ключа.
Я хочу создать частичный индекс следующим образом:
CREATE INDEX products_with_no_transactions_index
ON (Left JOIN TABLE
BETWEEN products AND transactions)
WHERE transactions.product_id IS NULL;
Возможно ли вышеизложенное и как мне это сделать?
Примечание. Некоторые характеристики этого набора данных:
Транзакции никогда не удаляются, а только добавляются.
Продукты никогда не удаляются, а добавляются со скоростью 100 секунд в минуту (очевидно, это вымышленный пример, стоящий за гораздо более сложным реальным вариантом использования). Небольшое количество временно осиротевших
Мне нужно часто запрашивать (до одного раза в минуту) и всегда знать, каков текущий набор потерянных продуктов.
The below SQL Query is very slow:
не факт. Не обошлось без плана запроса + настройки + popcount таблиц. Бросание материализованных представлений только еще больше запутает вас, ИМХО. - person wildplasser   schedule 02.01.2014