sqlplus 可以一次获取多于一行吗?

Mik*_* T. 1 oracle sqlplus

我们有一个每天运行的任务,将查询的结果转储到 CSV 文件中——作为sqlplus运行查询的标准输出。

记录数以百万计(不要问),工作需要两个多小时。

在尝试改进计时,我编写了一个 C 程序(使用 Oracle 的ofetch()调用),但性能没有改变......在客户端上增加会话数据单元 (SDU) 大小(到 1GB!不确定) ,服务器会夹住它)没有帮助。

然后我做了一些更多的研究和发现,即ofen(),如果使用在同一时间捕捉到多行,可以大大提高性能-而且改变了我的C-程序,用它代替。

一次获取 4K 行,时间缩短到 21 分钟——减少了 10 倍——引起了很多欢呼。

在我们解决在生产服务器上安装我的新可执行文件的麻烦之前,也许,sqlplus如果提供了正确的命令行选项,库存也可以执行相同的多行提取?

它可以?我们正在使用 Oracle-11,但如果此功能在客户端版本 12 中可用,我们可以升级客户端...

Gar*_*ary 5

SET ARRAYSIZE 的默认值为 15

"设置 SQL*Plus 一次从数据库中获取的行数。

有效值为 1 到 5000。较大的值会提高获取许多行的查询和子查询的效率,但需要更多内存。超过大约 100 的值几乎不会提供额外的性能。除了提高效率之外,ARRAYSIZE 对 SQL*Plus 操作的结果没有任何影响。”

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqpug/SET-system-variable-summary.html#GUID-773AEA4E-060E-4C1E-B1A0-52F7DE084AE8

可以在 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