View не увеличивает производительность коррелированного подзапроса?

У меня есть таблица User и таблица Order, теперь я хочу найти имена пользователей, которые сделали более 100 заказов, я могу сделать запрос, как показано ниже:

SELECT U.name
FROM User U
WHERE 100 < (
SELECT COUNT(*) FROM Orders O
WHERE O.uid=U.uid
)

Это медленно из-за коррелированного подзапроса.

Поэтому я думаю, что могу оптимизировать его, создав представление, которое содержит количество заказов, сделанных каждым пользователем, как показано ниже.

View UserOrderCount

uid    orderCount
0       11
1       108
2       100
3       99
4       32
5       67

Тогда запрос намного проще:

SELECT U.name
FROM User U, UserOrderCount C
WHERE 100 < C.orderCount And U.uid=C.cid;

Но оказалось, что это займет больше времени, я не могу понять, почему... Пожалуйста, пролите немного света на это, заранее спасибо!

РЕДАКТИРОВАТЬ:

Вот как создается вид:

CREATE VIEW UserOrderCount
AS
select U.uid, count(*) AS orderCount
from User U, orders O
group by U.uid;

2 ответа

Ожидалось, что создание представления сделает это быстрее. Тот же объем работы еще предстоит сделать за кулисами. Представление просто упрощает просмотр текста вашего запроса; это не упрощает выполнение. (Но учтите, что вы используете два разных запроса: один - подзапрос, а другой - соединение. Это ортогонально использованию представления: вы могли бы использовать представление в подзапросе или объединение без мнение. Смешивание этих двух вещей может вызвать путаницу.)

С Материализованными представлениями, впервые появившимися в 9.3, он фактически будет хранить вычисленные результаты подсчета, поэтому выполнение будет быстрее. Но цена, которую вы платите за это, заключается в том, что вам нужно будет периодически обновлять материализованное представление, а в это время вы будете использовать устаревшие подсчеты.

SELECT U.name,count(*)
FROM User U
JOIN Orders o on o.uid=u.uid
WHERE COUNT(*) > 100
GROUP BY U.NAME

Вам не нужно представление для этого...

Другие вопросы по тегам