2015-05-08 3 views
3

Я ищу обновление для партии, когда все задания для этой партии завершены. Для этого я хочу сравнить общее количество рабочих мест и общее количество выполненных работ. Я делаю это с помощью запроса ниже, однако это довольно медленный запрос. Любые предложения по улучшению этого? Или альтернативные способы приблизиться к основному обновлению? Индекс только на JobID (PK)Подсчет итоговых записей по сравнению с статусом

SELECT DISTINCT j.BatchId, 
    j.JobStatusId, 
    COUNT(j.BatchId) OVER(PARTITION BY j.BatchID, j.JobStatusID), 
    COUNT(j.BatchId) OVER(PARTITION BY j.BatchID) 
FROM [Job] j 
ORDER BY j.BatchID 

Explain Plan

+0

Какие индексы у вас есть на столе? Также как выглядит план выполнения? –

+0

Сортировка занимает почти 65%. При обновлении вам не нужно упорядочивать и отличать. Таким образом, восстановление обоих является первым шагом. –

+3

«Для этого я хочу сравнить общее количество заданий и общее количество завершенных». Зачем? Почему бы просто не запросить то, что вам нужно: партии, у которых нет неполных заданий? Кажется, пустая трата времени считать все. –

ответ

1

< < < < ЭТО НЕ ПРОВЕРЕНО >>>>

Предполагая, что JobStatusId описывает положение так:

0 = completed 
1 = running 
2 = error 

Вы можете попробовать эти два запроса, не знаете, какой из них быстрее й дать ему попробовать:

SELECT DISTINCT j.BatchId AS CompletedJobs 
FROM Job j 
WHERE NOT EXISTS(--running jobs or jobs who ran into an error 
      SELECT TOP 1 1 
      FROM Job j2 
      WHERE j2.BatchId = j.BatchId 
        AND j2.JobStatusId IN (1,2)) 

ИЛИ это:

SELECT DISTINCT j.BatchId AS CompletedJobs 
FROM Job j 
     LEFT JOIN 
      --running jobs or jobs who ran into an error: 
      (SELECT j2.BatchId 
      FROM Job j2 
      WHERE j2.JobStatusId IN (1,2)) j2 ON j.BatchId = j2.BatchId 
WHERE j2.BatchId IS NULL 

Ваш исходный запрос должен заказать лот (который заканчивается в плохой производительности большую часть времени. Работая с базами данных в последние годы, я показал: заказ требуется только в 2% запросов, где я увидел предложение «заказ». Может быть, даже в 1% ;-)

DISTINCT, ORDER BY, COUNT OVER PARTITION, ... никогда не будет быстрой операцией - если вы их объедините, вы увидите, что результат.

+0

Я собираюсь дать вам ответ. Это в значительной степени то, чем я закончил. В тот день у меня был действительно сумасшедший день. – puc

+0

спасибо, я знаю такие дни ... – CeOnSql

Смежные вопросы