2011-09-19 86 views
3

表(简体)SQL查询优化的帮助,请

媒体表

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

MultimediaGroup表

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)) 

我也想用用它(NOLOCK),因为它运行得只是加快它的有时速度慢,并有可能导致服务器崩溃。

+0

子查询是不太可能造成您的问题(虽然我会用'不能代替EXISTS'而不是' NOT IN')。这个问题看起来是所有不可判断的谓词(''LIKE'带有前导通配符,'''''')。 。看看执行计划。 –

回答

3

多数民众赞成让你感到不安的部分可以转化为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

它还会返回左连接中匹配的组ID。 OP不希望记录器在多媒体组表 –

+0

这个查询返回来自'媒体'的行,它们*不匹配'multimediagroups'中的行。注意'LEFT JOIN multimediagroups g ... ON ... WHERE ... g.multimediagroupid IS NULL'。这是一个反连接。 –

0

我不相信子查询引起的问题与在子查询中执行的不一样多。虽然这可能有所帮助,但我确实有一些想法:

  1. 更改子查询以返回包含的multimediagroupid。这将允许您将查询更改为in,如果您愿意,甚至可以将其转变为连接条件。另外,假设这个表格小得多,“ispollgroup <> 1”条件可以很快处理。
  2. 添加索引以帮助提高多媒体组表和媒体表的性能。不要害怕在索引中放置多个列。

对于指数,我想补充以下内容:

  • multimediagroups:上ispollgroup一个指数和multimediagroupid
  • 媒体:在remoteMedia,multimediaGroupId,siloID一个指数(你可能有玩列命令在这里优化查询)。