我的尝试是加入客户和订单表并加入lineitem和订单表。我还索引了c_mktsegment字段。我的结果是这个。有什么我可以做的改进吗?
select
o_shippriority,
l_orderkey,
o_orderdate,
sum(l_extendedprice * (1 - l_discount)) as revenue
from
cust As c
join ord As o on c.c_custkey = o.o_custkey
join line As l on o.o_orderkey = l.l_orderkey
where
c_mktsegment = ':1'
and o_orderdate < date ':2'
and l_shipdate > date ':2'
group by
l_orderkey,
o_orderdate,
o_shippriority
order by
revenue desc,
o_orderdate;
答案 0 :(得分:2)
我没有看到任何明显错误的查询。为了获得良好的性能,您可能应该在orders.o_custkey和lineitem.l_orderkey上有索引。 c_mktsegment上的索引将让DB快速查找客户记录,但从那里您需要能够找到订单和lineitem记录。
您应该执行解释以查看数据库如何处理查询。这取决于许多因素,包括每个表中的记录数和密钥分布,所以我不能通过查看查询来说出计划是什么。但是如果你运行Explain并看到它正在对表进行完整文件读取,那么你应该添加一个索引来防止这种情况发生。对于查询优化而言,这几乎就是规则#1。