楼主: heya

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

[复制链接]
论坛徽章:
9
生肖徽章:马
日期:2006-09-07 17:03:04会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB9周年纪念徽章
日期:2010-10-08 09:32:27
51#
发表于 2011-4-13 21:31 | 只看该作者
真真见识了

使用道具 举报

回复
论坛徽章:
84
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
52#
发表于 2011-4-19 17:10 | 只看该作者
按钮,截取长度为什么要用4?
如果把取的长度缩短,速度会更快:
已写入 file afiedt.buf

  1  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2        where instr(a.object_name,b.object_name)=1
  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)<4
SQL> /

已选择6843行。

已用时间:  00: 00: 01.01

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

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |  2723 |   247K|  4613  (96)| 00:00:56 |
|   1 |  UNION-ALL          |             |       |       |            |          |
|*  2 |   HASH JOIN         |             |   139 | 12927 |   191   (2)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
|   5 |   NESTED LOOPS      |             |  2584 |   234K|  4422   (1)| 00:00:54 |
|*  6 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS FULL| TEST_OBJECT |    79 |  6873 |   132   (1)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   2 - access(SUBSTR("A"."OBJECT_NAME",1,4)=SUBSTR("B"."OBJECT_NAME",1,4))
       filter(INSTR("A"."OBJECT_NAME","B"."OBJECT_NAME")=1)
   3 - filter(LENGTH("B"."OBJECT_NAME")>3)
   6 - filter(LENGTH("B"."OBJECT_NAME")<4)
   7 - filter("B"."OBJECT_NAME"=SUBSTR("A"."OBJECT_NAME",1,LENGTH("B"."OBJE
              CT_NAME")))


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

SQL> ed
已写入 file afiedt.buf

  1  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2        where instr(a.object_name,b.object_name)=1
  3        and substr(a.object_name,1,2)=substr(b.object_name,1,2)
  4        and length(b.object_name)>1
  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)<2
SQL> /

已选择6843行。

已用时间:  00: 00: 00.29

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

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |  2723 |   247K|  4613  (96)| 00:00:56 |
|   1 |  UNION-ALL          |             |       |       |            |          |
|*  2 |   HASH JOIN         |             |   139 | 12927 |   191   (2)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
|   5 |   NESTED LOOPS      |             |  2584 |   234K|  4422   (1)| 00:00:54 |
|*  6 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS FULL| TEST_OBJECT |    79 |  6873 |   132   (1)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   2 - access(SUBSTR("A"."OBJECT_NAME",1,2)=SUBSTR("B"."OBJECT_NAME",1,2))
       filter(INSTR("A"."OBJECT_NAME","B"."OBJECT_NAME")=1)
   3 - filter(LENGTH("B"."OBJECT_NAME")>1)
   6 - filter(LENGTH("B"."OBJECT_NAME")<2)
   7 - filter("B"."OBJECT_NAME"=SUBSTR("A"."OBJECT_NAME",1,LENGTH("B"."OBJE
              CT_NAME")))


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

SQL> ed
已写入 file afiedt.buf

  1  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2        where instr(a.object_name,b.object_name)=1
  3        and substr(a.object_name,1,2)=substr(b.object_name,1,2)
  4        and length(b.object_name)>1
  5        union all
  6        select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  7        where substr(a.object_name,1,1)=b.object_name
  8*       and length(b.object_name)=1
SQL> /

已选择6843行。

已用时间:  00: 00: 00.26

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

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |   656 | 61008 |   382  (51)| 00:00:05 |
|   1 |  UNION-ALL          |             |       |       |            |          |
|*  2 |   HASH JOIN         |             |   139 | 12927 |   191   (2)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
|*  5 |   HASH JOIN         |             |   517 | 48081 |   191   (2)| 00:00:03 |
|*  6 |    TABLE ACCESS FULL| TEST_OBJ1   |     7 |    42 |    56   (0)| 00:00:01 |
|   7 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   2 - access(SUBSTR("A"."OBJECT_NAME",1,2)=SUBSTR("B"."OBJECT_NAME",1,2))
       filter(INSTR("A"."OBJECT_NAME","B"."OBJECT_NAME")=1)
   3 - filter(LENGTH("B"."OBJECT_NAME")>1)
   5 - access("B"."OBJECT_NAME"=SUBSTR("A"."OBJECT_NAME",1,1))
   6 - filter(LENGTH("B"."OBJECT_NAME")=1)


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

使用道具 举报

回复
论坛徽章:
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
53#
发表于 2011-4-19 17:29 | 只看该作者
这是个经验值,有些时候,如果substr取得太短,就可能hash 碰撞太多,性能反而差。
很难说,得根据实际情况来判断。
原帖由 Ora-600 于 2011-4-19 17:10 发表
按钮,截取长度为什么要用4?
如果把取的长度缩短,速度会更快:
已写入 file afiedt.buf

  1  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2        where instr(a.object_name,b.object_name)=1
  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) /

已选择6843行。

已用时间:  00: 00: 01.01

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

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |  2723 |   247K|  4613  (96)| 00:00:56 |
|   1 |  UNION-ALL          |             |       |       |            |          |
|*  2 |   HASH JOIN         |             |   139 | 12927 |   191   (2)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
|   5 |   NESTED LOOPS      |             |  2584 |   234K|  4422   (1)| 00:00:54 |
|*  6 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS FULL| TEST_OBJECT |    79 |  6873 |   132   (1)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   2 - access(SUBSTR("A"."OBJECT_NAME",1,4)=SUBSTR("B"."OBJECT_NAME",1,4))
       filter(INSTR("A"."OBJECT_NAME","B"."OBJECT_NAME")=1)
   3 - filter(LENGTH("B"."OBJECT_NAME")>3)
   6 - filter(LENGTH("B"."OBJECT_NAME") ed
已写入 file afiedt.buf

  1  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2        where instr(a.object_name,b.object_name)=1
  3        and substr(a.object_name,1,2)=substr(b.object_name,1,2)
  4        and length(b.object_name)>1
  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) /

已选择6843行。

已用时间:  00: 00: 00.29

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

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |  2723 |   247K|  4613  (96)| 00:00:56 |
|   1 |  UNION-ALL          |             |       |       |            |          |
|*  2 |   HASH JOIN         |             |   139 | 12927 |   191   (2)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
|   5 |   NESTED LOOPS      |             |  2584 |   234K|  4422   (1)| 00:00:54 |
|*  6 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS FULL| TEST_OBJECT |    79 |  6873 |   132   (1)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   2 - access(SUBSTR("A"."OBJECT_NAME",1,2)=SUBSTR("B"."OBJECT_NAME",1,2))
       filter(INSTR("A"."OBJECT_NAME","B"."OBJECT_NAME")=1)
   3 - filter(LENGTH("B"."OBJECT_NAME")>1)
   6 - filter(LENGTH("B"."OBJECT_NAME") ed
已写入 file afiedt.buf

  1  select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  2        where instr(a.object_name,b.object_name)=1
  3        and substr(a.object_name,1,2)=substr(b.object_name,1,2)
  4        and length(b.object_name)>1
  5        union all
  6        select a.*,b.object_name from TEST_OBJECT a, TEST_OBJ1 b
  7        where substr(a.object_name,1,1)=b.object_name
  8*       and length(b.object_name)=1
SQL> /

已选择6843行。

已用时间:  00: 00: 00.26

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

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |   656 | 61008 |   382  (51)| 00:00:05 |
|   1 |  UNION-ALL          |             |       |       |            |          |
|*  2 |   HASH JOIN         |             |   139 | 12927 |   191   (2)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL| TEST_OBJ1   |    33 |   198 |    56   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
|*  5 |   HASH JOIN         |             |   517 | 48081 |   191   (2)| 00:00:03 |
|*  6 |    TABLE ACCESS FULL| TEST_OBJ1   |     7 |    42 |    56   (0)| 00:00:01 |
|   7 |    TABLE ACCESS FULL| TEST_OBJECT | 42235 |  3588K|   134   (1)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   2 - access(SUBSTR("A"."OBJECT_NAME",1,2)=SUBSTR("B"."OBJECT_NAME",1,2))
       filter(INSTR("A"."OBJECT_NAME","B"."OBJECT_NAME")=1)
   3 - filter(LENGTH("B"."OBJECT_NAME")>1)
   5 - access("B"."OBJECT_NAME"=SUBSTR("A"."OBJECT_NAME",1,1))
   6 - filter(LENGTH("B"."OBJECT_NAME")=1)


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

使用道具 举报

回复
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
54#
发表于 2011-4-20 11:59 | 只看该作者
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 substr(a.object_name, 1, N) = substr(b.object_name, 1, N)
   and length(b.object_name) >= N
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) < N;

N=1:Elapsed: 00:01:30.91
N=2:Elapsed: 00:00:16.76
N=3:Elapsed: 00:00:09.75
N=4:Elapsed: 00:00:09.63
N=5:Elapsed: 00:00:07.17
N=6:Elapsed: 00:00:06.97
N=7:Elapsed: 00:00:11.01
N=8:Elapsed: 00:00:19.21

这是偶的结果。

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
55#
发表于 2011-4-20 14:54 | 只看该作者
拍手叫好!

使用道具 举报

回复
论坛徽章:
6
ITPUB季度 技术新星
日期:2011-08-31 15:27:58ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36咸鸭蛋
日期:2012-03-05 13:10:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00优秀写手
日期:2013-12-18 09:29:09
56#
发表于 2011-5-19 13:35 | 只看该作者
好帖!

使用道具 举报

回复
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
57#
发表于 2011-5-19 14:14 | 只看该作者
厉害!

学习

使用道具 举报

回复
论坛徽章:
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
58#
发表于 2011-5-19 14:53 | 只看该作者
substr(a.object_name, 1, length(b.object_name)) = b.object_name
——————————————————————

如果不是从1开始,会怎么样?

使用道具 举报

回复
论坛徽章:
4
蜘蛛蛋
日期:2011-06-08 16:02:522012新春纪念徽章
日期:2012-01-04 11:58:18秀才
日期:2016-08-05 10:38:01秀才
日期:2016-08-05 10:38:11
59#
发表于 2011-5-19 15:11 | 只看该作者
这个帖子集中这么多高手。。

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
60#
发表于 2011-5-19 16:15 | 只看该作者
回过头讲,这个是数据结构设计问题.

为什么这样设计字段.

[ 本帖最后由 lfree 于 2011-5-19 16:29 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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