我有以下查询来检索在特定日期之前未发货的前10个订单:
select top 10 *
from
(
select
o_orderkey,
o_shippriority,
o_orderdate,
sum(l_extendedprice * (1-l_discount)) over (partition by l.l_orderkey,l.l_partkey,l.l_suppkey ) as potential_revenue
from
lineitem l
inner join
neworders o
on l.l_orderkey=o.o_orderkey
where
l.l_shipdate > '2014-08-05'
and o_orderstatus ='O'
) A
order by potential_revenue desc;
Lineitem有60M记录,订单有15M记录。
l_shipdate
和l_orderkey
是在date
上分区的聚簇索引,o_orderkey
是orders table
的聚簇索引。我还在o-orderstatus
列上创建了一个非聚集索引。该查询需要11秒才能运行,我想知道还可以采取哪些措施来提高查询性能?
答案 0 :(得分:0)
尝试这些索引。
CREATE NONCLUSTERED INDEX Ix_neworders ON neworders (o_orderstatus) INCLUDE (o_orderdate, o_shippriority);
CREATE NONCLUSTERED INDEX Ix_lineitem ON lineitem (l_extendedprice)
INCLUDE (l_discount, l_partkey,l_suppkey );
无论如何TOP是昂贵的操作。 当您查看解释计划时,请查看关键查找。 如果你有它们,那么尝试创建正确的索引+注意索引扫描。 尝试使用索引进行索引搜索。