我想关注一下你的rule模式下的执行计划(特别是 count(*) 和其他的差异)
这些都是无干扰相同情况下的多次测试么cost下估计都是 index fast full scan 然后,你的
FREQ NUMBER (6,2),
UAB FLOAT (53),
UBC FLOAT (53),
UCA FLOAT (53))
这几个列是不是数据很少?恐怕你的表的数据量加起来还没有你的索引占的空间大 :)
这些都是无干扰相同情况下的多次测试么cost下估计都是 index fast full scan 然后,你的
FREQ NUMBER (6,2),
UAB FLOAT (53),
UBC FLOAT (53),
UCA FLOAT (53))
这几个列是不是数据很少?恐怕你的表的数据量加起来还没有你的索引占的空间大 :)
解决方案 »
- 查询语句?
- 这段查询代码是什么意思?
- 如何对数据库中的某个字段进行加密(插入时加密,提取时解密)
- 请教高手union all与group by一起用时出错的一个问题
- SQL语句问题【急。。。。。。。。。。。。。。。。。。。。。。】
- 请问有constraint的表格如何update
- 请问如何在oracle817中使用图形化数据库设计界面?
- SQLServer到Oracle遇到的问题
- 在数据库中,不知为什么,出现了一个 " NO USE"这样的表,可怎样也无法drop,求助,急!~~~
- redhat下安装oracle11g图形界面乱码
- oracle中日期与时间的问题 各位多多指教 谢谢 (急!急!急!急!急!急!)
- 请教高手!怎么样使得oracle817的索引支持全模糊查询??
我又试了一次
发现在RULE模式下四条语句的执行计划都是
0 SELECT STATEMENT Optimizer=RULE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'TSUM_DATA_W'
cost下估计都是 index fast full scan ,您说的没错
另
FREQ NUMBER (6,2),
UAB FLOAT (53),
UBC FLOAT (53),
UCA FLOAT (53))
四个列都有数据,另提供统计信息,在RULE模式下:
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4660 consistent gets
4652 physical reads
0 redo size
379 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
在CHOOSE模式下:
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3367 consistent gets
3355 physical reads
0 redo size
379 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed另再提供一个数据:
第一次测试COUNT(*)在RULE模式下用2.0s,以后就一直1.08s,为什么?望您能帮俺一把!
这是因为第一次大量的io,以后数据保存在了内存中,所以这种测试,一定要在没有其他干扰的相同环境中多次测试,直到数据稳定!至于为什么full table scan 比 index fast full scan 快这是因为:
关于索引,你的索引键值太多,占行的比例太大,索引叶子长度是: 键值长度+ rowid 长度(18 字节),然后索引还有树状结构等开销,这个百分比也不可忽略所以最后可能造成的原因就是索引的io比 full table scan 还大!还有一个问题就是: 根据你的statistics来看,索引物理io似乎更少一些,但我不确信是不是因为所统计的块中 数据量的不一致。因为块中可能有很多空闲,不知道这个会否对 统计速度造成影响.或者,还是因为你都是只测试了一次造成的这样的结果。请每个测试均多次,报告出稳定的时间值和statistics来
我上面的测试都是多次的结果,
这个您放心,
时间值和statistics都比较稳定
我现在不明的就是:
为什么统计出来的物理IO索引的要少
却花费时间要长?
另您这句“根据你的statistics来看,索引物理io似乎更少一些,但我不确信是不是因为所统计的块中 数据量的不一致。因为块中可能有很多空闲,不知道这个会否对 统计速度造成影响.”
俺不明白!能再详细点吗?
我没有测试难以确信,但一切都是猜测:如果你的表行长度很大,你再加一个 char(200) 这样的字段,估计索引扫描就应该快一些对于full scan来说,是从表的头扫描到尾(HWM)
对于索引,相临叶子节点之间存在着“指针”,也就是说做范围扫描的时候不用每次都从根扫描到叶子,但我不知道在范围扫描中这种结构会否带来计算的时间上的开销,这个开销有多大?尤其是你的两种扫描方式io差异不是特别大,那么在这种情况下什么因素占据主导,我无法确定。我只是猜测各种可能,因为尤其在差异比较小的情况下,任何一个环节的消息差异,在原来的经验中可以忽略掉的因素,可能突显出来