Оптимизация SQL-запросов, пожалуйста, помогите - PullRequest
3 голосов
/ 19 сентября 2011

ТАБЛИЦЫ (упрощенно)

Таблица мультимедиа

mediaID   description       multimediaGroupID   silolID   fcsPathHigh   fcsPathLow 
---------------------------------------------------------------------------------- 
1         media1            11                  6         blah          blah
2         media2            12                  6         blah          blah

Таблица мультимедийной группы

multimediaGroupID   multimediaGroup  isPollGroup
------------------------------------------------ 
11                  You be the ref   1 
12                  Try of the week  1

Получил этот запрос, который я не знаю 'т оптимальный.Мне не нравится подзапрос в нем.

SELECT top 30 *
FROM media
WHERE (remoteMedia = 1) AND multimediaGroupID <> 13 AND siloID <> 16
AND siloID = 1 AND (fcsPathHigh like '%.flv' AND fcsPathLow like '%.flv')                     
AND (multimediagroupid is null or multimediagroupid not in
     (select multimediagroupid
     from multimediagroups
     where ispollgroup = 1))
ORDER BY dateUploaded DESC

Может кто-нибудь предложить способ оптимизировать его без следующего раздела подзапроса:

and (multimediagroupid is null
or multimediagroupid not in 
     (select multimediagroupid
     from multimediagroups
     where ispollgroup = 1))

Я также думаю об использовании WITH(NOLOCK), чтобы ускорить его, поскольку иногда он работает довольно медленно и может вызвать сбой сервера.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Раздел, который вас беспокоит, может быть преобразован в LEFT JOIN, например:

SELECT TOP 30 m.*
FROM media m
  LEFT JOIN multimediagroups g ON m.multimediagroupid = g.multimediagroupid
    AND g.ispollgroup = 1
WHERE m.remoteMedia = 1
  AND m.multimediaGroupID <> 13
  AND m.siloID <> 16
  AND m.siloID = 1
  AND (m.fcsPathHigh like '%.flv' AND m.fcsPathLow like '%.flv')                     
  AND g.multimediagroupid IS NULL
ORDER BY m.dateUploaded DESC
0 голосов
/ 19 сентября 2011

Я не верю, что подзапрос вызывает проблему так же, как не выполняется в подзапросе.У меня есть несколько идей, которые могли бы помочь:

  1. Измените подзапрос, чтобы вернуть мультимедийные группы для включения.Это позволит вам изменить запрос на вход и даже превратить его в условие соединения, если вы предпочитаете.Кроме того, предполагая, что эта таблица намного меньше, условие «ispollgroup <> 1» может быть обработано быстро.
  2. Добавьте индексы, чтобы повысить производительность как таблицы мультимедийных групп, так и таблицы мультимедиа.Не бойтесь помещать несколько столбцов в индексы.

Для индексов я бы добавил следующее:

  • мультимедийные группы: один индекс для ispollgroup и multimediagroupid
  • media: один индекс для remoteMedia, multimediaGroupId, siloID (для оптимизации запроса вам, возможно, придется поиграться с порядком столбцов).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...