下面的语句怎样写效率更高

最爱午夜 2014-07-10 09:38:11
UPDATE j
SET j.Price=(SELECT TOP 1 ISNULL(m.Price,0) FROM i
INNER JOIN g ON g.CID=i.CID
INNER JOIN m ON m.CID IN
(
SELECT * FROM fun_split(ISNULL(g.FullCIDPath,''),'\')
)
INNER JOIN g2 ON g2.CID=m.CID
WHERE i.cname =j.cname AND (m.stid=j.stid OR ISNULL(m.stid,-1)=-1)
AND (m.spfid=2 OR ISNULL(m.spfid,-1)=-1)
ORDER BY g2.clevel DESC,ISNULL(m.stid,-1) desc,ISNULL(m.spfid,-1))
FROM j
WHERE j.price =0

假设CID有三级,例如FullCIDPath为 1\10\100
1、10、100分别代表第一、二、三级的CID,
上面的这种写法效率有点低,怎样写效率高?
...全文
229 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
最爱午夜 2014-07-14
  • 打赏
  • 举报
回复
我用cross apply又改了一次,结果发现这次性能有提高了,晕。
唐诗三百首 2014-07-12
  • 打赏
  • 举报
回复
优化建议: 1.为避免锁争阻塞,减少锁表时间, 建议拆分为2步,先查询出结果存为临时表,然后关联目标表做更新. 2.从函数名看,fun_split()应该是按指定的分隔符分隔字符串为列数据? 应该可用charindex()函数代替,g.FullCIDPath上应有索引. 3.where子句中使用or逻辑运算符,执行计划会偏向于全表扫描. 应该避免使用.
最爱午夜 2014-07-11
  • 打赏
  • 举报
回复
UPDATE j SET j.Price=(SELECT TOP 1 ISNULL(m.Price,0) FROM i INNER JOIN g ON g.CID=i.CID CROSS APPLY fun_split(ISNULL(g.FullCIDPath,''),'\') AS T INNER JOIN m ON m.CID=convert(int,T.SplitValue) INNER JOIN g2 ON g2.CID=m.CID WHERE i.cname =j.cname AND (m.stid=j.stid OR ISNULL(m.stid,-1)=-1) AND (m.spfid=2 OR ISNULL(m.spfid,-1)=-1) ORDER BY g2.clevel DESC,ISNULL(m.stid,-1) desc,ISNULL(m.spfid,-1)) FROM j WHERE j.price =0 效率没有提高
haitao 2014-07-11
  • 打赏
  • 举报
回复
哦反了,应该:
ON '\'+g.FullCIDPath+'\' like '%\'+m.CID+'\%'
haitao 2014-07-11
  • 打赏
  • 举报
回复
ON m.CID IN
(
SELECT * FROM fun_split(ISNULL(g.FullCIDPath,''),'\')
)          

改为

ON '%\'+m.CID+'\%' like '\'+g.FullCIDPath+'\'

结果是否一样,速度有无提高?
--小F-- 2014-07-10
  • 打赏
  • 举报
回复
上执行计划来看看。。
SQL77 2014-07-10
  • 打赏
  • 举报
回复
具体的 还得看你的数据情况,以及索引情况 调整
SQL77 2014-07-10
  • 打赏
  • 举报
回复
如果是2K5以上 可以考虑用cross apply 这种,不用子查询。 MCID 可用LIKE

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧