楼主: kphoniex

咨询关于查询优化如何提高缓存命中率的一个问题

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
发表于 2022-9-14 23:04 | 只看该作者
这个确实比较奇怪,那么实际数量到底是几行呢?你可以单独执行第9行和第10行的谓词,做一个COUNT看看。

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2022-9-15 16:07 | 只看该作者
newkid 发表于 2022-9-14 23:04
这个确实比较奇怪,那么实际数量到底是几行呢?你可以单独执行第9行和第10行的谓词,做一个COUNT看看。

第9行的是 580w
第10行的是 590w

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
13#
发表于 2022-9-15 21:23 | 只看该作者
我可能没说清楚,单独的意思是把 CR 表从计划里面取出来单独执行,两行的条件应该是 AND 的关系,第9行是在第10行的基础上进行过滤。
根据第一张图这个结果应该是12行。第二张图则是 2166K, 但是无论如何与你的实际数据相比都差了很多。

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2022-9-16 09:41 | 只看该作者
newkid 发表于 2022-9-15 21:23
我可能没说清楚,单独的意思是把 CR 表从计划里面取出来单独执行,两行的条件应该是 AND 的关系,第9行是在 ...

哦,第9行 and 第10行 出来的记录数是 580w

使用道具 举报

回复
论坛徽章:
24
2010年世界杯参赛球队:韩国
日期:2009-12-20 20:11:33天枰座
日期:2015-07-18 17:23:54托尼托尼·乔巴
日期:2017-01-25 09:38:19秀才
日期:2017-03-02 10:30:14秀才
日期:2017-03-02 10:30:35秀才
日期:2017-06-29 10:16:48技术图书徽章
日期:2017-07-11 09:10:26乌索普
日期:2023-01-05 23:01:5220周年集字徽章-年	
日期:2021-05-27 09:37:50蒙奇·D·路飞
日期:2022-10-27 21:49:38
15#
发表于 2022-9-16 17:01 | 只看该作者
计划里是个view里的join,  对内表做升序扫描时,和外表的join匹配数据多,所以读取量就少; 对内表做降序扫描时,扫描内表的数据都join不到外表,所以慢,直到扫描到能join的数据.

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
16#
发表于 2022-9-16 21:33 | 只看该作者
dhhb 发表于 2022-9-16 17:01
计划里是个view里的join,  对内表做升序扫描时,和外表的join匹配数据多,所以读取量就少; 对内表做降序扫 ...

你说得对,应该就是这个原因。那个 COUNT STOPLEY虽然计划里写在外层,但因为接下来几个都是外连接,而且我怀疑另外一端都是主键或唯一键,所以这些连接不会影响行数,COUNT STOPKEY完全可以推到里面先执行。CBO真是太聪明了!

使用道具 举报

回复
论坛徽章:
0
17#
 楼主| 发表于 2022-9-17 09:36 | 只看该作者
本帖最后由 kphoniex 于 2022-9-17 17:07 编辑
newkid 发表于 2022-9-16 21:33
你说得对,应该就是这个原因。那个 COUNT STOPLEY虽然计划里写在外层,但因为接下来几个都是外连接,而且我 ...

的确那几个表关联的都是主键。那这种语句有办法优化吗?
我把视图去掉,直接查单表, busisorno字段是varchar,上面加了正向,反向索引, 正向排序的执行计划就挺好,反向排序就很差

11111.jpg (251.02 KB, 下载次数: 16)

11111.jpg

22222.jpg (194.32 KB, 下载次数: 17)

22222.jpg

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
发表于 2022-9-18 04:39 | 只看该作者
你这个用例最好的索引是复合索引,两个列, (PRODUCTPACK_OCID, BUSISORTNO)

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2022-9-19 18:07 | 只看该作者
newkid 发表于 2022-9-18 04:39
你这个用例最好的索引是复合索引,两个列, (PRODUCTPACK_OCID, BUSISORTNO)

productpack_ocid 如果是 = 就能走到联合索引,
如果是 in ,只有一个值的情况,也能走到联合索引,如果是多个值就不行了

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
20#
发表于 2022-9-20 00:12 | 只看该作者
kphoniex 发表于 2022-9-19 18:07
productpack_ocid 如果是 = 就能走到联合索引,如果是 in ,只有一个值的情况,也能走到联合索引,如果是多 ...

事实胜于雄辩:

create table test as select t.*,owner as PRODUCTPACK_OCID, object_id as BUSISORTNO from all_objects t;

create index test_idx on test (PRODUCTPACK_OCID, BUSISORTNO);

select * from test where PRODUCTPACK_OCID in ('SYS','JSU') ORDER BY BUSISORTNO DESC;

Execution Plan
----------------------------------------------------------
Plan hash value: 324935210

----------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time  |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |          |  7319 |  1029K|       |   486   (1)| 00:00:01 |
|   1 |  SORT ORDER BY                        |          |  7319 |  1029K|  1472K|   486   (1)| 00:00:01 |
|   2 |   INLIST ITERATOR                     |          |       |       |       |            |       |
|   3 |    TABLE ACCESS BY INDEX ROWID BATCHED| TEST     |  7319 |  1029K|       |   248   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN                  | TEST_IDX |  7319 |       |       |    22   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

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

   4 - access("PRODUCTPACK_OCID"='JSU' OR "PRODUCTPACK_OCID"='SYS')

使用道具 举报

回复

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

本版积分规则 发表回复

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