-1

我的尝试是加入 customer 和 order 表,并加入 lineitem 和 order 表。我还索引了 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;
4

1 回答 1

2

我看不出这个查询有什么明显错误。为了获得良好的性能,您可能应该在 orders.o_custkey 和 lineitem.l_orderkey 上有索引。c_mktsegment 上的索引可以让数据库快速找到客户记录,但您需要能够从那里找到订单和订单项记录。

您应该进行解释以查看数据库如何处理查询。这取决于很多因素,包括每个表中的记录数和键的分布,所以我不能仅仅通过查看查询来说明计划是什么。但是,如果您运行 Explain 并看到它正在对表进行全文件读取,则应该添加一个索引来防止这种情况发生。这几乎是查询优化的第一条规则。

于 2012-05-04T14:49:00.887 回答