Sql 如何优化此查询?
所提供的内容有些抽象,因此很难提供反馈Sql 如何优化此查询?,sql,sql-server-2008,Sql,Sql Server 2008,所提供的内容有些抽象,因此很难提供反馈 UPDATE a SET CountOfAA=dt.CountOf, CountOfBB=dt.CountOf FROM @MediaResurce a INNER JOIN (SELECT aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf FROM @MediaResurce aa
UPDATE a
SET CountOfAA=dt.CountOf,
CountOfBB=dt.CountOf
FROM @MediaResurce a
INNER JOIN (SELECT
aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf
FROM @MediaResurce aa
LEFT OUTER JOIN @MediaResurce_Pics bb
ON aa.sku=bb.sku
WHERE somecol = 0
GROUP BY aa.Sku
) dt ON a.sku=dt.sku
INNER JOIN (SELECT
aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf
FROM @MediaResurce aa
LEFT OUTER JOIN @MediaResurce_Pics bb
ON aa.sku=bb.sku
WHERE somecol = 1
GROUP BY aa.Sku
) dt2 ON a.sku=dt2.sku
刚开始白手起家,结果与OMG的答案相似:
UPDATE a
SET CountOfAA = CASE WHEN b.somecol = 0 THEN b.CountOf END,
CountOfBB = CASE WHEN b.somecol = 1 THEN b.CountOf END
FROM @MediaResurce a
JOIN (SELECT aa.Sku,
somecol,
ISNULL(COUNT(bb.sku), 0) AS CountOf
FROM @MediaResurce aa
LEFT JOIN @MediaResurce_Pics bb ON aa.sku = bb.sku
WHERE somecol IN (0, 1)
GROUP BY aa.Sku, somecol) b ON b.sku = a.sku
注意事项:
我以为“somecol”在@MediaResurce中。如果它存在于@MediaResurce_Pics中,我看不出第二个内部连接的原因
对于较大的表,可以通过在源表上设置适当的索引(如“sku”和“somecol”)来显著提高此类查询的速度。但是表变量不支持索引。你能把它们换成临时的或固定的桌子吗?这张桌子有多大?
没有任何背景?如果你希望人们花时间回答你的问题,你应该花一些时间问这个问题。你的问题涉及面很广,没有告诉我们你所面临的具体问题。@Mitch Wheat,那真的伤害了我的感情。这不是针对个人的,也不应该如此。这是我的专家意见。您需要提供表scehma,包括定义的索引。告诉我们您目前有哪些问题。所以用户无法读懂大脑…好的,等一下,我会得到一个模式,我认为你的意思是CountOfBB=dt2.CountOf?这基本上是查询一次,然后根据somecol的值将结果放入两个桶中。我完全支持这种方法,它比使用联接进行两个子选择要快。
UPDATE a
SET CountOfAA=dt.CountOfAA,
CountOfBB=dt.CountOfBB
FROM @MediaResurce a
INNER JOIN (
SELECT
aa.sku,
SUM(CASE WHEN aa.somecol = 0 THEN 1 ELSE 0 END) AS CountOfAA,
SUM(CASE WHEN aa.somecol = 1 THEN 1 ELSE 0 END) AS CountOfBB
FROM @MediaResurce_Pics bb
INNER JOIN @MediaResurce aa ON aa.sku = bb.sku
GROUP BY aa.sku
) dt ON dt.sku = a.sku