查看: 3836|回复: 13

这句含有like的查询怎么优化?

[复制链接]
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
发表于 2010-7-29 17:12 | 显示全部楼层 |阅读模式
SQL> select n.*
  2  from NEWS_DATA n, NEWS_TO_CLASSIFY nc
  3  where n.NEWS_ID=nc.NEWS_ID
  4  and (nc.CLASSIFY_ID like 'A001%')
  5  order by n.NEWS_DATE desc;

232118 rows selected.

Elapsed: 00:01:52.48

Execution Plan
----------------------------------------------------------
Plan hash value: 1695460198
---------------------------------------------------------------------------------------------------------------------------------  
| Id   | Operation                   | Name                       | Rows  |   Bytes |TempSpc| Cost (%CPU)| Time      |
---------------------------------------------------------------------------------------------------------------------------------  
|   0  | SELECT STATEMENT    |                                  |   231K|      40M|               | 35930 (1)   | 00:07:12 |
|   1  |  SORT ORDER BY         |                                  |   231K|      40M|         92M| 35930 (1)  | 00:07:12 |
|*  2 |   HASH JOIN                |                                  |   231K|      40M|      5832K| 26564 (1)  | 00:05:19 |
|*  3 |    TABLE ACCESS FULL| NEWS_TO_CLASSIFY |   229K|  3136K|                |     326 (3)  | 00:00:04 |
|   4 |    TABLE ACCESS FULL | NEWS_DATA              |   431K|      70M|                | 22208 (1)  | 00:04:27 |
----------------------------------------------------------------------------------------------------------------------------------


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

   2 - access("N"."NEWS_ID"="NC"."NEWS_ID")
   3 - filter("NC"."CLASSIFY_ID" LIKE 'A001%')


Statistics
----------------------------------------------------------
        481  recursive calls
         28  db block gets
     166311  consistent gets
     120828  physical reads
          0  redo size
1134693596  bytes sent via SQL*Net to client
  649306986  bytes received via SQL*Net from client
     571020  SQL*Net roundtrips to/from client
          0  sorts (memory)
          1  sorts (disk)
     232118  rows processed


SQL> select n.*
  2  from NEWS_DATA n, NEWS_TO_CLASSIFY nc
  3  where n.NEWS_ID=nc.NEWS_ID
  4  and (nc.CLASSIFY_ID='A001')
  5  order by n.NEWS_DATE desc;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 593205674
------------------------------------------------------------------------------------------------------------------------------------
|  Id  | Operation                                       | Name                          | Rows  | Bytes | Cost (%CPU)| Time    |
------------------------------------------------------------------------------------------------------------------------------------
|    0 | SELECT STATEMENT                        |                                     |   282 | 52170 |   612   (1)| 00:00:08 |
|    1 |  SORT ORDER BY                             |                                     |   282 | 52170 |   612   (1)| 00:00:08 |
|    2 |   NESTED LOOPS                             |                                     |   282 | 52170 |   611   (0)| 00:00:08 |
|    3 |    TABLE ACCESS BY INDEX ROWID | NEWS_TO_CLASSIFY    |   280 |   3920 |     51   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN                    | IDX_CLASSIFY_ID         |   280 |            |       3   (0)| 00:00:01 |
|    5 |    TABLE ACCESS BY INDEX ROWID | NEWS_DATA                 |       1 |     171 |       2   (0)| 00:00:01 |
|*  6 |     INDEX UNIQUE SCAN                  | PK_NEWS_DATA           |       1 |            |       1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------------------------


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

   4 - access("NC"."CLASSIFY_ID"='A001')
   6 - access("N"."NEWS_ID"="NC"."NEWS_ID")


Statistics
----------------------------------------------------------
          3  recursive calls
          0  db block gets
         29  consistent gets
          0  physical reads
          0  redo size
      20765  bytes sent via SQL*Net to client
      10104  bytes received via SQL*Net from client
         10  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          4  rows processed


把nc.CLASSIFY_ID  like 'A001%' 改成 nc.CLASSIFY_ID='A001'为什么会改变两张表的访问方式?

[ 本帖最后由 XQKA 于 2010-7-29 17:26 编辑 ]
论坛徽章:
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
发表于 2010-7-29 17:13 | 显示全部楼层
一个返回22w一个访问4行,你比啥呢

使用道具 举报

回复
认证徽章
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
发表于 2010-7-29 17:15 | 显示全部楼层
呵呵,楼上的老大说的对,两条语句根本就不等价

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
 楼主| 发表于 2010-7-29 17:18 | 显示全部楼层
改变一张表的条件为什么会改变两张表的访问方式?

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
 楼主| 发表于 2010-7-29 17:18 | 显示全部楼层
原帖由 myth8860 于 2010-7-29 17:15 发表
呵呵,楼上的老大说的对,两条语句根本就不等价

难道我看不出来吗?

使用道具 举报

回复
认证徽章
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
发表于 2010-7-29 17:25 | 显示全部楼层

回复 #5 XQKA 的帖子

呵呵,不是这个意思,我只是觉得这两条语句完全不一样,没有可比性

第一条语句过滤条件选择性差,走全表扫描比用索引快了

使用道具 举报

回复
论坛徽章:
1
2009日食纪念
日期:2009-07-22 09:30:00
发表于 2010-7-29 17:33 | 显示全部楼层
可以把like改写成substr(a,x,x) = 'A001' ,然后建一个函数索引

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
 楼主| 发表于 2010-7-29 17:35 | 显示全部楼层
原帖由 myth8860 于 2010-7-29 17:25 发表
呵呵,不是这个意思,我只是觉得这两条语句完全不一样,没有可比性
第一条语句过滤条件选择性差,走全表扫描比用索引快了

有道理哦,
他们是不是有联动的关系?
即: ("NC"."CLASSIFY_ID"='A001')的选择性良好导致("N"."NEWS_ID"="NC"."NEWS_ID")的选择性良好。
于是两张表的访问方式都改变了。

做了一下count
("NC"."CLASSIFY_ID" LIKE 'A001%')的选择性的确很差。

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
 楼主| 发表于 2010-7-29 17:36 | 显示全部楼层
其实我不是比较这两条语句,只是我在测试时候发现这一现象。这是一个附加的问题。


我的问题主要还在于如何优化第一句sql。

使用道具 举报

回复
论坛徽章:
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
发表于 2010-7-29 17:36 | 显示全部楼层
nc.CLASSIFY_ID, 这个字段有无柱状图信息? 或者,加个索引提示,看看什么结果。

使用道具 举报

回复

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

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

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