免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2980 | 回复: 11
打印 上一主题 下一主题

请教一下如何优化这个sql [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-12 08:52 |只看该作者 |倒序浏览
基于业务处理,我需要执行下面这个sql:
------------------------
select
                        field1
                        ,field2
from table_name a
where substr(field3,2,1)='2'
and not exists
(select
                        distinct field2
from table_name b
where substr(field3,2,1)<>;'2'
and a.field2=b.field2
)
-------------------------
select field1,field2,field3 from  table_name 得到的结果是:
------- ----------- --------
9XXX07  1XXXX163571 11      
9XXX07  1XXXX975903 00      
9XXX07  1XXXX975903 11      
9XXX23  1XXXX151687 00      
9XXX23  1XXXX151687 12      
9XXX23  1XXXX705440 33      
9XXX23  1XXXX909518 52      
9XXX23  1XXXX939127 00      
9XXX23  1XXXX969591 11      
9XXX23  1XXXX971643 11      
9XXX23  1XXXX978374 11      
9XXX24  1XXXX909518 32      
9XXX25  1XXXX939127 52      
9XXX26  1XXXX951932 52      
9XXX27  1XXXX954010 11      

  15 record(s) selected.
-------------------
执行上面的结果出来的数据应该是:
------ -----------
9XXX23 1XXXX909518
9XXX24 1XXXX909518
9XXX26 1XXXX951932

  3 record(s) selected.


这样的sql,还可以优化,以加快执行速度么?

论坛徽章:
0
2 [报告]
发表于 2005-08-12 09:33 |只看该作者

请教一下如何优化这个sql

除去建索引以外,按照逻辑关系还有的优化不?
sql还能有另外一种写法么?

论坛徽章:
0
3 [报告]
发表于 2005-08-12 10:54 |只看该作者

请教一下如何优化这个sql

table_name a和 table_name b是结构相同的?

论坛徽章:
0
4 [报告]
发表于 2005-08-12 11:24 |只看该作者

请教一下如何优化这个sql

同一个表

论坛徽章:
0
5 [报告]
发表于 2005-08-12 11:27 |只看该作者

请教一下如何优化这个sql

为了简单,我取表名就是叫:table_name
这个sql就是为了从一张表里面,按照业务逻辑取出某些记录而已
实际中的这个表由于数据量太大,效率太低

论坛徽章:
0
6 [报告]
发表于 2005-08-12 12:58 |只看该作者

请教一下如何优化这个sql

这个表建索引了吗? 经常插入和更新这个表的话,那么就做一下reorg,runstats

论坛徽章:
0
7 [报告]
发表于 2005-08-12 13:03 |只看该作者

请教一下如何优化这个sql

我认为做连接比两次扫描表会好很多。不过用连接的写法没想出来。

论坛徽章:
0
8 [报告]
发表于 2005-08-12 14:16 |只看该作者

请教一下如何优化这个sql

主要是这样跑sql,虽然逻辑关系是照顾到了,但是效率太低了。
想改写一下这个sql,却还没想到怎么写

论坛徽章:
0
9 [报告]
发表于 2005-08-12 16:19 |只看该作者

请教一下如何优化这个sql

有其它写法:

  1. select a.field1,a.field2 from table_name a where substr(a.field3,2,1)='2' and field2 not in (select field2 from table_name where substr(field3,2,1)<>;'2');
复制代码


但不会比你的快!

论坛徽章:
0
10 [报告]
发表于 2005-08-12 16:42 |只看该作者

请教一下如何优化这个sql

谢谢
问题解决了,虽然还是两次扫描,但效率提高了很多
-----------------------
        select        
          field1,
                field2
        from
(
                select
                                        a.field1,
                                        a.field2,
                                        case when b.field2 is null then 1 else 0 end as  mark
                from       
                        (select
                                                field1
                                                ,field2
                        from table_name a
                        where substr(field3,2,1)='2'
                        )a
                        left outer join
                        (select
                                                field1
                                                ,field2
                        from table_name b
                        where substr(field3,2,1)<>;'2'
                        )b
                        on a.field2=b.field2 and a.field1=b.field1
)c
where mark=1
group by field1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP