SQL查询优化的帮助,请
表(简体)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),因为它运行得只是加快它的有时速度慢,并有可能导致服务器崩溃。
多数民众赞成让你感到不安的部分可以转化为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
它还会返回左连接中匹配的组ID。 OP不希望记录器在多媒体组表 –
这个查询返回来自'媒体'的行,它们*不匹配'multimediagroups'中的行。注意'LEFT JOIN multimediagroups g ... ON ... WHERE ... g.multimediagroupid IS NULL'。这是一个反连接。 –
我不相信子查询引起的问题与在子查询中执行的不一样多。虽然这可能有所帮助,但我确实有一些想法:
- 更改子查询以返回包含的multimediagroupid。这将允许您将查询更改为in,如果您愿意,甚至可以将其转变为连接条件。另外,假设这个表格小得多,“ispollgroup <> 1”条件可以很快处理。
- 添加索引以帮助提高多媒体组表和媒体表的性能。不要害怕在索引中放置多个列。
对于指数,我想补充以下内容:
- multimediagroups:上ispollgroup一个指数和multimediagroupid
- 媒体:在remoteMedia,multimediaGroupId,siloID一个指数(你可能有玩列命令在这里优化查询)。
子查询是不太可能造成您的问题(虽然我会用'不能代替EXISTS'而不是' NOT IN')。这个问题看起来是所有不可判断的谓词(''LIKE'带有前导通配符,'''''')。 。看看执行计划。 –