2016-11-08 4 views
0

У меня есть вопрос с точки зрения обработки и повышения эффективности запроса при сохранении его точности. Прежде чем отобразить запрос, я хотел бы указать на некоторые его основы.Уменьшить время выполнения SQL-запроса

У меня есть случай, который манипулирует where -clause, чтобы получить все дочерние элементы родителя. В основном у меня есть два типа данных, которые мне нужно отображать; красный и зеленый. Красный тип имеет столбец (TRK_TrackerGroup_LKID2) по умолчанию, равный NULL, тогда как зеленые данные имеют значение в указанном столбце (от 5-7).

Моя проблема заключается в том, что мне нужно, чтобы извлечь оба типа данных, чтобы точно получить количество нерешенных вопросов в свете, но при этом (добавив случай) время выполнения идет от < 1 секунда к более чем 15 секунд.

Это запрос (с упомянутым случае):

SELECT TS.id  AS TrackerStartDateID, 
     TSM.mappingtypeid, 
     TSM.maptoid, 
     TFLK.trk_trackergroup_lkid, 
     Count(TF.id) AS Cnt 
FROM [dbo].[trk_startdate] TS 
     INNER JOIN [dbo].[trk_startdatemap] TSM 
       ON TS.id = TSM.trk_startdateid 
        AND TSM.deletedflag = 0 
     INNER JOIN [dbo].[trk_trackerfeatures] TF 
       ON TF.trk_startdateid = TS.id 
        AND TF.deletedflag = 0 
     INNER JOIN [dbo].[trk_trackerfeatures_lk] TFLK 
       ON TFLK.id = TF.trk_feature_lkid 
WHERE TS.deletedflag = 0 
     AND TF.applicabletoproject = 1 
     AND TF.readyforwork = CASE -- HERE IS THE PROBLEM 
           WHEN TF.trk_trackerstatus_lkid2 IS NULL THEN 0 
           ELSE 1 
          END 
     AND TF.datestamp = (SELECT Max(TF2.datestamp) 
          FROM [dbo].[trk_trackerfeatures] TF2 
            INNER JOIN [dbo].[trk_trackerfeatures_lk] TFLK2 
              ON TFLK2.id = TF2.trk_feature_lkid 
          WHERE TF.trk_startdateid = TF2.trk_startdateid 
            AND TFLK2.trk_trackergroup_lkid = TFLK.trk_trackergroup_lkid) 
GROUP BY TS.id, 
      TSM.mappingtypeid, 
      TSM.maptoid, 
      TFLK.trk_trackergroup_lkid, 
      TF.datestamp 

Он функционирует как «родитель» в том смысле, что она захватывает последний вставленный набор данных (с использованием DATESTAMP) от каждых отдельных детей- группа. Это необходимо для создания родительского отчета в отчете SSRS в более позднее время, но в настоящий момент моя проблема (как упоминалось выше) - это время выполнения.

Хотелось бы услышать, есть ли какие-либо предложения о том, как уменьшить время выполнения при сохранении точности запроса.

Ожидаемый результат:

enter image description here

Без дела я получаю это:

enter image description here

+0

'И TF.readyforwork = CASE' - это проблема? –

+0

Действительно. Я попытался сделать смелый случай, чтобы правильно показать, в чем проблема, но похоже, что разметка кода переопределяет любые стили шрифтов. – geostocker

+0

Можете ли вы предоставить [образец ввода и ожидание вывода] (http://stackoverflow.com/help/mcve)? –

ответ

3

Ваша проблема заключается в том, что это условие невозможно использовать INDEX

AND TF.readyforwork = CASE -- HERE IS THE PROBLEM 
         WHEN TF.trk_trackerstatus_lkid2 IS NULL THEN 0 
         ELSE 1 
         END 

Попробуйте изменить его

AND (TF.readyforwork = 0 and TF.trk_trackerstatus_lkid2 IS NULL 
    OR TF.readyforwork = 1 and TF.trk_trackerstatus_lkid2 IS NOT NULL 
    ) 

Но опять-таки вы должны проверить с EXPLAIN ANALIZE, чтобы проверить, если ваш запрос использует индекс или нет.

+0

Да, это так. Виноват. Извините за пост рака. Кажется, была ошибка на моей стороне, не видя, что я могу использовать И в случае ...: / – geostocker

0

Наиболее проблематичными бит запроса, кажется, коррелированных подзапросов, потому что вы должны позвонить это для каждой возможной строки.

Вы должны сначала оптимизировать это. Для этого вы можете добавить индексы, которые может использовать движок, чтобы быстро вычислить это значение для каждой строки.

Исходя из вашего запроса, я хотел бы добавить, что эти показатели кратные:

  1. В таблице trackerfeatures, индексные поля: trk_startdateid, datestamp

  2. В таблице trk_trackerfeatures_lk, индексные поля: id, trk_trackergroup_lkid

+0

Выполнение подзапроса в запросе по умолчанию (без случая) выполняется менее чем за секунду. Если я добавлю случай, я получаю исполнение более 15 секунд. Это заставляет меня поверить, что это скорее проблема с делом, чем в подзапрос – geostocker

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