大表则要根据查询的记录数多少判断,如果查找的记录占整张表的比例很大(一般以7%为界),通过索引,查到的rowid就非常庞大,根据这些rowid回到表中查找反而可能更费时,因为一个rowid就需要一个物理I/O。这时如果考虑走全表扫描,由于一个物理I/O可以读取db_file_multiblock_read_count个块,反而可能更快返回结果。一般在十万级上的记录中查找少量记录,才考虑如何使用索引,提高检索效率。
能否提供详细的计算方法,还有从内存取1条数据和文件中取,时间会相差多少?
这个7%是如何得出来的

解决方案 »

  1.   

    你所说的应该是CBO下的执行计划选择策略在执行一条语句时,oracel能根据统计信息查得总记录数和符合要求的大致记录数,
    然后计算出一个比例。
    如果没有统计信息,可以动态采样,先取一部分试试,然后据此推知总数。
    可以推知,这两个方式都不会完全准确,只能是大致准确通过内存取值和硬盘IO,效率可能会有万倍的差别,一条记录的时间不具说服力
      

  2.   

    内存中读取数据和文件中读取数据,
    这个不能比较的,内存读取数据随时可以取到,因为它有一个高速缓冲,而文件中读取数据需要经常I/O磁盘访问
    效率就是与cpu读取I/O有关
      

  3.   


    这个看你PGA以及SGA的设置,如果设置合理的话,数据能一次性全部读入到内存中去,那么内存当然比文件要快了!否则差不多的啦!
      

  4.   


    这个是不错的,跟数据库的内存有关,还跟全表scan以及索引scan以及sql语句的写法有关系。
      

  5.   


    我怎么记得好像是10%吧!sqlsever里面才是7%啊?