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
Вам не нужно представление для этого...