0 0

帮忙分下下 如下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个答案 按时间排序 按投票排序

0 0

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
0 0

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
0 0

首先,你的数据库系统版本是什么?我从你的描述看,像是sqlserver。但也请你明确一下。
其次,这个SQL的功能是什么,我分析了SQL,想它是查询一个用户所在组的所有不包含自己的用户记录。
最后,我的优化建议是修改一个索引类型,索引的字段应该是group_id,这里你提供的索引名称是GRPUSR_GRP_IDX,它是normal类型。
我不清楚sqlserver有没有bitmap索引,如果是oracle,我则会用这个类型的索引来试试。

另外,我认为使用in和exists区别不大,这个SQL相对简单。

个人意见,仅供参考。

顺祝节日快乐!哈哈

miki西游(@mikixiyou)
2012-06-01

2012年6月01日 11:55
0 0

借花献佛;
主题:in 和 exists的区别 用数据说话
http://www.iteye.com/topic/1123341

2012年5月31日 23:08
0 0

将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
0 0

使用exsit代替in,走索引

2012年5月25日 13:58
0 0

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
0 0

in是转换成or了,or不走索引。

2012年5月23日 09:03
0 0

这个主要是那个<>

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
0 0

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 <> 8738682761

2012年5月22日 13:32
0 0

如果每个组员只有一个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
0 0

尽量不要用in

2012年5月21日 21:06

相关推荐

    mysql server sql面试题

    - 题目1中,用一条SQL语句查询出每门课都大于80分的学生姓名,这涉及到了子查询的使用。可以使用`NOT IN`或`LEFT JOIN`与`IS NULL`来实现。给出的解法是使用`NOT IN`子查询,找出分数小于等于80的学生,然后排除...

    asp+sql教材大全(HTML)。。。有喜欢的就下下吧

    深入理解SQL语句的构造和执行是数据操作的关键。 4. **ASP与SQL的连接** 在ASP中,ADO(ActiveX Data Objects)是用于与数据库交互的主要组件。通过建立数据库连接、执行SQL命令和填充记录集,你可以将Web页面与...

    迷宫问题地解决方法下下看

    标准答案,很容易运行的,希望大家下下看看能不能用。

    小学一年级下下数学元角分测试题.doc

    小学一年级下下数学元角分测试题 本题目旨在检测学生对于元、角、分之间的换算能力,以及基本的加减乘除运算能力。 知识点一:元、角、分之间的换算 * 1 元可以换多少角? * 1 角可以换多少分? * 1 元可以换多少...

    分页存储过程,有需要的可以下下呵呵

    存储过程可以接收这两个参数,并基于它们生成相应的SQL查询语句。 在SQL中,实现分页通常有以下两种方法: 1. **LIMIT与OFFSET方法**: 在MySQL等支持LIMIT关键字的数据库中,我们可以使用LIMIT和OFFSET来实现...

    程序员的SQL金典(试读版).pdf

    程序员的SQL金典(试读版),非常好的东东,下下看看哦。

    小学一年级下下数学元角分测试题-完整版.pdf

    小学一年级下下数学元角分测试题-完整版.pdf

    oracle报表经典语句[参考].pdf

    Oracle报表经典语句主要涉及了SQL查询技巧,特别是在数据分析和报表生成方面。以下是对这些语句的详细解析: 1. **LEAD函数的使用** 在Oracle SQL中,LEAD函数用于获取当前行之后的值。在这个例子中,它被用来获取...

    解决0-1背包问题的启发式算法.docx

    0-1背包问题是一种经典的优化...总的来说,0-1背包问题的启发式算法,尤其是基于贪心策略的方法,提供了一种在效率和解质量之间权衡的途径。通过深入理解和分析各种算法的特性,我们可以更好地解决实际中的优化问题。

    基于装载问题的3种算法

    回溯法是一种试探性的解决问题的方法,它尝试通过逐步构建可能的解决方案,并在发现无法得到满足条件的解时,撤销上一步的选择,返回到之前的决策点,继续尝试其他可能的选择。在装载问题中,回溯法通常采用深度优先...

    号码抽奖 c#写的,可以下下看看哦

    标题中的“号码抽奖 c#写的”表明这是一个使用C#编程语言开发的抽奖程序。C#是一种面向对象的、现代...对于初学者来说,阅读和分析源代码是一个很好的学习机会,可以了解到实际项目中如何运用C#语言和技术来解决问题。

    仿下下片网站源码,苹果cms内核,H5手机自适应,迅雷下载 在线播放,后台一键采集

    【标题】中的“仿下下片网站源码”指的是一个基于特定模板设计的网站源代码,这个模板可能模仿了某个知名或受欢迎的电影或视频分享网站的界面和功能。源码是网站的基础,包含了所有页面的HTML、CSS、JavaScript以及...

    百科基础知识(下下下下下下).exe

    百科基础知识目录: 希腊和罗马神话中的神和女神 中国历史名将 品酒知识 对葡萄酒的七大误解 中国部分城市的市花 吵架英语一百句 对中国最有威胁的十个国家 中国古代的酷刑 解放军军车新牌照代号 ...

    JSP+SQL+JAVABEAN的手机交易网

    这是我们培训时候第一个编写的项目,虽然很稚嫩,但是绝对能运行,在MyEclipse 6.0.1下绝对能运行.... 很适合初学JAVA的人用来学习 含有.SQL的数据库脚本,只需在SQL2000的MASTER数据下下按F5即可

    正则表达式请大家帮忙处理一下下.docx

    正则表达式是一种强大的文本处理工具,用于在字符串中匹配特定模式。在IT行业中,正则表达式广泛应用于数据验证、搜索与替换、文本解析等多个领域。以下是一些关于正则表达式的基础知识和常见用法: ...

    ucm修改文件下下文件个数限制

    - Oracle ECM是一套全面的内容管理解决方案,包括文档管理、记录管理、工作流、协作、报表等多个模块,旨在提高企业的效率和合规性。 通过以上步骤和知识点,可以有效地解决UCM文件夹下文件个数限制的问题,同时也...

    win7下下笔记本创建虚拟路由器

    win7下下笔记本创建虚拟路由器,,,,,, wifi热点

    常见的网络服务和网络命令下下

    9. **arp**:地址解析协议,用于将IP地址映射到物理地址,有助于解决MAC层的问题。 以上只是部分网络服务和网络命令的基本介绍,实际应用中还有许多其他服务和命令,如SNMP(简单网络管理协议)用于设备监控,端口...

    jdbc的配置文件需要的下下啊

    jdbc的工具类,平时用的很顺手,今天共享出来给大伙,有需要的下下

Global site tag (gtag.js) - Google Analytics