我们有一个任务每天运行,将查询的结果转储到CSV文件中--作为运行查询的sqlplus的标准输出。
记录的数量是数百万(别问),这份工作需要两个多小时。
为了改善时间,我编写了一个C程序(使用甲骨文的ofetch()调用),但是性能并没有改变.将会话数据单元(SDU)的大小提高到1GB!在客户端--不确定服务器会把它夹在哪里--没有帮助。
然后我做了更多的研究和找到,ofen(),如果一次用于捕获多个行,可以显着地提高性能--并且改变了我的C程序来使用它。
一次取4K行,时间缩短到21分钟--减少10倍--这让人非常高兴。
在我们讨论在生产服务器上安装我的新可执行文件的麻烦之前,库存sqlplus也可以执行相同的多行抓取--如果提供了正确的命令行选项(S)?
可以吗?我们使用的是Oracle-11,但是,如果客户端版本12中有此功能,我们可以升级客户端.
发布于 2019-09-17 02:03:15
SET ARRAYSIZE的默认值为15
“设置SQL*Plus一次从数据库中获取的行数。
有效值为1到5000。一个大的值会提高查询和子查询的效率,这些查询和子查询获取许多行,但需要更多的内存。大约超过100的值提供了很少的附加性能。除了提高效率外,ARRAYSIZE对SQL*Plus操作的结果没有任何影响。“
可以在sqlnet.ora (更改DEFAULT_SDU_SIZE )或连接字符串中进行额外的调整(包括SDU)。,这可以在tnsnames.ora中定义,但也可以将其作为一个versbose连接字符串的一部分,例如
sqlplus usr/pwd@(DESCRIPTION=(SDU=11280)(ADDRESS=(PROTOCOL=TCP)(HOST=svr)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=svc)))输入usr、pwd、svr和svc https://docs.oracle.com/cd/E18283_01/network.112/e 10836/Perforce.htm的适当值。
发布于 2019-09-17 15:59:35
我觉得加里的建议是合理的。您还可以尝试使用utl_file或将数据直接写入文件的Perl脚本进行测试。我会犹豫写一个C程序,因为这将需要更高水平的专业知识来维护。
https://dba.stackexchange.com/questions/248915
复制相似问题