按理说应该是走索引的: SELECT STATEMENT, GOAL = ALL_ROWS 2 1 25 TABLE ACCESS BY INDEX ROWID APPS SYSUSER 2 1 25 INDEX RANGE SCAN APPS SYSUSER_I 1 1 其中,SYSUSER_I就是我仿照你的方法,在ID上建的索引。 很明显是INDEX RANGE SCAN啊。你的表里数据量大不大? 字段BILLID的值的分布,有没有什么特点?比如说:哪个区间内的值比较多
我知道了。当前我的测试用表是sysuser,有一个account_id字段,以account_id建立索引“sysuser_i”,表中数据分布如下: 表中共10004条数据,其中,account_id=1的数据有9991条,account_id=2的数据有1条。 我执行下面两个查询,执行计划是不同的: 1.select * from sysuser where account_id = 1; --9991条,表中大部分数据 全表扫描,TABLE ACCESS FULL 因为表中绝大部分数据都是account_id = 1的,所以使用索引更慢。即使你建立了索引,10g的ORACLE也会智能地选用全表扫描。 2.select * from sysuser where account_id = 2; --只有1条, INDEX RANGE SCAN SYSUSER_I 选用索引方式。
哦,我知道你的意思了,数据分布问题:表中数据很散乱的,19万条记录 select billid,count(*) as x from iesk_stocktransitem group by billid having count(*)>10 order by x desc 大于100条记录的只有4个billid。理论是走索引的
1.访问谓词 和 过滤谓词 是什么东西?有什么区别(mssql好像没这东西) 一般叫Access(访问)和Filter(过滤)。 Access表示,这个条件的值会影响ORACLE数据的访问路径,是按表内容访问,还是按索引内容访问; Filter表示,条件的值不影响ORACLE数据的访问路径,只起过滤作用; 2.OPTIONS中的 "by Index RowId" 与"RANGE SCAN" 说明用了什么东西? 看执行计划时,先从缩进最多的那条开始看,就是从INDEX RANGE SCAN这条开始,说明当前的查询使用了索引扫描范围(这个按字面理解就行),即使用一个索引存取多行数据; 3.COST是什么成本? 这个我也不知道,呵呵,只知道一般都是越小越好。。
嗯,很清楚,谢谢兰兰!另外再问下(有点贪心),oracle的IO及执行点用CPU时间命令或参数是什么?显示有关由SQL 语句生成的磁盘活动量的信息 MSSQL对应的是 SET STATISTICS IO ON显示有关由SQL 语句占用CPU时间信息 MSSQL对应的是 SET STATISTICS TIME ON
SELECT STATEMENT, GOAL = ALL_ROWS 2 1 25
TABLE ACCESS BY INDEX ROWID APPS SYSUSER 2 1 25
INDEX RANGE SCAN APPS SYSUSER_I 1 1 其中,SYSUSER_I就是我仿照你的方法,在ID上建的索引。
很明显是INDEX RANGE SCAN啊。你的表里数据量大不大?
字段BILLID的值的分布,有没有什么特点?比如说:哪个区间内的值比较多
表中共10004条数据,其中,account_id=1的数据有9991条,account_id=2的数据有1条。
我执行下面两个查询,执行计划是不同的:
1.select * from sysuser where account_id = 1; --9991条,表中大部分数据
全表扫描,TABLE ACCESS FULL
因为表中绝大部分数据都是account_id = 1的,所以使用索引更慢。即使你建立了索引,10g的ORACLE也会智能地选用全表扫描。
2.select * from sysuser where account_id = 2; --只有1条,
INDEX RANGE SCAN SYSUSER_I
选用索引方式。
我用mssql的执行计划 是走索引的。怎么在oracle就不走索引(oracle不熟啊)楼上说的:"字段BILLID的值的分布,有没有什么特点?比如说:哪个区间内的值比较多"
这些我没搞过,应该是默认的
select billid,count(*) as x from iesk_stocktransitem group by billid having count(*)>10 order by x desc
大于100条记录的只有4个billid。理论是走索引的
我不怎么会看oracle的执行计划 ,楼上的“兰兰”大侠能不能帮我解释下(按这个图片给解释下)?
啊~~~~~~我知道了你的数据量太大了。
ORACLE在你建好索引之后,需要按你建的索引,先把数据重排一下。。搜索一下信息
这个截图说明,用到了索引IESK_STOCKTRANSITEM_BILLID..
1.访问谓词 和 过滤谓词 是什么东西?有什么区别(mssql好像没这东西)
2.OPTIONS中的 "by Index RowId" 与"RANGE SCAN" 说明用了什么东西?
3.COST是什么成本?
一般叫Access(访问)和Filter(过滤)。
Access表示,这个条件的值会影响ORACLE数据的访问路径,是按表内容访问,还是按索引内容访问;
Filter表示,条件的值不影响ORACLE数据的访问路径,只起过滤作用;
2.OPTIONS中的 "by Index RowId" 与"RANGE SCAN" 说明用了什么东西?
看执行计划时,先从缩进最多的那条开始看,就是从INDEX RANGE SCAN这条开始,说明当前的查询使用了索引扫描范围(这个按字面理解就行),即使用一个索引存取多行数据;
3.COST是什么成本?
这个我也不知道,呵呵,只知道一般都是越小越好。。
MSSQL对应的是 SET STATISTICS IO ON显示有关由SQL 语句占用CPU时间信息
MSSQL对应的是 SET STATISTICS TIME ON
我只知道可以在LINUX或者UNIX环境下,查看CPU和IO占用情况。至于你说的参数设置,我没有用过。。不好意思喽~~~