查看: 1852|回复: 12

【求助】相同SQL 语句,返回不同结果?

[复制链接]
论坛徽章:
5
奥运会纪念徽章:花样游泳
日期:2012-10-25 11:33:47蜘蛛蛋
日期:2013-01-02 16:23:092013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
发表于 2014-2-12 12:04 | 显示全部楼层 |阅读模式
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set linesize 999
SQL> set autotrace trace exp
SQL> select *
  2    from k_xmys_xm01_jb a
  3    ,(select *
  4                 from T_PUBMOFDEP
  5                where Code in ('03',
  6                               '04',
  7                               '05',
  8                               '06',
  9                               '07',
10                               '08',
11                               '11',
12                               '12',
13                               '16',
14                               '20',
15                               '96')) b
16  where a.归口科室 = b.code(+);

执行计划
----------------------------------------------------------
Plan hash value: 3229042518

-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |  3063 |  3221K|    15   (0)| 00:00:01 |
|   1 |  NESTED LOOPS OUTER          |                |  3063 |  3221K|    15   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL          | K_XMYS_XM01_JB |  3063 |   257K|    15   (0)| 00:00:01 |
|   3 |   TABLE ACCESS BY INDEX ROWID| T_PUBMOFDEP    |     1 |   991 |     0   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN         | T_MOFDEP       |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("A"."归口科室"="T_PUBMOFDEP"."CODE"(+))
       filter("CODE"(+)='03' OR "CODE"(+)='04' OR "CODE"(+)='05' OR "CODE"(+)='06' OR
              "CODE"(+)='07' OR "CODE"(+)='08' OR "CODE"(+)='11' OR "CODE"(+)='12' OR "CODE"(+)='16'
              OR "CODE"(+)='20' OR "CODE"(+)='96')
【这里返回13条记录】
SQL> select count(*)
  2    from k_xmys_xm01_jb a
  3    ,(select *
  4                 from T_PUBMOFDEP
  5                where Code in ('03',
  6                               '04',
  7                               '05',
  8                               '06',
  9                               '07',
10                               '08',
11                               '11',
12                               '12',
13                               '16',
14                               '20',
15                               '96')) b
16  where a.归口科室 = b.code(+);

执行计划
----------------------------------------------------------
Plan hash value: 3595819435

---------------------------------------------------------------------------------------
| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |              |     1 |    12 |     0   (0)|          |
|   1 |  SORT AGGREGATE        |              |     1 |    12 |            |          |
|*  2 |   FILTER               |              |       |       |            |          |
|   3 |    INDEX FAST FULL SCAN| SYS_C0038658 |  3063 | 36756 |     4   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(NULL IS NOT NULL)
【这里返回值为0】


请问问题出在什么地方?从那方面着手解决?谢谢!


论坛徽章:
3
2014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08优秀写手
日期:2014-02-20 06:00:12
发表于 2014-2-12 12:26 | 显示全部楼层
INDEX FAST FULL SCAN
走的是索引
你强制全表看看,或者收集统计信息看看(如不行 重建索引看看)

使用道具 举报

回复
论坛徽章:
78
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
发表于 2014-2-12 12:32 | 显示全部楼层
bug

使用道具 举报

回复
论坛徽章:
5
奥运会纪念徽章:花样游泳
日期:2012-10-25 11:33:47蜘蛛蛋
日期:2013-01-02 16:23:092013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
 楼主| 发表于 2014-2-12 12:34 | 显示全部楼层
wjkcsu 发表于 2014-2-12 12:26
INDEX FAST FULL SCAN
走的是索引
你强制全表看看,或者收集统计信息看看(如不行 重建索引看看)

这些都试过了,不可以。我觉得问题应该在NOT IS NOT NULL上。

使用道具 举报

回复
论坛徽章:
78
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
发表于 2014-2-12 12:36 | 显示全部楼层
SYS_C0038658 应该是k_xmys_xm01_jb 的主键索引吧,如果T_PUBMOFDEP.code没有唯一约束,那这就是彻头彻尾cbo的bug
但是,我很好奇怎么会前面13后面0,哪怕后面是1也能解释通,0,实在说不通

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-2-12 12:57 | 显示全部楼层
b.code 是唯一键,table elimination,bug

2 - filter(NULL IS NOT NULL) 这玩意导致的问题,一条都匹配不到



使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-2-12 12:59 | 显示全部楼层
code是唯一键,所以表消除,只访问a表即可,因为null is not null导致根本无需访问,主要是null is not null导致的bug

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-2-12 13:01 | 显示全部楼层
演示下,可以加hint解决,应该还可以修改参数把这个特性在session级别禁掉


SQL> SELECT COUNT(*)  FROM b,
  2  (SELECT * FROM a WHERE a.ID IN (1,2,3)) a
  3  WHERE b.ID=a.ID(+);




执行计划
----------------------------------------------------------
Plan hash value: 3030753126


----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |     4 |     0   (0)|          |
|   1 |  SORT AGGREGATE     |      |     1 |     4 |            |          |
|*  2 |   FILTER            |      |       |       |            |          |
|   3 |    TABLE ACCESS FULL| B    |   169K|   663K|   103   (1)| 00:00:02 |
----------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


  2 - filter(NULL IS NOT NULL)




统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        422  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


SQL> SELECT/*+no_query_transformation*/ COUNT(*)  FROM b,
  2  (SELECT * FROM a WHERE a.ID IN (1,2,3)) a
  3  WHERE b.ID=a.ID(+);




执行计划
----------------------------------------------------------
Plan hash value: 4238749267


---------------------------------------------------------------------------------------
| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |              |     1 |    17 |   108   (3)| 00:00:02 |
|   1 |  SORT AGGREGATE        |              |     1 |    17 |            |          |
|*  2 |   HASH JOIN RIGHT OUTER|              |   169K|  2821K|   108   (3)| 00:00:02 |
|   3 |    VIEW                |              |     3 |    39 |     3   (0)| 00:00:01 |
|   4 |     INLIST ITERATOR    |              |       |       |            |          |
|*  5 |      INDEX UNIQUE SCAN | SYS_C0017318 |     3 |    12 |     3   (0)| 00:00:01 |
|   6 |    TABLE ACCESS FULL   | B            |   169K|   663K|   103   (1)| 00:00:02 |
---------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   2 - access("B"."ID"="A"."ID"(+))
   5 - access("A"."ID"=1 OR "A"."ID"=2 OR "A"."ID"=3)




统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        321  consistent gets
          0  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-2-12 13:03 | 显示全部楼层
修改SQL:
SELECT COUNT(*) FROM (
SELECT *   FROM b,
(SELECT * FROM a WHERE a.ID IN (1,2,3)) a
WHERE b.ID=a.ID(+) AND ROWNUM>0
);

使用道具 举报

回复
论坛徽章:
5
奥运会纪念徽章:花样游泳
日期:2012-10-25 11:33:47蜘蛛蛋
日期:2013-01-02 16:23:092013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
 楼主| 发表于 2014-2-12 13:13 | 显示全部楼层
大大,你太牛了。感谢。通过你的办法解决了。我去找找有什么参数可以session级别屏蔽掉这个

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年9月21日~23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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