-
帮忙分下下 如下sql语句的效率问题。请高手解决。30
select distinct ugu.user_id
from ug_group_user ugu
where ugu.group_id in
(select t.group_id
from ug_group_user t
where t.user_id = 8738682761)
and ugu.user_id <> 8738682761
表的具体情况就不多说了。
贴上执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS Cost=2 Cardinality=24 Bytes=672
HASH UNIQUE Cost=2 Cardinality=24 Bytes=672
NESTED LOOPS Cost=1 Cardinality=24 Bytes=672
INDEX FULL SCAN Object owner=EEWEB Object name=GROUP_USER_PK Cost=1 Cardinality=155 Bytes=2170
INDEX UNIQUE SCAN Object owner=EEWEB Object name=GROUP_USER_PK Cost=0 Cardinality=1 Bytes=14
一个组对应多个用户,现在要查出 一个用户的其它组的成员。 请分别分析下 数据量大 和 数据量小的时候的情况,有没有更好的实现。
EEWEB GROUP_USER_PK Unique GROUP_ID, USER_ID N N tablespace gs_data pctfree 10 initrans 2 maxtrans 255 storage ( initial 64k next 1m minextents 1 maxextents unlimited )
EEWEB GRPUSR_GRP_IDX Normal GROUP_ID N N tablespace gs_indx pctfree 10 initrans 2 maxtrans 255 storage ( initial 64k next 1m minextents 1 maxextents unlimited )
EEWEB GRPUSR_USR_IDX Normal USER_ID N N tablespace gs_indx pctfree 10 initrans 2 maxtrans 255 storage ( initial 64k next 1m minextents 1 maxextents unlimited )
上述是表的索引情况。
还请详细说明下具体的sql 分析 计划 和 执行效率。
问题补充:zyn010101 写道如果每个组员只有一个groupid,可以尝试下面的sql:
select distinct ugu.user_id
from ug_group_user ugu
where ugu.group_id =
(select t.group_id
from ug_group_user t
where t.user_id = 8738682761)
and ugu.user_id <> 8738682761
谢谢你的回答
每个组员有多个groupid。
问题补充:kidding87 写道这个主要是那个<>select distinct * from ( select ugu.user_id from ug_group_user ugu where ugu.group_id in (select t.group_id from ug_group_user t where t.user_id = 8738682761) ) a where a.user_id <> 8738682761
最后想说的是一楼的那位,不要所有的问题不想想就随便说啊请问下这么写的好处?F5了一下,发现走的路经是一样的。
2012年5月21日 15:43
12个答案 按时间排序 按投票排序
-
select distinct u2.user_id from ug_group_user u1 inner join ug_group_user u2 on u1.group_id = u2.group_id where u1.user_id = 8738682761 and u2.user_id <> 8738682761;
建议借助覆盖索引(group_id,user_id).2012年6月04日 11:33
-
select distinct *
from ug_group_user ugu
left join (select t.group_id
from ug_group_user t
where t.user_id = 873868276 where ) a
on ugu.group_id = a.group_id where ugu.user_id <> 8738682761
试一试这个...2012年6月03日 22:31
-
首先,你的数据库系统版本是什么?我从你的描述看,像是sqlserver。但也请你明确一下。
其次,这个SQL的功能是什么,我分析了SQL,想它是查询一个用户所在组的所有不包含自己的用户记录。
最后,我的优化建议是修改一个索引类型,索引的字段应该是group_id,这里你提供的索引名称是GRPUSR_GRP_IDX,它是normal类型。
我不清楚sqlserver有没有bitmap索引,如果是oracle,我则会用这个类型的索引来试试。
另外,我认为使用in和exists区别不大,这个SQL相对简单。
个人意见,仅供参考。
顺祝节日快乐!哈哈
miki西游(@mikixiyou)
2012-06-012012年6月01日 11:55
-
将ug_group_user作为主表进行查询,注定最优化的结果,也只能是INDEX_RANGE_SCAN,比较差的情况是TABLE_FULL_SCAN。因为你几乎要把整个表过一遍,才能知道符合还是不符合。
所以应该换user表来做, 假设LZ的USER表是u_user,那么查询语句变为:SELECT user_id from u_user u where u.user_id <> 8738682761 and exists ( SELECT 0 FROM ug_group_user ugu WHERE ugu.user_id = u.user_id AND ugu.group_id IN (select t.group_id from ug_group_user t where t.user_id = 8738682761) )
AND ugu.group_id IN (select t.group_id from ug_group_user t where t.user_id = 8738682761)
也可以修改为AND exists IN (select 0 from ug_group_user t where t.user_id = 8738682761 and t.group_id = ugu.group_id)
如果每个用户的分组不多,用IN还是EXISTS区别不大。2012年5月31日 09:34
-
select distinct * from ( select ugu.user_id from ug_group_user ugu where exists in (select 1 from ug_group_user t where t.user_id = 8738682761 and ugu.group_id=t.group_id ) ) a where a.user_id <> 8738682761
2012年5月24日 09:46
-
这个主要是那个<>
select distinct * from ( select ugu.user_id from ug_group_user ugu where ugu.group_id in (select t.group_id from ug_group_user t where t.user_id = 8738682761) ) a where a.user_id <> 8738682761
最后想说的是一楼的那位,不要所有的问题不想想就随便说啊2012年5月22日 14:52
-
select distinct ugu.user_id
from ug_group_user ugu,(select t.group_id
from ug_group_user t
where t.user_id = 8738682761) a
where ugu.group_id =
a.griup_id
and ugu.user_id <> 87386827612012年5月22日 13:32
-
如果每个组员只有一个groupid,可以尝试下面的sql:
select distinct ugu.user_id
from ug_group_user ugu
where ugu.group_id =
(select t.group_id
from ug_group_user t
where t.user_id = 8738682761)
and ugu.user_id <> 8738682761
2012年5月22日 11:06
相关推荐
- 题目1中,用一条SQL语句查询出每门课都大于80分的学生姓名,这涉及到了子查询的使用。可以使用`NOT IN`或`LEFT JOIN`与`IS NULL`来实现。给出的解法是使用`NOT IN`子查询,找出分数小于等于80的学生,然后排除...
深入理解SQL语句的构造和执行是数据操作的关键。 4. **ASP与SQL的连接** 在ASP中,ADO(ActiveX Data Objects)是用于与数据库交互的主要组件。通过建立数据库连接、执行SQL命令和填充记录集,你可以将Web页面与...
标准答案,很容易运行的,希望大家下下看看能不能用。
小学一年级下下数学元角分测试题 本题目旨在检测学生对于元、角、分之间的换算能力,以及基本的加减乘除运算能力。 知识点一:元、角、分之间的换算 * 1 元可以换多少角? * 1 角可以换多少分? * 1 元可以换多少...
存储过程可以接收这两个参数,并基于它们生成相应的SQL查询语句。 在SQL中,实现分页通常有以下两种方法: 1. **LIMIT与OFFSET方法**: 在MySQL等支持LIMIT关键字的数据库中,我们可以使用LIMIT和OFFSET来实现...
程序员的SQL金典(试读版),非常好的东东,下下看看哦。
小学一年级下下数学元角分测试题-完整版.pdf
Oracle报表经典语句主要涉及了SQL查询技巧,特别是在数据分析和报表生成方面。以下是对这些语句的详细解析: 1. **LEAD函数的使用** 在Oracle SQL中,LEAD函数用于获取当前行之后的值。在这个例子中,它被用来获取...
0-1背包问题是一种经典的优化...总的来说,0-1背包问题的启发式算法,尤其是基于贪心策略的方法,提供了一种在效率和解质量之间权衡的途径。通过深入理解和分析各种算法的特性,我们可以更好地解决实际中的优化问题。
回溯法是一种试探性的解决问题的方法,它尝试通过逐步构建可能的解决方案,并在发现无法得到满足条件的解时,撤销上一步的选择,返回到之前的决策点,继续尝试其他可能的选择。在装载问题中,回溯法通常采用深度优先...
标题中的“号码抽奖 c#写的”表明这是一个使用C#编程语言开发的抽奖程序。C#是一种面向对象的、现代...对于初学者来说,阅读和分析源代码是一个很好的学习机会,可以了解到实际项目中如何运用C#语言和技术来解决问题。
【标题】中的“仿下下片网站源码”指的是一个基于特定模板设计的网站源代码,这个模板可能模仿了某个知名或受欢迎的电影或视频分享网站的界面和功能。源码是网站的基础,包含了所有页面的HTML、CSS、JavaScript以及...
百科基础知识目录: 希腊和罗马神话中的神和女神 中国历史名将 品酒知识 对葡萄酒的七大误解 中国部分城市的市花 吵架英语一百句 对中国最有威胁的十个国家 中国古代的酷刑 解放军军车新牌照代号 ...
这是我们培训时候第一个编写的项目,虽然很稚嫩,但是绝对能运行,在MyEclipse 6.0.1下绝对能运行.... 很适合初学JAVA的人用来学习 含有.SQL的数据库脚本,只需在SQL2000的MASTER数据下下按F5即可
正则表达式是一种强大的文本处理工具,用于在字符串中匹配特定模式。在IT行业中,正则表达式广泛应用于数据验证、搜索与替换、文本解析等多个领域。以下是一些关于正则表达式的基础知识和常见用法: ...
- Oracle ECM是一套全面的内容管理解决方案,包括文档管理、记录管理、工作流、协作、报表等多个模块,旨在提高企业的效率和合规性。 通过以上步骤和知识点,可以有效地解决UCM文件夹下文件个数限制的问题,同时也...
win7下下笔记本创建虚拟路由器,,,,,, wifi热点
9. **arp**:地址解析协议,用于将IP地址映射到物理地址,有助于解决MAC层的问题。 以上只是部分网络服务和网络命令的基本介绍,实际应用中还有许多其他服务和命令,如SNMP(简单网络管理协议)用于设备监控,端口...
jdbc的工具类,平时用的很顺手,今天共享出来给大伙,有需要的下下