技术开发 频道

如何确定操作系统读缓冲区的大小

【IT168 技术文档】

    在全数据表扫描过程中,ORACLE将运用它的多块读能力,一次扫描多个块。可以一次读的块的数目由数据库的init.ora文件中的B_FILE_MULTIBLOCK_READ_COUNT设置决定。如数据库块的大小为4KB,DB_FILE_MULTIBLOCK_READ_COUNT为16,则单个读中可以读64KB。当单个读的字节数与操作系统读缓冲区的大小相等时将充分利用读缓冲区。因此,设置合适的DB_FILE_MULTIBLOCK_READ_COUNT值对数据库的读性能有很大帮助。

    但如何确定操作系统读缓冲区的大小呢?网友overtime给出了如下回复:

    其实你是想知道OS能提供的一次IO的最大值。这在Oracle中由一个常量(SSTIOMAX)限制了。可以用以下方法测试oracle这个值的大小:

alter session set events '10046 trace name context forever, level 8' alter session set db_file_multiblock_read_count=256;

    一次full table scan (注意这个表的extent至少大于db_file_multiblock_read_count*db_block_size)

    查看相应的trace文件,里面应有如下('db file scattered read)内容:

WAIT #1: nam='db file scattered read' ela= 0 p1=1 p2=4986 p3=128

    p3就是Oracle一次IO的块数。

    具体参见:
    http://www.oracledba.co.uk/tips/mbrc.htm
    http://61.144.248.54:1521/oracle/mbrc.html

    关于alter session set events '10046 trace name context forever, level 8' 中10046,trace name context forever,level 8的详细含义,网友Yong Huang给出了如下回复:

    All events are unpublished in documentation. But a large number of them are scattered around in metalink articles. Event 10046 may be the most well-known of all. You can often get a brief description of the event by oerr:
    $ oerr ora 10046
    10046, 00000, "enable SQL statement timing"
    // *Cause:
    // *Action:

    This particular event has levels 2, 4, 8 and 12. 2 is equivalent to setting SQL_TRACE to true. 4,8,12 gives you incrementally more information (bind variable bound values, wait events etc). Just about any Oracle book talks about this event. But other events may be more obscure and so you have to learn them from metalink articles and some Web sites (Steve Adams' and Jonathan Lewis' sites are the best source).

    If you want to study Oracle events, you have to study them one by one. The trace files generated by setting them are usually unique in the sense that knowing how to interprete 10046 trace doesn't mean you know how to interprete, e.g. 10053 (another event people sometimes use).

0
相关文章