Я работаю с базой данных tpch и у меня есть запрос, который я хочу оптимизировать для более быстрого выполнения.
Я попытался добавить индексы и представления в запрос, но они не улучшают производительность. Может ли кто-нибудь дать предложения? Спасибо.
Связь:
conn = mysql.connect(host = 'relational.fit.cvut.cz', port = int(3306), user = 'guest', passwd = 'relational', db = 'tpch')
Запрос:
WITH customer_lifetime_value AS (
SELECT
c_custkey,
c_name,
c_address,
c_nationkey,
c_phone,
c_acctbal,
c_mktsegment,
c_comment,
SUM(o_totalprice) AS ltv
FROM customer
JOIN orders
ON o_custkey = c_custkey
GROUP BY 1, 2, 3, 4, 5, 6, 7, 8
)
SELECT
r_name,
MAX(ltv) AS best_customer_value
FROM region
JOIN nation
ON n_regionkey = r_regionkey
JOIN customer_lifetime_value clv
ON clv.c_nationkey = n_nationkey
GROUP BY 1;
Не могли бы вы попробовать это? Он должен считывать меньше данных и давать тот же результат:
WITH customer_lifetime_value AS
(
SELECT o_custkey
,SUM(o_totalprice) AS ltv
FROM orders
GROUP BY o_custkey
)
SELECT
r_name,
MAX(ltv) AS best_customer_value
FROM customer_lifetime_value
JOIN customer
ON o_custkey = c_custkey
JOIN nation
ON c_nationkey = n_nationkey
JOIN region
ON n_regionkey = r_regionkey
GROUP BY r_name
Если это правильно, вы можете создать простые индексы:
Кажется, лучше сделать
GROUP BY r_name
передJOINing
остальными 3 столами??