Как я могу оптимизировать этот запрос? - PullRequest
0 голосов
/ 16 октября 2010
UPDATE a
SET CountOfAA=dt.CountOf,
CountOfBB=dt.CountOf
FROM @MediaResurce  a
INNER JOIN (SELECT 
                aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf
                FROM @MediaResurce                      aa
                    LEFT OUTER JOIN @MediaResurce_Pics  bb 
                    ON aa.sku=bb.sku
                WHERE somecol = 0
                GROUP BY aa.Sku
           ) dt ON a.sku=dt.sku
INNER JOIN (SELECT 
                aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf
                FROM @MediaResurce                      aa
                    LEFT OUTER JOIN @MediaResurce_Pics  bb 
                    ON aa.sku=bb.sku
                 WHERE somecol = 1
                GROUP BY aa.Sku
           ) dt2 ON a.sku=dt2.sku

Ответы [ 2 ]

3 голосов
/ 16 октября 2010

То, что предоставляется, несколько абстрактно, затрудняет обратную связь.

UPDATE a
   SET CountOfAA = CASE WHEN b.somecol = 0 THEN b.CountOf END,
       CountOfBB = CASE WHEN b.somecol = 1 THEN b.CountOf END
  FROM @MediaResurce a
  JOIN (SELECT aa.Sku,
               somecol,
               ISNULL(COUNT(bb.sku), 0) AS CountOf
          FROM @MediaResurce aa
     LEFT JOIN @MediaResurce_Pics bb ON aa.sku = bb.sku
         WHERE somecol IN (0, 1)
      GROUP BY aa.Sku, somecol) b ON b.sku = a.sku
0 голосов
/ 16 октября 2010

Только начал писать с нуля, получилось похоже на ответ OMG:

UPDATE a
SET CountOfAA=dt.CountOfAA,
    CountOfBB=dt.CountOfBB
FROM @MediaResurce a
INNER JOIN (
    SELECT
        aa.sku,
        SUM(CASE WHEN aa.somecol = 0 THEN 1 ELSE 0 END) AS CountOfAA,
        SUM(CASE WHEN aa.somecol = 1 THEN 1 ELSE 0 END) AS CountOfBB
    FROM @MediaResurce_Pics bb 
    INNER JOIN @MediaResurce aa ON aa.sku = bb.sku
    GROUP BY aa.sku
) dt ON dt.sku = a.sku

Обращает на себя внимание:

  • Я предположил, что 'somecol' находится в @MediaResurce.Если он существует в @MediaResurce_Pics, я не вижу причин для второго INNER JOIN
  • Для больших таблиц можно значительно повысить скорость выполнения такого запроса, установив соответствующие индексы в исходных таблицах, например, на'sku' и 'somecol'.Но табличные переменные не поддерживают индексы.Можете ли вы изменить их во временные или фиксированные таблицы?Насколько большой этот стол?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...