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