日期:2014-05-17  浏览次数:20403 次

同样一个查询2008比2000慢3倍以上啊???
按理应该是2008比2000快才对的啊,而且2008还是X64的,有代码有真相

exec('select *
,(select top 1 ERP_OrderList.SalePrice from ERP_Order with(nolock) inner join ERP_OrderList with(nolock) on ERP_Order.OrderID=ERP_OrderList.OrderID where ERP_Order.FunctionID=228 and ERP_Order.OrderOddNumber=TempTable.WareStockFree1 and ERP_OrderList.WareID=TempTable.WareID and ERP_OrderList.OrderListFree4=TempTable.CheckOddNumber) as 销售单价

from TempTable where isnull(EndStockNumber,0)<>0')



说明一下各表索引情况:
ERP_Order表ERP_Order.OrderID为主键,ERP_Order.FunctionID+ERP_Order.OrderOddNumber建立了唯一索引
ERP_OrderList表ERP_OrderList.OrderID建立了独立一般索引,ERP_OrderList.WareID+ERP_OrderList.OrderListFree4建立了一般索引
TempTable为临时表,没有任何索引

各表数据量:
TempTable         1万
ERP_Order        10万
ERP_OrderList   200万

在2000该查询耗时20秒内,在15秒左右波动,但升级到2008 X64后,同样一台机里面,数据库一样,耗时却升到60秒以上,谁能解析一下啊,怎么优化一下该查询了,发现2008在索引利用方面反而倒退了,很多查询在2000运行的很好的,升级后就变得很慢了,索引是一样的,非得针对2008优化改动一下索引才勉强和2000差不多,但这个查询不管我怎么建索引,时间就是比2000高3倍以上

------解决方案--------------------
这个 SQL 有毛病,TOP 1 没有 ORDER BY,不如用 max 试试