查看: 3623|回复: 13

这个语句怎么优化呢 ?建立反建、索引吗???

[复制链接]
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:35ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-01-04 11:55:42
发表于 2009-10-14 12:52 | 显示全部楼层 |阅读模式
SQL> select count(*)
  2    from product_property_ext ppe
  3   where ppe.product_property_id not in
  4         (select pp.product_property_id from product_property pp);

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

-----------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                               |     1 |    32 |   631M  (1)|999:59:59 |
|   1 |  SORT AGGREGATE     |                               |     1 |    32 |            |          |
|*  2 |   FILTER            |                               |       |       |            |          |
|   3 |    TABLE ACCESS FULL| PRODUCT_PROPERTY_EXT          |   193K|  6034K|   796   (2)| 00:00:10 |
|*  4 |    INDEX FULL SCAN  | PROT_PROY_IND_PRODUCT_PROY_ID |     1 |    32 |  3538   (1)| 00:00:43 |
-----------------------------------------------------------------------------------------------------

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

   2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "PRODUCT_PROPERTY" "PP" WHERE
              LNNVL("PP"."PRODUCT_PROPERTY_ID"<>:B1)))
   4 - filter(LNNVL("PP"."PRODUCT_PROPERTY_ID"<>:B1))
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-10-14 12:59 | 显示全部楼层
select count(*)
     from product_property_ext ppe
     where ppe.product_property_id not in
          (select pp.product_property_id from product_property pp where product_property_id is not null) and product_property_id  is not null;

使用道具 举报

回复
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:35ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-01-04 11:55:42
 楼主| 发表于 2009-10-14 13:26 | 显示全部楼层
多谢棉花   一下子就好了,,,,

使用道具 举报

回复
论坛徽章:
49
2010广州亚运会纪念徽章:台球
日期:2010-09-14 17:25:29ITPUB官方微博粉丝徽章
日期:2011-07-11 13:10:57ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-03-15 14:24:252012新春纪念徽章
日期:2012-01-04 11:53:54紫蛋头
日期:2012-03-07 10:09:01生肖徽章2007版:龙
日期:2012-03-07 10:13:00蜘蛛蛋
日期:2012-04-01 11:20:46奥运会纪念徽章:艺术体操
日期:2012-08-06 09:08:41奥运会纪念徽章:艺术体操
日期:2012-08-27 17:37:53
发表于 2009-10-14 13:39 | 显示全部楼层
为什么呢!能解释下吗?

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-10-14 13:44 | 显示全部楼层
原帖由 yueyangflash 于 2009-10-14 13:39 发表
为什么呢!能解释下吗?


加了IS NOT NULL,可以减少这一步,走索引即可:

2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "PRODUCT_PROPERTY" "PP" WHERE
              LNNVL("PP"."PRODUCT_PROPERTY_ID"<>:B1)))

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-10-14 14:13 | 显示全部楼层

回复 #5 ZALBB 的帖子

加了not null后,oracle能做查询重写成anti join

使用道具 举报

回复
论坛徽章:
44
青年奥林匹克运动会-自行车
日期:2014-09-12 22:37:432012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09咸鸭蛋
日期:2012-01-08 14:47:322012新春纪念徽章
日期:2012-01-04 11:50:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15迷宫蛋
日期:2011-08-14 17:30:33双黄蛋
日期:2011-05-28 20:32:46紫蛋头
日期:2011-05-18 20:41:51现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2009-10-14 14:18 | 显示全部楼层
原帖由 ZALBB 于 2009-10-14 13:44 发表


加了IS NOT NULL,可以减少这一步,走索引即可:

2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "PRODUCT_PROPERTY" "PP" WHERE
              LNNVL("PP"."PRODUCT_PROPERTY_ID":B1)))

我猜测加了IS NOT NULL之后,执行计划可能是HASH Join。
这样tuning,减少了Null值的过滤。

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-10-14 14:19 | 显示全部楼层

回复 #7 sdusun 的帖子

根本原因是原来的写法oracle不会去做query rewrite,所以才走filter

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2010-12-06 19:50:26数据库板块每日发贴之星
日期:2011-09-03 01:01:01迷宫蛋
日期:2011-09-08 16:30:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18
发表于 2009-10-14 14:28 | 显示全部楼层

回复 #8 棉花糖ONE 的帖子

棉花兄果然厉害!
能给大家解释一下:什么是query rewrite吗?

使用道具 举报

回复
认证徽章
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
发表于 2009-10-14 15:14 | 显示全部楼层
棉花糖 已经越来越牛了

使用道具 举报

回复

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

本版积分规则 发表回复

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