我们有一个每天运行的任务,将查询的结果转储到 CSV 文件中——作为sqlplus
运行查询的标准输出。
记录数以百万计(不要问),工作需要两个多小时。
在尝试改进计时,我编写了一个 C 程序(使用 Oracle 的ofetch()
调用),但性能没有改变......在客户端上增加会话数据单元 (SDU) 大小(到 1GB!不确定) ,服务器会夹住它)没有帮助。
然后我做了一些更多的研究和发现,即ofen()
,如果使用在同一时间捕捉到多行,可以大大提高性能-而且改变了我的C-程序,用它代替。
一次获取 4K 行,时间缩短到 21 分钟——减少了 10 倍——引起了很多欢呼。
在我们解决在生产服务器上安装我的新可执行文件的麻烦之前,也许,sqlplus
如果提供了正确的命令行选项,库存也可以执行相同的多行提取?
它可以?我们正在使用 Oracle-11,但如果此功能在客户端版本 12 中可用,我们可以升级客户端...
SET ARRAYSIZE 的默认值为 15
"设置 SQL*Plus 一次从数据库中获取的行数。
有效值为 1 到 5000。较大的值会提高获取许多行的查询和子查询的效率,但需要更多内存。超过大约 100 的值几乎不会提供额外的性能。除了提高效率之外,ARRAYSIZE 对 SQL*Plus 操作的结果没有任何影响。”
可以在 sqlnet.ora(更改 DEFAULT_SDU_SIZE)或连接字符串中进行其他调整(包括 SDU)。这可以在 tnsnames.ora 中定义,但您也可以将其作为详细连接字符串的一部分,例如
sqlplus usr/pwd@(DESCRIPTION=(SDU=11280)(ADDRESS=(PROTOCOL=TCP)(HOST=svr)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=svc)))
Run Code Online (Sandbox Code Playgroud)
为 usr、pwd、svr 和 svc 输入适当的值 https://docs.oracle.com/cd/E18283_01/network.112/e10836/performance.htm
归档时间: |
|
查看次数: |
220 次 |
最近记录: |