
一般优化器如上图处理,可是我做的测试结果并不如意,见下图

请问原因所在何处,慧眼请赐教
------解决方案--------------------
你用源表试过没?不同的表统计信息、索引、碎片、存储等都有可能不一样,优化器当然不会当源表一样
------解决方案--------------------
即使是源表,不同版本的SQL Server、Nothwind都有可能影响结果
------解决方案--------------------
try this,
drop index dbo.MyOrders.oid;
create clustered index oid on dbo.MyOrders(OrderID);
drop index dbo.MyOrderDetails.pkoid;
create clustered index pkoid on dbo.MyOrderDetails(OrderID);
select o.OrderID,o.OrderDate,od.ProductID,od.Quantity
from dbo.MyOrders as o
inner join dbo.MyOrderDetails as od on o.OrderID=od.OrderID;
order by o.OrderID
------解决方案--------------------
试试这个,看执行计划是否有变.
drop index dbo.MyOrders.oid;
create clustered index oid on dbo.MyOrders(OrderID);
drop index dbo.MyOrderDetails.pkoid;
create clustered index pkoid on dbo.MyOrderDetails(OrderID);
select o.OrderID,o.OrderDate,od.ProductID,od.Quantity
from dbo.MyOrders as o
inner join dbo.MyOrderDetails as od on o.OrderID=od.OrderID
order by o.OrderID
------解决方案--------------------
主表和子表都是聚集表没错,索引都是聚集索引扫描,关键是聚集索引所在的列,不是关联两张表的列
我是SqlServer2012的
select * from [Purchasing].[PurchaseOrderHeader]
聚集索引在PurchaseOrderID
select * from [Purchasing].[PurchaseOrderDetail]
聚集索引在PurchaseOrderDetailID
------解决方案--------------------
merge join的条件是在关联字段上排序的,这里在关联字段上并不是排序的(聚集索引列不一样)
------解决方案--------------------
主键默认是聚集索引
------解决方案--------------------
如果你没有指定聚集索引列,那么主键默认为聚集索引