楼主: ligengocp

[精华] 一些sql语句的优化心得

[复制链接]
招聘 : 数据库管理员
论坛徽章:
1
授权会员
日期:2005-11-10 13:46:38
41#
发表于 2006-2-10 18:10 | 只看该作者
最初由 bodyguard 发布
[B]a,b表同结构,数据量很大,则
1:select a.* from a, b where a.c = b.c + and b.c is null
要比
2:select * from a where a.c not in (select c from b )
快很多
1和2的结果集不一定等价.
如果b.c列全部not null,1会返回空. [/B]


如果b.c列全部not null,1会返回空?

不对!!!!!

看下面的测试:
SQL> create table t1 (id number);

表已创建。

SQL> create table t2 (id2 number);

表已创建。

SQL> insert into t1 values(1);

已创建 1 行。

SQL> insert into t1 values(2);

已创建 1 行。

SQL> insert into t2 values(10);

已创建 1 行。

SQL> insert into t2 values(20);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t1;

        ID
----------
         1
         2

SQL> select * from t2;

       ID2
----------
        10
        20

SQL> select t1.* from t1, t2 where t1.id=t2.id2(+) and t2.id2 is null;

        ID
----------
         1
         2
--结果与下面的完全一样.
SQL> select * from t1 where t1.id not in (select * from t2);

        ID
----------
         1
         2

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
1
授权会员
日期:2005-11-10 13:46:38
42#
发表于 2006-2-10 18:24 | 只看该作者
最初由 dgzxc 发布
[B]SQL> select a.jh from daa01 a
  2  minus
  3  select a.jh from daa01 a,daa01@dagang b where a.jh=b.jh
  4  /

JH
----------------
123
33-15
334
T11

SQL>
SQL> select jh from daa01 a where not exists(select a.jh from daa01
  2  a,daa01@dagang b where a.jh=b.jh)
  3  /

JH
----------------

这两条语句的查询结果居然不一样????????????
为什么?
为什么?
为什么?
为什么?
为什么? [/B]


看看下面就知道为什么了,
SQL> select * from t1;

        ID
----------
         1
         2
        30

SQL> select * from t2;

       ID2
----------
        10
        20
        30
下面我们用t1 减去t2, 正确的结果应该是得到1和2
用你的语句, 找不到结果
SQL> select * from t1 where not exists (select * from t1,t2 where t1.id=t2.id2);

未选定行

为什么? 因为后面的子查询永远是有值的
SQL> select * from t1,t2 where t1.id=t2.id2
  2  ;

        ID        ID2
---------- ----------
        30         30
正确的语句应该是这样:
SQL> select * from t1 where not exists (select * from t2 where t1.id=t2.id2);

        ID
----------
         1
         2

问题在哪里? 在子查询中做比较的t1.id应该是主查询的t1中的id, 而不是子查询自己的t1(前面错误的查询就是这样d)

明白啦吧,

使用道具 举报

回复
论坛徽章:
81
青年奥林匹克运动会-马术
日期:2014-09-10 21:37:07奥运会纪念徽章:跳水
日期:2012-09-22 18:27:58奥运会纪念徽章:现代五项
日期:2012-09-07 17:33:44奥运会纪念徽章:铁人三项
日期:2012-06-15 21:27:24版主1段
日期:2012-05-15 15:24:11蜘蛛蛋
日期:2012-05-14 10:50:40灰彻蛋
日期:2012-03-06 19:24:222012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37
43#
发表于 2006-2-13 10:21 | 只看该作者
7,COUNT(*)与COUNT(某列)一样进行全表扫描Fast Full Index Scan,速度差不多

这个就不严谨了COUNT(某列)必须为主键或者有not null限制,否则它与count(*)将得不到相同的结果
就SQL优化来说
1、RBO下,对全表count(*)用的都是全表扫描
2、CBO下,对全表count(*)用主键或NOT NULL列对应的索引扫描
3、CBO下,如果表有BITMAP索引,则走位图索引是最快的方法(比快速索引全扫描快),且位图索引可以索引null值。但位图索引一般不用于OLTP系统。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表