使用3个表优化TSQL查询
问题描述:
我需要从数据库中获取所有运行,但需要标记是否存在此运行的错误。使用3个表优化TSQL查询
3表:
- 上运行:包含运行)
- Runfiles:包含一个运行期间处理
- 消息全部文件ID:包含错误,警告,...
此查询是否可以进一步优化?
SELECT TOP 1000 runid,
start,
end,
userid,
CASE
WHEN EXISTS(SELECT rf.fk_fileid
FROM runfiles rf
WHERE rf.fk_runid = r.runid
AND EXISTS(SELECT m.messageid
FROM messages m
WHERE m.fk_fileid =
rf.fk_fileid
AND m.fk_statusid = 4))
THEN 1
ELSE 0
END AS ContainsError
FROM runs r
ORDER BY start DESC
请不要评论表名称,他们被翻译为这个问题。
谢谢!
答
试试这个:在选择列表
SELECT TOP 1000
r.runid
,r.start
,r.[end]
,r.userid
,CASE WHEN m.messageid IS NOT NULL THEN 1 ELSE 0 END AS ContainsError
FROM runs r
LEFT JOIN runfiles rf
ON rf.fk_runid = r.runid
LEFT JOIN [messages] m
ON m.fk_fileid = rf.fk_fileid
AND m.fk_statusid = 4
ORDER BY r.start DESC
什么是跑在结果集中的每一行。这意味着CASE
语句中的嵌套子查询正在为这些TOP 1000
行中的每一行执行。
使用左连接和CASE
语句来检查主键是否允许将整个语句作为一个集合进行评估,该SQL Server的内置操作是基于该集合进行的。它应该以更好的方式执行。
+0
关系Run RunFile是一对多关系Runfile 消息也是一对多的。因此,该查询将多次返回相同的运行。也许有一种方法可以限制连接中结果的数量。我会研究它。谢谢! – Nullius 2013-02-21 06:32:53
看执行计划并添加适当的索引 – Magnus 2013-02-20 14:58:04
“优化”是什么意思?如果您询问性能,那么您应该在查询中包含执行计划。如果您问的是提高可读性或可维护性,那么[代码评论网站](http://codereview.stackexchange.com/)将是一个更好的问题。 – Pondlife 2013-02-20 16:21:07
有时你只需要比较不同的选项。你有没有试过在运行文件和消息上的左连接? – Narnian 2013-02-20 17:19:23