当前位置: 代码迷 >> Sql Server >> 有关查询优化器的有关问题想不通,求解惑
  详细解决方案

有关查询优化器的有关问题想不通,求解惑

热度:70   发布时间:2016-04-24 10:32:21.0
有关查询优化器的问题想不通,求解惑

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

请问原因所在何处,慧眼请赐教

------解决方案--------------------
你用源表试过没?不同的表统计信息、索引、碎片、存储等都有可能不一样,优化器当然不会当源表一样
------解决方案--------------------
即使是源表,不同版本的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的条件是在关联字段上排序的,这里在关联字段上并不是排序的(聚集索引列不一样)
------解决方案--------------------
主键默认是聚集索引
------解决方案--------------------
如果你没有指定聚集索引列,那么主键默认为聚集索引
  相关解决方案