求一个高效查询

cppfaq 2014-07-08 08:42:31
表A:
ParentCategoryID ParentNodeID ParentDeviceID ChildCategoryID ChildNodeID ChildDeviceID

表B:
CategoryID Name

表C:
NodeID Name

表D
DeviceID Name


要求输出
ParentCategoryName ParentNodeName ParentDeviceName ChildCategoryName ChildNodeName ChildDeviceName


请问各位大侠,怎么写存储过程最高效??我能想到的就是不断地left join...
...全文
224 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
针对你8楼的语句,索引建议是在on条件的列上加上非聚集索引。select中的列可以和这些on条件的索引组合成复合索引
cppfaq 2014-07-08
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
数据量少的话参考价值没多大用处,你的语句如果可以适当加一些有效的WHERE条件,基本上就没什么问题了
ok thanks 多谢各位
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
数据量少的话参考价值没多大用处,你的语句如果可以适当加一些有效的WHERE条件,基本上就没什么问题了
xiaoxiangqing 2014-07-08
  • 打赏
  • 举报
回复
要输入一些数据,测试一下,才知道性能
cppfaq 2014-07-08
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
你现在是否已经出现性能问题?
我是这么写的

	SELECT  
	ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS RowIndex,
	ria.ParentCategoryID AS ParentCategoryID, cc.Name as ParentCategory,
	ria.ParentNodeID AS ParentNodeID, st.Name as ParentNode,
	ria.ParentDeviceID AS ParentDeviceID, am.Name as ParentDevice,
	ria.ChildCategoryID AS ChildCategoryID,cc2.Name as ChildCategory,
	ria.ChildNodeID AS ChildNodeID,st2.Name as ChildNode,
	ria.ChildDeviceID  AS ChildDeviceID,am2.Name as ChildDevice	
	FROM dbo.A as ria
	left join dbo.B as cc
	on ria.ParentCategoryID = cc.CategoryID
	left join dbo.B as cc2
	on ria.ChildCategoryID = cc2.CategoryID
	left join dbo.C as st
	on ria.ParentNodeID = st.NodeID
	left join dbo.C as st2
	on ria.ChildNodeID = st2.NodeID
	left join dbo.D as am
	on ria.ParentDeviceID = am.DeviceID
	left join dbo.D as am2
	on ria.ChildDeviceID = am.DeviceID
	
CTRL-M 查看execution plan都落在了clustered index上。 目前测试数据较少,性能不是啥问题。我没有什么sql背景,猛然看到这么多的left join,总有种refactor的冲动
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
你现在是否已经出现性能问题?
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
临时表在你这里会引入额外的insert和索引方面的开销,性能不见得一定有提升
cppfaq 2014-07-08
  • 打赏
  • 举报
回复
如果引入一个临时表 将A表的数据转成如下结构 #A id parentid categoryid nodeid deviceid 有没有办法优化呢?
唐诗三百首 2014-07-08
  • 打赏
  • 举报
回复
left join木有什么问题,关键是关联的字段上应有索引.
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
把你的语句写出来,然后ctrl+M,再运行你的语句,贴执行计划看看
SQL77 2014-07-08
  • 打赏
  • 举报
回复
你 的表设计 决定了。。LEFT 吧。BCD每个表得两次。
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
如果你不需要显示null,那就inner join,如果要就left join,4个表如果索引合理、where条件高效的话不会很慢的

22,209

社区成员

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

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