当我在select子句中使用整数列时,为什么选择查询会减慢速度

时间:2010-07-30 08:32:27

标签: sql-server-2000

我正在尝试在SQL Server 2000中优化以下查询。除了包含200万条记录的Prod_Lot_Stage_Wise_Detl表外,每个表都有超过300 000行。

当我在下面执行查询时,不包括LotStgWs.Finished_Pcs字段(属于Prod_Lot_Stage_Wise_Detl表),结果在20秒内完成。

但是,如果我包含LotStgWs.Finished_Pcs字段,则执行时间超过2分钟。我不明白这里出了什么问题以及SQL Server 2000如何处理整数字段。为每个表正确定义了索引。

SELECT 
 JangRecv.Jangad_Ref_Code,         
 LotRecv.Total_Pcs Org_Pcs,      
 LotRecv.Total_Cts Org_Cts,
 LotStgWs.Finished_Pcs,
        (Isnull(ReEst.Exp_Wt,LotRecv.Exp_Yield)) Exp_Yield
 FROM 
 Prod_Jangad_Receive_Tran  JangRecv With(NoLock) Inner Join 
 Prod_Lot_receive_Tran   LotRecv  With(NoLock) On      (JangRecv.Jangad_Seq_No = LotRecv.Jangad_Seq_No) Inner Join
 Prod_Lot_Stage_Wise_Detl  LotStgWs With(NoLock) On (
          LotStgWs.Jangad_Seq_No = LotRecv.Jangad_Seq_No  And 
          LotStgWs.Lot_Seq_No = LotRecv.Lot_Seq_No   And
          LotStgWs.Stage_Seq_No  = ISNULL(
                     (SELECT  MAX(Delv_Stage_Seq_No) 
               FROM  Prod_Lot_Delivery_Tran      
               WHERE  Jangad_Seq_No = JangRecv.Jangad_Seq_No
               ), JangRecv.Exp_Delv_Stage_Seq_No
              )
             ) Left Outer Join
 PPCS_QMA_Diamond_RE_Estimation  ReEst    With(NoLock) On (LotStgWs.Jangad_Seq_No = ReEst.Jangad_Seq_No And LotStgWs.Lot_Seq_No = ReEst.Lot_Seq_No And LotStgWs.Stage_Seq_No = ReEst.Stage_Seq_No)
Where 
 LotRecv.Lot_Recv_Div_Seq_No = 1
ORDER BY  JangRecv.Jangad_Ref_Code, LotRecv.Lot_Num_Alias

3 个答案:

答案 0 :(得分:0)

确保您加入的所有内容都有索引,尤其是在该大表上。 差异是不重要的:在非索引列上搜索(或加入)需要全表扫描,这是线性复杂的(即,对于200万条记录,您需要执行200万次最坏情况的比较)。在索引列上,数据库引擎可以使用具有对数复杂度的二进制搜索(即,对于200万条记录,您需要进行21次最坏情况的比较)。

答案 1 :(得分:0)

如果我正确理解了问题,那么你在查询中唯一要改变的就是选择LotStgWs.Finished_Pcs ......如果这是正确的我之前在SQL Server 2000中遇到过类似的问题...扔掉一个LotStgWs.Finished_Pcs上的索引。这之前对我有用。它似乎没有多大意义,但它的工作原理。祝你好运

答案 2 :(得分:0)

您还可以尝试重建索引:http://www.sql-server-performance.com/tips/rebuilding_indexes_p1.aspx

但无论如何,如果我是你,我会尝试改进我的数据库结构,因为在加入那些大表时使用这种复杂的子选择并不是一个好的技术。