direct path read和diect path write

87 篇文章 34 订阅 ¥39.90 ¥99.00
本文介绍了Oracle数据库中的Direct Path Read技术,它允许服务器进程直接读取数据文件,绕过Buffer Cache,提高并行查询效率。11G版本后,Direct Path Read在串行全表扫描中也得到应用。同时,文章还探讨了Direct Path Write的特点,包括从PGA写入数据文件、同步或异步执行以及在数据加载和并行DML操作中的作用。对于异步IO,文章指出应通过v$sesstat视图来评估Direct Path Write的影响。
摘要由CSDN通过智能技术生成
direct path read:
传统读取数据的方式是服务器进程通过读取磁盘,然后把数据加载到共享内存中,这样后面的进程就可以通过共享内存访问这些数据,不用再通过缓慢的磁盘读取来完成。direct path read读取数据块

方式,是指服务器进程直接读取数据文件,不经过buffer cache,这种方式读取的数据块会加载到服务器进程的PGA内中当中,不会进入buffer cache中。11G之前的direct path read主要用于并行查询

中,此等待事件的三个参数p1,p2,p3分别代表:file#:文件号,first block#:读取的起始块号,block count:以first block为起点,连续读取的物理块数。而从11G之后,direct path read不仅可

用于并行查询,在符合某些条件后,串行的全表扫描也可以利用direct path read方式来完成。这里主要介绍11G direct path read相关的特性。

diect path write:
1. 从PGA写入数据文件,一个会话可以发布多个写入请求和连续的处理,有server process直接写入
   2. 直接写入可以按同步或异步方式执行,取决于平台和DISK_ASYNC_IO参数的值。
   3. 通常用于在数据加载(APPEND提示、CTAS-CREATE TABLE AS SELECT)、并行DML操作时写入到临时段。
   4. 在使用异步IO时,direct path write事件产生的等待时间不准确,所以通过v$sesstat视图来获得直接写入次数来评估该事件的影响情况:

在Python中,通常不会直接使用`direct`库来操作硬盘设备,因为这个库并不是标准库的一部分,而且它主要用于底层硬件驱动级别的操作,一般适用于需要高性能、低延迟或对I/O缓存有特殊需求的专业场景。不过,如果你确实想实现类似的功能,并且已经找到了`direct`这样的库或者自定义了相应的驱动程序支持,你可以按照以下思路编写封装函数: 首先,你需要确保你的环境支持像`ctypes`这样的库来处理C语言数据结构和系统调用。 ```python import ctypes # 假设我们有一个叫做`DirectDeviceDriver`的C类型定义 class DirectDeviceDriver(ctypes.Structure): # ...在这里定义具体的结构体和函数原型... # 初始化驱动 driver = DirectDeviceDriver() lib = ctypes.CDLL('your_library.so') # 替换为实际的动态链接库路径 # 函数原型假设如下,用于读取文件到缓冲区 read_function = lib.direct_read read_function.argtypes = [ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(DirectDeviceDriver)] read_function.restype = ctypes.c_size_t # 函数原型用于将缓冲区内容写入文件 write_function = lib.direct_write write_function.argtypes = [ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(DirectDeviceDriver)] write_function.restype = ctypes.c_size_t def read_from_disk(file_path, buffer, device_driver): """从硬盘读取文件到缓冲区""" return read_function(file_path.encode(), len(buffer), device_driver) def write_to_disk(buffer, file_path, device_driver): """将缓冲区的内容写入硬盘""" return write_function(buffer, len(buffer), device_driver) # 使用示例 buffer = bytearray(1024) file_path = 'test_file.txt' device_driver = your_direct_device_driver_instance # 实际上这里需要创建并初始化设备驱动实例 data_read = read_from_disk(file_path, buffer, device_driver) with open(file_path, 'wb') as f: f.write(buffer[:data_read]) # 写入操作同理 data_written = write_to_disk(buffer, file_path, device_driver) assert data_written == data_read # 验证写入的数据量是否一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scan724

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值