现在是单表根据时间查询,速度10000条数据需要30s左右,如何提高查询速度? 如题:现在是单表根据时间查询,速度10000条数据需要30s左右,如何提高查询速度? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果返回的记录数占总记录数的4%以内,则在查询条件上加索引速度快,如果返回的记录数超过了总记录数的4%,则全表扫描快,我印象中应该是4%.要提高全表扫描的速度,就要加大DB_FILE_MULTIBLOCK_READ_COUNT这个参数值,其方法为ALTER SYSTEM SET DB_FILE_MULTIBLOCK_READ_COUNT = 100;这个单位是个块数,每次IO的数据量就是DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT了. 1,表数据量有多大?2,时间字段建了索引没有?3,判断的时候,对时间字段的处理是在=><符号左边还是右边?兄弟,你还是把sql语句贴出来,大家帮你看下 oracle里面是8%吧,sqlserver是10%吧?怎么会是4%呢? 关于返回数据量占记录总数的百分比为多大时应该创建B树索引的问题,tom在他的书中有一个说法,根据他的说法,我们都不对啊,呵呵。一般来讲,B*树索引会放在频繁使用查询谓词的列上,而且我们希望从表中只返回少量的数据(只占很小的百分比),或者最终用户请求立即得到反馈。在一个瘦(thin)表(也就是说,只有很少的几个列,或者列很小)上,这个百分比可能相当小。使用这个索引的查询应该只获取表中2%~3%(或者更少)的行。在一个胖(fat)表中(也就是说,这个表有很多列,或者列很宽),百分比则可能会上升到表的20%~25%。以上建议不一定直接适用于每一个人;这个比例并不直观,但很精确。文章出处:http://www.diybl.com/course/7_databases/oracle/oraclexl/2008126/97567.html通过搜索上面出现的文字可以进入到这段。 我的sql语句是这样写的:SELECT * FROM FIN.INVOICES VOS WHERE TO_CHAR(VOS.PRINT_DATE, 'yyyymmdd') BETWEEN '20080101' AND '20090101' AND ROWNUM <= 10000 嗯,看到了,有机会去实践下,就是不知道如何去实践下tom的说法啊?楼上的兄弟有实践的思路不? 我知道原因了,慢在这里:TO_CHAR(VOS.PRINT_DATE, 'yyyymmdd')因为用了TO_CHAR函数,索引失效了,走全表扫描。建议你这个判断换种方法可以不?别在左边用函数对字段处理,在betweed后面进行处理,试下吧,兄弟! 我计算了一下,这个应该是走全表扫描快,我建立的索引就是基于TO_CHAR函数的,而且执行计划就是按照索引查询的,但是速度就是不如全表扫描快 不会吧,你就2个条件啊,还有另外一个条件ROWNUM <= 10000 ,你去掉试试。消耗的时间怎么样啊? 我是这样想的,建两个表,一个thin的,一个fat的,thin的就两个字段, fat的50个字段,然后insert数据,可以用dba_objects反复做,当然也可以用rownum自己加一个主键,然后查询测试即可. ROWNUM <= 10000 ,你看你查的数据<10000啊,还没有到10%呢,干嘛要走全表扫描呢? 小数据量走索引扫描会快些吧! 那只能说你自己看书不仔细,tom从来就没有说过8%一说, 因为这个需要根据实际情况来定的.有时候可能20%都有可能,有时候可能8%都不行,那是因为你的表的大小,行的大小,blocksize的大小都有很大的关系的.再说了,建议你还是把tom讲索引的那一章看完了再来说话 安装oracle10g for CentOS5.4 归档日志空间 求一生僻的字符串处理写法 在redhat4.6 64位系统上安装oracle10g报错,请各位帮忙看看 触发器里带游标,请教!! 菜鸟一个头疼的问题。求助!谢谢! oracle基础问题 请教这样的视图能建吗?该如何建 关于oracle字段定义的几个问题向高手请教,在线等待,多谢!! 怎样在sql Plus中查看系统时间? 请教怎样编辑.bash_profile文件 为什么ORCALE不可以将常量做字段
要提高全表扫描的速度,就要加大DB_FILE_MULTIBLOCK_READ_COUNT这个参数值,其方法为
ALTER SYSTEM SET DB_FILE_MULTIBLOCK_READ_COUNT = 100;
这个单位是个块数,每次IO的数据量就是DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT了.
1,表数据量有多大?2,时间字段建了索引没有?3,判断的时候,对时间字段的处理是在=><符号左边还是右边?兄弟,你还是把sql语句贴出来,大家帮你看下
oracle里面是8%吧,sqlserver是10%吧?怎么会是4%呢?
关于返回数据量占记录总数的百分比为多大时应该创建B树索引的问题,tom在他的书中有一个说法,根据他的说法,我们都不对啊,呵呵。一般来讲,B*树索引会放在频繁使用查询谓词的列上,而且我们希望从表中只返回少量的数据(只占很小的百分比),或者最终用户请求立即得到反馈。在一个瘦(thin)表(也就是说,只有很少的几个列,或者列很小)上,这个百分比可能相当小。使用这个索引的查询应该只获取表中2%~3%(或者更少)的行。在一个胖(fat)表中(也就是说,这个表有很多列,或者列很宽),百分比则可能会上升到表的20%~25%。以上建议不一定直接适用于每一个人;这个比例并不直观,但很精确。文章出处:http://www.diybl.com/course/7_databases/oracle/oraclexl/2008126/97567.html通过搜索上面出现的文字可以进入到这段。
SELECT *
FROM FIN.INVOICES VOS
WHERE TO_CHAR(VOS.PRINT_DATE, 'yyyymmdd') BETWEEN '20080101' AND
'20090101'
AND ROWNUM <= 10000
嗯,看到了,有机会去实践下,就是不知道如何去实践下tom的说法啊?
楼上的兄弟有实践的思路不?
我知道原因了,慢在这里:TO_CHAR(VOS.PRINT_DATE, 'yyyymmdd')因为用了TO_CHAR函数,索引失效了,走全表扫描。建议你这个判断换种方法可以不?别在左边用函数对字段处理,在betweed后面进行处理,试下吧,兄弟!
不会吧,你就2个条件啊,还有另外一个条件ROWNUM <= 10000 ,你去掉试试。消耗的时间怎么样啊?
我是这样想的,建两个表,一个thin的,一个fat的,thin的就两个字段, fat的50个字段,然后insert数据,
可以用dba_objects反复做,当然也可以用rownum自己加一个主键,然后查询测试即可.
那只能说你自己看书不仔细,tom从来就没有说过8%一说, 因为这个需要根据实际情况来定的.有时候可能20%都有可能,有时候可能8%都不行,那是因为你的表的大小,行的大小,blocksize的大小都有很大的关系的.再说了,建议你还是把tom讲索引的那一章看完了再来说话