这是我的问题
select u.FirstName as AssignedBy, u1.FirstName as RespondedBy, u2.FirstName as ClosedBy
from Messages M
left join User u on isnull(M.AssignedBy, 0) = u.UserId
left join User u1 on isnull(M.RespondedBy, 0) = u1.UserId
left join User u2 on isnull(M.closedby, 0) = u2.UserId可以在单个查询中编写连接吗?我想提高我的查询的性能,所以我不想做3个连接,所以在一个连接中尝试它,因为我的用户表有很多记录。我有这两个表上的所有索引。我试过了
select u.FirstName as AssignedBy, u.FirstName as RespondedBy, u.FirstName as ClosedBy
from Messages M
left join User u on
(isnull(M.AssignedBy, 0) = u.UserId or isnull(M.RespondedBy, 0) = u.UserId or isnull(M.closedby, 0) = u.UserId)但是这个查询给出了不正确的输出,因为我有很多行,这些行在所有三个连接列中都有记录。有没有其他方法可以达到同样的效果呢?
发布于 2014-10-30 19:21:06
您的原始查询看起来很好。如果你有一个关于User(UserId)或者更好的User(UserId, FirstName)的索引,那么我认为它的性能应该是不错的。
在join条件下使用or通常会使性能变得更差而不是更好。
您的问题可能很简单,即Messages表的大小。返回非常大的结果集可能需要一段时间。
发布于 2014-10-30 19:27:18
我不认为有更好的方法来做到这一点。我唯一反对的就是JOIN中的ISNULL()构造,因为它实际上没有任何作用,而且可能会使优化器感到困惑。这个查询确实“要求”你在用户表上有一个合适的索引,但是我假设UserId字段已经是这个表的PK了……
select u.FirstName as AssignedBy,
u1.FirstName as RespondedBy,
u2.FirstName as ClosedBy
from Messages M
left join User u on M.AssignedBy = u.UserId
left join User u1 on M.RespondedBy = u1.UserId
left join User u2 on M.closedby = u2.UserId那么性能到底有多糟糕呢?您确定指向用户表的链接是罪魁祸首吗?(我猜您还通过在messages表上设置其他谓词来限制查询结果;例如,只想要打开的消息,或最后100条消息等。)
(查询计划可能很有趣)
https://stackoverflow.com/questions/26651574
复制相似问题