create table Customers
(
CustomerID int,
Cite varchar(20)
)
insert into Customers(CustomerID,Cite)
values (1,'Shanghai')
insert into Customers(CustomerID,Cite)
values (2,'Beijing')
create table Orders
(
CustomerID int,
OrderID int
)
insert into Orders(CustomerID,OrderID)
values(1,11)
insert into Orders(CustomerID,OrderID)
values(1,12)
insert into Orders(CustomerID,OrderID)
values(2,13)
这2个表数据很简单:
A表有客户1,所在cite="Shanghai",客户2,所在Cite="Beijing"。
B表有客户1的OrderID=11,12两条订单数据,有客户2的OrderID=13的订单数据。
我们根据上面的数据写如下Sql语句,再看下执行计划。
select c.CustomerID,COUNT(o.OrderID) as numOrders
from Customers as C
left join Orders as O
on C.CustomerID=O.CustomerID
where C.Cite='Shanghai'
Group by C.CustomerID
having COUNT(o.OrderID)>=2
数据流的顺序如下图。
1.表扫描花费18%的开销,然后Sort花费63%的开销。
那我们在来看下,整个sql语句消耗多长时间。0.017s
我们给客户表和订单表建上聚集索引。
create clustered index pk_Customer on Customers(CustomerID)
create clustered index pk_Customer_Order on Orders(CustomerID,OrderID)
然后再执行上面的Sql语句,得到下面的执行计划。