2011-11-16 74 views
0

我有一個表(汽車),從而節省一些特性的汽車像EngineNo,LastProductionStepId,NodyNo,...Tsql:用特定條件檢索某些記錄的最佳方法是什麼?

再說,我有另一個表(CarSteps)從而節省了所有步驟,一個特定的汽車應當在其生產過程中經過(Id = 2),雕刻(3),PrePaint(4),油漆(5),AfterPaint(6),確認​​(7),交貨(8)

我希望所有汽車這是預製和確認之間目前

select cr.Id, cr.BodyNo, cr.LastStepId 
from  Cars cr WITH (NOLOCK) 
inner join CarSteps steps WITH (NOLOCK) on cr.Id = trace.CarId and cr.LastStepId=trace.StepId 
where  
    cr.LastStepId >= 4 
    AND cr.[Status] = 1 
    AND steps.[Status] = 1 
    AND not exists ( select * 
      from CarSteps steps1 WITH (NOLOCK) 
      where steps1.CarId = cr.Id 
       AND steps1.StepId >= 7         AND steps1.Status = 1 
      ) 

因爲CarSteps有很多記錄(44百萬),查詢速度很慢。 您的意見是什麼?有沒有更好的方法來獲得這些汽車?

+0

您可以使用內部聯接測試「完成」步驟,但使用子查詢測試「未來步驟」。你有沒有嘗試做兩個測試作爲子查詢(它應該能夠使用CarSteps表索引更快的搜索)?此外,我建議在SQL Server Management Studio中使用查詢分析器來確定查詢的哪個部分最有效。 –

+0

你不能使用'cr.LastStepId在4和7'之間嗎?如果您在LastStepId中擁有當前的StepId,則無需查看「CarSteps」。 –

+0

需要在汽車上看到PK。我的直覺是,你不是在第三種正常形式,這是造成問題。看起來你正試圖在同一張表中使用汽車表格軌跡歷史和當前狀態,這並不好。歷史是多值的,當前狀態是單值。 – Paparazzi

回答

0

查看你的查詢我看到一個從Cars到CarSteps的連接,我看到你加入到trace.CarId和trace.StepId是。跟蹤未在您的查詢中定義。

from  
Cars cr WITH (NOLOCK) inner join 
CarSteps steps WITH (NOLOCK) on 
    cr.Id = trace.CarId and  
    cr.LastStepId=trace.StepId 

如果我能更好地理解完全查詢,我可以提供幫助。 執行計劃揭示了什麼?

相關問題