Tsql: как лучше всего получить некоторые записи с определенными критериями?

У меня есть таблица (Cars), в которой сохраняются некоторые характеристики автомобиля, такие как EngineNo, LastProductionStepId, NodyNo,...

Кроме того, у меня есть еще одна таблица (CarSteps), в которой сохраняются все этапы, которые должен пройти конкретный автомобиль в процессе производства, такие как назначение двигателя (Id = 2), гравировка (3), предварительная покраска (4), покраска (5), послепокраска (6). ), Подтверждение(7), Доставка(8)

Я хотел бы получить все автомобили, находящиеся между PrePaint и Confirmation на данный момент:

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 миллиона), запрос выполняется медленно. Каково твое мнение? есть ли лучший способ получить эти автомобили?


person odiseh    schedule 16.11.2011    source источник
comment
Вы проверяете сделанные шаги с помощью внутреннего соединения, а затем для будущих шагов с подзапросом. Пробовали ли вы выполнять оба теста в качестве подзапроса (который должен использовать индексы таблиц CarSteps для более быстрого поиска)? Кроме того, я бы рекомендовал использовать профилировщик запросов в SQL Server Management Studio, чтобы определить, какая часть запроса требует наибольшей работы.   -  person Miika L.    schedule 16.11.2011
comment
Вы не можете использовать cr.LastStepId between 4 and 7? Нет необходимости искать в CarSteps, если у вас есть текущий StepId в LastStepId.   -  person Mikael Eriksson    schedule 16.11.2011
comment
Нужно увидеть ПК на Тачках. Я чувствую, что вы не в 3-й нормальной форме, и это вызывает проблемы. Похоже, вы пытаетесь использовать историю отслеживания таблицы автомобилей и текущий статус в одной таблице, и это нехорошо. История многозначна, а текущий статус однозначен.   -  person paparazzo    schedule 13.12.2011


Ответы (1)


Глядя на ваш запрос, я вижу присоединение от 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

Я мог бы помочь, если бы лучше понял запрос. Что показывает план выполнения?

person Amir Aliabadi    schedule 13.12.2011