`

行预取研究

阅读更多

1.行预取         

      在应用程序从数据库读取数据的时候,它可以一条一条地读取,也可以更好一点,一次读取多条记录。一次读取多条记录被称为行预取.

 1.1运行机制

      每次应用程序请求驱动从数据库返回1条记录的时候,会预取多条记录并将它们存储在客户端的内存中。这样,多个后续的请求就不需要执行数据库调用来读取数据。可以直接从客户端内存中得到它们。结果,到数据库的往返次数随预取记录数量的增加呈比例地降低。因此,检索包含大量记录的结果集的开销会显著降低。

      必须明白的是,在没有行预取的情况下,检索性能之所以差并不是数据库引擎造成的。而是应用程序导致了低性能,返回来又被低性能拖累。

      尽管行预取功能对客户端来讲更加重要,数据库也能从中得到好处。事实上,行预取功能显著地降低了逻辑读的次数。

     下面演示在PL/SQL、JDBC以及ODP.NET环境下有效地使用行预取功能。

  1。PL/SQL

      如果在编译的时候动态初始化参数plsql_optimize_level被设置成2或者2以上,就会针对基于游标的FOR循环使用行预取功能。

  ALTER SESSION SET plsql_optimize_level = 2;

BEGIN
  FOR c IN (SELECT * FROM t)
  LOOP
    -- process data
    NULL;
  END LOOP;
END;

   必须强调的是,行预取功能只能自动地应用到基于游标的FOR循环中。要对其他类型的游标使用行预取功能,必须使用BULK COLLECT 子句。下面是一个使用它来操作隐式游标的例子。

 

DECLARE
  TYPE t_t IS TABLE OF t%ROWTYPE;
  l_t t_t;
BEGIN
  SELECT * BULK COLLECT INTO l_t
  FROM t;
  FOR i IN l_t.FIRST..l_t.LAST
  LOOP
    -- process data
    NULL;
  END LOOP;
END;

     在前面的PL/SQL匿名块中,结果集中的所有记录都是在一次读取中返回的。如果记录数量很大,会需要使用大量的内存来保存它。因此,在实际操作中,要么知道要返回的记录数是有限的,要么需要使用LIMIT子句为每次读取设置一个范围。示例如下:

 

DECLARE
  CURSOR c IS SELECT * FROM t;
  TYPE t_t IS TABLE OF t%ROWTYPE;
  l_t t_t;
BEGIN
  OPEN c;
  LOOP
    FETCH c BULK COLLECT INTO l_t LIMIT 100;
    EXIT WHEN l_t.COUNT = 0;
    FOR i IN l_t.FIRST..l_t.LAST
    LOOP
      -- process data
      NULL;
    END LOOP;
  END LOOP;
  CLOSE c;
END;

    包dbms_sql、本地动态SQL和RETURNING子句都支持行预取功能。

 2.JDBC

          Oracle JDBC驱动默认启用了行预取功能。可以用两种方式来改变默认的预取记录的数量。第一种是在使用类OracleDataSource或OracleDriver创建数据库的连接时指定属性defaultRowPrefetch。示例如下:

 

 connectionProperties = new Properties();

 connectionProperties.put("user",user);

 connectionProperties.put("password",password);

 connectionProperties.put("defaultRowPrefetch","100");

 dataSource.setConnectionProperties(connectionProperties );

 

第二种方法是在Staement类中使用方法setFetchSize来覆盖连接级别的默认值。示例如下:

 

      sql = "SELECT id, pad FROM t";
      statement = connection.prepareStatement(sql);
      statement.setFetchSize(100);
      resultset = statement.executeQuery();
      while (resultset.next())
      {
        id = resultset.getLong("id");
        pad = resultset.getString("pad");
        // process data
      }
      resultset.close();
      statement.close();

 

   3.ODP.NET

     ODP.NET定义的默认读取大小(65536)是字节数而不是记录数。可以通过类OracleCommand和OrcleDataReader提供的属性FetchSize来改变它的大小。示例如下:

 

           String sql;
            OracleCommand command;
            OracleDataReader reader;
            Decimal id;
            String pad;

            sql = "SELECT id, pad FROM t";
            command = new OracleCommand(sql, connection);
            command.AddToStatementCache = false;
            reader = command.ExecuteReader();
            reader.FetchSize = command.RowSize * fetchSize;
            while (reader.Read())
            {
                id = reader.GetDecimal(0);
                pad = reader.GetString(1);
                // process data
                // Console.WriteLine(id + " , " + pad);
            }
            reader.Close();

 

 

分享到:
评论

相关推荐

    嵌入式Flash读取加速技术研究.docx

    "嵌入式Flash读取加速技术研究" 嵌入式Flash读取加速技术是微控制器单元(MCU)中的一种关键技术。由于嵌入式Flash的读取速度和微控制器的工作频率存在较大的差距,对嵌入式Flash的读取速度进行优化变得非常重要。...

    电力系统多源异构数据的存储管理技术研究.pdf

    - 结构化数据:通常采用行存储或列存储方式,行存储以记录为主,列存储则针对数据列进行优化。 2. 多源异构数据的分离: - 非结构化数据分离:转化为元数据和二进制数据形式。二进制数据存储在磁盘文件中,通过...

    CGAcc:混合内存多维数据集上的基于压缩的稀疏行表示的BFS图遍历加速器

    在这篇文章中,我们提出了一种基于压缩稀疏行(Compressed Sparse Row,CSR)图表示的混合内存立方体(Hybrid Memory Cube,HMC)上的图加速器,我们称之为CGAcc。 CGAcc将内存预取和处理整合到基于Micron的HMC的三...

    L3Cache-源码.rar

    通过深入研究这些源码,我们可以了解L3 Cache是如何在硬件层面实现高速数据交换的,同时也能学习到如何针对特定应用场景进行优化。例如,在大数据处理、并行计算或者游戏开发等领域,合理利用和优化L3 Cache能显著...

    面向FT1000微处理器的STREAM并行计算与优化.pdf

    此外,作者还根据指令延迟和缓存行大小确定了数据预取的数量。数据预取是预先加载即将需要的数据到高速缓存中,以减少等待内存数据的时间,提高性能。 为了进一步提升性能,文章采用C++语言重新编写了优化的子程序...

    基于龙芯3B处理器的Linpack优化实现.pdf

    总的来说,这篇论文深入研究了龙芯3B处理器的架构特点,并针对性地进行了Linpack的优化,包括矩阵乘法的分块策略、cache锁定机制、预取算法以及热点函数的优化。这些工作对于提升基于龙芯3B处理器的高性能计算系统的...

    2020春-lecture121

    5.8章节可能讨论的是如何通过预取技术减少访存延迟,预取是预测和加载未来可能会需要的数据,以此来隐藏内存访问的延迟,提高系统的整体性能。 在【部分内容】中,提到了多个与虚拟存储和并行计算相关的文献和主题...

    DDR_SDRAM.zip_ddr_ddr_sdram

    深入研究这份源码,不仅可以了解DDR SDRAM的基本工作原理,还可以学习到如何在实际应用中设计和优化内存控制器。这对于硬件工程师、嵌入式系统开发者以及对计算机系统底层感兴趣的程序员来说,都是极好的学习材料。...

    DDR SDRAM控制器verilog代码及中文说明文档

    4. **数据缓冲和预取**:由于DDR SDRAM的数据传输特性,控制器通常需要一个预取机制,以便在时钟周期内处理多个数据位。数据缓冲器用于暂时存储数据,直到它们可以在合适的时间点被读取或写入。 5. **刷新管理**:...

    参考资料-fly谈LLC 02.zip

    - **缓存预取**:通过预测未来可能需要的数据,提前将其加载到缓存中,降低延迟。 - **数据局部性**:利用程序运行时的数据访问模式,优化代码布局,使热点数据更可能留在缓存中。 - **缓存分配策略**:针对不同...

    电子功用-存储器的读取电路、存储装置及存储器的读取方法

    在电子技术领域,存储器是不可或缺的组成部分,它负责存储数据和指令,使得计算机能够运行程序和处理信息。本文将详细解析存储器的读取电路、存储装置...因此,深入研究这些知识点对于任何IT专业人士来说都至关重要。

    myCPU_MIPS_AXI_cache_57条CPU指令_57条指令.zip

    MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,广泛应用于嵌入式系统、网络设备以及学术研究。在MIPS架构中,AXI(Advanced eXtensible Interface)是一种高性能...

    DDR2Test fpga

    2. **地址和命令控制**:DDR2内存的读写操作需要发送特定的地址和命令,例如RAS(行地址选通)、CAS(列地址选通)和WE(写使能)。 3. **数据路径**:包括数据输入/输出缓冲(DQ)和数据选择线(DQS),它们需要...

    fpga.rar_ddr3 fpga_fpga ddr3_fpga 数据存储_site:www.pudn.com

    4. **预取技术**:DDR3支持8位或16位的预取机制,意味着数据在实际被访问之前就已经被读取并暂存,从而降低了延迟,提高了数据传输的速度。 5. **命令与地址总线**:DDR3内存使用了更复杂的命令与地址总线,能够...

    计算机组成原理 课程设计 存储器设计 报告加工程

    计算机组成原理是计算机科学与技术专业的一门核心课程,它主要研究计算机系统的基本组成和工作原理。在这个课程设计中,我们将重点关注存储器的设计,这是计算机系统中不可或缺的一部分。存储器承担着数据和指令的...

    浅谈cache memory 王齐.pdf

    SandyBridge是英特尔的一个微处理器架构,其引入了多种新技术,在缓存设计和管理上有着显著的改进,包括了高级预取技术、新的缓存一致性协议等。通过这样的案例研究,可以具体了解到如何在实际的硬件产品中应用缓存...

    DB2 9 for z/OS

    - **动态预取**:对于常规索引访问,DB2 9引入了动态预取(dynamic prefetch)机制,可以在执行SQL调用时提前加载数据,从而加快响应速度。 - **全局查询优化**:利用更高级的统计信息和优化技术,全局查询优化能更...

    Performance Optimization of Numerically Intensive Codes

    1. 内存对齐:确保数据在内存中的位置对齐到缓存行边界,减少因跨缓存行读取带来的额外开销。 2. 预取:预测未来需要的数据并提前加载到缓存,减少等待时间。 3. 数据局部性:尽可能保持连续的内存访问,利用局部性...

Global site tag (gtag.js) - Google Analytics