本帖最后由 jet_huang1031 于 2012-10-10 16:04:04 编辑

解决方案 »

  1.   

    帮你整理一下格式:SELECT  ROW_NUMBER() OVER ( ORDER BY mes_wi.AutoID DESC ) AS rownum ,
            mes_wi.AutoID ,
            b_pd.CustomerID ,
            c.CustomerName ,
            cwo.ProductID ,
            b_pd.ProductName ,
            cwo.FabDevice ,
            cwo.Org ,
            cwo.WaferLot ,
            cwo.TargetDevice ,
            cwo.IsTax ,
            cwo.IsReturn ,
            mes_wo.Plan_StartTime ,
            cwo.WONumber ,
            cpo.Cust_PO ,
            mes_wi.IsArrived ,
            mes_wi.ArrivedTime ,
            mes_wi.CartonNo ,
            mes_wi.IsIQC ,
            mes_wi.IQCTime ,
            mes_wi.IsWIP ,
            mes_wi.WIPTime ,
            mes_wi.IsOutStock ,
            mes_wi.OutStockTime ,
            cwo.TradeType ,
            mes_wi.IsFGIN ,
            mes_wi.FGINTime ,
            mes_wi.IsScrap ,
            mes_wi.ScrapTime ,
            mes_wo_wi.WorkorderID ,
            mes_wi.IsPKG ,
            mes_wi.PKGTime ,
            mes_wi.IsShipping ,
            mes_wi.ShippingTime ,
            mes_wi.DieQty ,
            mes_wi.WaferNo ,
            mes_wo.WlcspLot ,
            mes_wi.Yield ,
            mes_wi.LMContext ,
            b_pd1.ProductName AS WO_ProductName ,
            mes_wi.GoodDie ,
            mes_wi.BadDie ,
            DATEDIFF(Day, ( SELECT  DATEADD(Hour, 8, mes_wop.OutTime) AS OutTime
                            FROM    MES_WorkorderProcess mes_wop
                            WHERE   mes_wop.WorkorderID = mes_wo_wi.WorkorderID
                                    AND mes_wop.Sequence = 1
                                    AND mes_wop.Deleted = 0
                          ), mes_wi.FGINTime) AS ProcessCT
    FROM    MES_WaferInfo mes_wi
            LEFT OUTER JOIN Customer_WO cwo ON cwo.AutoID = mes_wi.CustomerWOID
            LEFT OUTER JOIN Customer_PO cpo ON cpo.AutoID = cwo.CustomerPOID
            LEFT OUTER JOIN Base_Product b_pd ON b_pd.AutoID = cwo.ProductID
            LEFT OUTER JOIN Customer c ON c.AutoID = b_pd.CustomerID
            LEFT OUTER JOIN MES_Workorder_WaferInfo mes_wo_wi ON mes_wo_wi.WaferInfoID = mes_wi.AutoID
                                                                 AND mes_wo_wi.Deleted <> 1
            LEFT OUTER JOIN MES_WorkOrder mes_wo ON mes_wo.AutoID = mes_wo_wi.WorkorderID
            LEFT OUTER JOIN Base_Product b_pd1 ON b_pd1.AutoID = mes_wo.ProductID
    WHERE   mes_wi.Deleted = 0
            AND cwo.Deleted = 0
            AND cwo.WaferLot = 'H7F256'
      

  2.   

    粗略看了下Datediff(Day,(select dateadd(Hour,8,mes_wop.OutTime) as OutTime from MES_WorkorderProcess mes_wop where mes_wop.WorkorderID=mes_wo_wi.WorkorderID and mes_wop.Sequence=1 and mes_wop.Deleted=0),mes_wi.FGINTime) as ProcessCT这段代码可以修改下,如果数据量大,可以存放到临时表,如果数据量小,可以使用表变量。不要在查询中这种使用。
      

  3.   

    如果有可能,and mes_wo_wi.Deleted<>1 尽量不要在SQL代码中使用“<>”
      

  4.   

    总体来说:表关联太多,where条件太少,筛选数据的能力有限,并且有可能没有用到索引,导致存在表扫描等操作。
      

  5.   

    筛选条件很多的,只是我只选择了AND cwo.WaferLot = 'H7F256' 这个条件关联表是蛮多的可是我不知道怎么解决关联表多,难道表表字段增加以减少表数量?
      

  6.   

    关联表其实也不是你的语句错,是设计的问题,不过看来是改不了的拉,但是where条件要足够的强,就拿这个来说:WHERE   mes_wi.Deleted = 0        AND cwo.Deleted = 0        AND cwo.WaferLot = 'H7F256'
    如果mes_wi.Deleted = 0一下子把数据从10万降到1万,而AND cwo.Deleted = 0 可以从10万降到100,那where就应该这样写:WHERE  cwo.Deleted = 0 AND mes_wi.Deleted = 0         AND cwo.WaferLot = 'H7F256'
    这里只是一个例子
      

  7.   

    我在MES_WorkorderProcess表中增加了一个mes_wop.WorkorderID的索引,速度提高到2秒了看来还是索引问题啊
      

  8.   

    这个语句不能改成用exists,因为下面关联的表都有字段在select子句中,你的数据才80万条,虽然关联了多个表,但修改之后运行也要2秒,还是比较慢的,等数据量再大可以用临时表。可以考虑建立如下的索引:create index idx_MES_WaferInfo_Deleted on MES_WaferInfo(Deleted,CustomerWOID,AutoID) include(select中的其他字段)create index idx_Customer_WO_Deleted_WaferLot on Customer_WO(Deleted,WaferLot,AutoID,CustomerPOID,ProductID) include(select中的其他字段)