SQL Server 2000 关联查询效率问题

vpjian 2012-12-06 03:45:37
Plant表 有PlantID(主键),UserUID  字段
AppUser表 有UserUID(主键),UserID,Path  字段

AppUser.Path 字段是用来建立树结构的,AppUser.UserID 原来的主键,后来不想给用户知道当前用户数据增加了UserUID,UserID保留是为了加速分页和简化Path用的,以上所有字段都有索引,Plant表有1百万记录,AppUser有10多条记录。

现我要查询出某个用户下(包括子用户)的所有Plant数量。于是编写了以下的查询,结果约需要13秒才能返回

select count(PlantID ) from Plant join appuser on AppUser .UserUID = Plant.UserUID
where AppUser.Path like (select Path+lTrim(str(AppUser .UserID))+'/%' from AppUser where UserUID=@userUID) or Plant.UserUID=@userUID


我用查询分析器测试了一下。如果将它拆分成下面的两条SQL语句就可能马上查询出。对此10分不解,上面的到底应该怎么优化才能和下面的有相同的效率。

declare @userUID uniqueidentifier
set @userUID='12488224-a498-45d6-b23b-39f35a0defcc'

declare @path varchar(255)
set @path=(select Path+lTrim(str(appuser.UserID))+'/%' from AppUser where UserUID=@userUID)

select count(PlantID ) from Plant join AppUser on AppUser .UserUID = Plant.UserUID
where AppUser.Path like @path or Plant.UserUID=@userUID

...全文
168 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vpjian 2012-12-15
  • 打赏
  • 举报
回复
引用 4 楼 tanleittl 的回复:
而且你两个查询是不等价的 SQL code?123select count(PlantID ) from Plant join appuser on AppUser .UserUID = Plant.UserUID where AppUser.Path like (select Path+lTrim(str(AppUser .UserID))+'/%' from ……
因为UserUID是主键,这两个语句其实是等价的。select Path+lTrim(str(appuser.UserID))+'/%' from AppUser where UserUID=@userUID 只有唯一的值。可能是解释的程序分析不出来因此执行的顺序有问题。看来只能分两次查询了。
zoffor 2012-12-07
  • 打赏
  • 举报
回复
这个应该是属于参数嗅探的问题吧 。
DBA_磊仔 2012-12-06
  • 打赏
  • 举报
回复
而且你两个查询是不等价的

select count(PlantID ) from Plant  join appuser on AppUser .UserUID = Plant.UserUID  
where AppUser.Path like (select Path+lTrim(str(AppUser .UserID))+'/%'  from AppUser where UserUID=@userUID) or Plant.UserUID=@userUID 
--这种写法是不行的,如果子查询出现多个数据集,就会报错
DBA_磊仔 2012-12-06
  • 打赏
  • 举报
回复
我看你第二种方法是因为缓存里面有了plant表的数据才快的,看计划两个查询差不多
vpjian 2012-12-06
  • 打赏
  • 举报
回复




發糞塗牆 2012-12-06
  • 打赏
  • 举报
回复
我的回复呢?执行计划贴出来看看
中文 高清 全 Microsoft SQL Server 2005技术内幕 系列之一 其他的几本,我都会全部上传,有需要的点击我的用户名查看我所有的资源会有你想要的其他三本。 编辑推荐 通过专家们架构级的洞察力来优化企业级数据库 以SQL Server顶尖专家的视角,带你深入到SQL Server 2005性能调优和优化的内部。该书包括指导性强的实践、实用的建议及丰富的示例代码,使你的查询语句效率更高,效果更好,以达到数据库性能的优化。 探索如何 通过系统监视器和DMVs,来创建基线和监控工作负荷: 通过设计、操纵和管理跟踪,孤立性能问题: 使用内置的默认值、黑匣子,以及常见的标准跟踪来审计用户的活动; 使用扫描及查找、连接、聚合、联合及并行来分析用户的查询; 使用缓存计划和新计划来产生高效率的查询和低代价的查询; 探测和解决加锁、阻塞及死锁等并发问题; 通过实践来诊断和排查反应时间、吞吐量,以及可扩展的问题。 内容简介 本书是Inside Microsoft SQL Server 2000的作者Kalen Delaney的又一经典著作,是Inside Microsoft SQL Server 2005系列四本著作中的一本。书中详细介绍了如何使数据查询更加高能高效,同时使现有资源最大化的方法。本书还包含了大量的代码示例和表示例以帮助数据库开发人员和管理员理解复杂的逻辑并掌握查询调整和优化。通过阅读本书,数据库开发人员将能够加深对查询优化背景的理解和应用,并开发和调整优化出反应速度更快的数据库。   本书适合于专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握查询调整和优化的技巧,以针对不同问题开发出切合实际的高效能的方案。 作者简介 Kalen Delaney还是微软出版社Inside Microsoft SQL Server丛书的编辑,她从事SQL Server方面的工作已有20多年。在SQL Server社区,她是一位知名的专家。她于1995年被评为微软最有价值的专家(MVP)。   Kalen是SQL Server Magazine的特约编辑和专栏作家,她还写作了大量的 目录 序 致谢 引言 Microsoft SQL Server技术内幕丛书的历史 丛书结构 《Microsoft SQL Server 2005技术内幕:T-SQL查询》 《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》 《Microsoft SQL Server 2005技术内幕:存储引擎》 《Microsoft SQL Server 2005技术内幕:查询、调整和优化》 例子和脚本 未被涵盖的主题 免责条款 如何获得支持 关联网站 微软学习站点

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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