楼主: heya

[精华] 求提高substr(a.name,1,length(b.name))=b.name性能

[复制链接]
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:虎
日期:2009-01-07 17:29:302010广州亚运会纪念徽章:卡巴迪
日期:2011-04-17 16:39:06灰彻蛋
日期:2011-06-18 13:42:50ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51复活蛋
日期:2011-12-27 17:46:382012新春纪念徽章
日期:2012-01-04 11:54:46ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19
21#
发表于 2011-3-26 11:55 | 只看该作者
精妙 anlinew

使用道具 举报

回复
论坛徽章:
5
2011新春纪念徽章
日期:2011-02-18 11:42:482012新春纪念徽章
日期:2012-02-07 09:59:352013年新春福章
日期:2013-02-25 14:51:24美羊羊
日期:2015-03-04 14:52:282015年新春福章
日期:2015-03-06 11:58:18
22#
发表于 2011-3-26 12:08 | 只看该作者
学习

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09秀才
日期:2016-03-24 09:10:24秀才
日期:2016-12-05 11:16:06
23#
发表于 2011-3-26 14:55 | 只看该作者
这样也能优化,把比较的数据分成两部分比较就优化了,还是想不通,我想这个不是hash  join的问题.你可以在原来的查询上强行走hash join 试试.

使用道具 举报

回复
论坛徽章:
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
24#
发表于 2011-3-26 15:27 | 只看该作者
很强!!
原帖由 anlinew 于 2010-12-9 19:53 发表
SQL> select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2  where substr(a.object_name,1,length(b.object_name))=b.object_name
  3  and substr(a.object_name,1,4)=substr(b.object_name,1,4)  4  and length(b.object_name)>3
  5  union all
  6  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  7  where substr(a.object_name,1,length(b.object_name))=b.object_name
  8  and length(b.object_name)3)
   6 - filter(LENGTH("B"."OBJECT_NAME") select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2  where substr(a.object_name,1,length(b.object_name))=b.object_name;

已选择108612行。

已用时间:  00: 06: 51.24
执行计划
----------------------------------------------------------
Plan hash value: 661671976

----------------------------------------------------------------------------------
| Id  | Operation          | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |             | 68676 |  7243K|  1745K  (1)| 05:49:05 |
|   1 |  NESTED LOOPS      |             | 68676 |  7243K|  1745K  (1)| 05:49:05 |
|   2 |   TABLE ACCESS FULL| TEST_OBJECT | 52544 |  4566K|   139   (1)| 00:00:02 |
|*  3 |   TABLE ACCESS FULL| TEST_OBJ1   |     1 |    19 |    33   (0)| 00:00:01 |
----------------------------------------------------------------------------------

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

   3 - filter("B"."OBJECT_NAME"=SUBSTR("A"."OBJECT_NAME",1,LENGTH("B"."OBJ
              ECT_NAME")))


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

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09秀才
日期:2016-03-24 09:10:24秀才
日期:2016-12-05 11:16:06
25#
发表于 2011-3-26 15:48 | 只看该作者
select count(*) from (
select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
      where instr(a.object_name,b.object_name)=1
      and substr(a.object_name,1,4)=substr(b.object_name,1,4)
      and length(b.object_name)>3
      union all
      select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
      where substr(a.object_name,1,length(b.object_name))=b.object_name
      and length(b.object_name)<4);

改成这样,我机上从33秒减到17秒

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09秀才
日期:2016-03-24 09:10:24秀才
日期:2016-12-05 11:16:06
26#
发表于 2011-3-26 16:41 | 只看该作者
用or 就行的
select count(*) from (
select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
      where (instr(a.object_name,b.object_name)=1
      and substr(a.object_name,1,6)=substr(b.object_name,1,6)
      and length(b.object_name)>=6)
      or
      (instr(a.object_name,b.object_name)=1
      and length(b.object_name)<6));

使用道具 举报

回复
论坛徽章:
22
ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152014年世界杯参赛球队: 比利时
日期:2014-06-15 20:40:142014年世界杯参赛球队: 科特迪瓦
日期:2014-06-30 19:29:262014年世界杯参赛球队:西班牙
日期:2014-07-08 21:49:56ITPUB元老
日期:2014-08-04 21:10:48优秀写手
日期:2014-09-24 06:00:13itpub13周年纪念徽章
日期:2014-10-03 10:51:25itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50
27#
发表于 2011-3-27 11:11 | 只看该作者
学习

使用道具 举报

回复
论坛徽章:
116
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-25 15:04:022010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:19
28#
发表于 2011-4-9 22:30 | 只看该作者
进来学习+收藏

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
29#
发表于 2011-4-10 00:24 | 只看该作者
anlinew的方法真不错

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
9
生肖徽章2007版:牛
日期:2009-03-10 21:26:492010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:葡萄牙
日期:2010-02-22 14:35:242010新春纪念徽章
日期:2010-03-01 11:19:092010广州亚运会纪念徽章:射击
日期:2010-09-08 23:42:12ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:拳击
日期:2010-10-30 00:46:582011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-03-01 08:49:39
30#
发表于 2011-4-10 00:51 | 只看该作者
精妙啊,使用条件
and substr(a.object_name,1,4)=substr(b.object_name,1,4)  打破了 substr(a.object_name,1,length(b.object_name))=b.object_name 这种“相关型”匹配的“魔咒”。
Mark,整理一下就写进blog。

使用道具 举报

回复

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

本版积分规则 发表回复

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