Oracle输出查询到文件的结果

时间:2013-02-14 09:15:55

标签: sql database oracle sqlplus

目前我正在运行多个查询,这些查询将输出假脱机到一个文件,这可能是一个漫长的过程,下面是我在sqlplus中的当前设置。

set feedback off
set heading off
set echo off
set termout OFF
set linesize 150
set long 1999999
set longchunk 1999999
set pagesize 0
spool results.sql
@queries.sql
spool off
set termout on
set echo on
set heading on
set feedback on

我想知道我是否有办法加速这个过程?或者是否有更快的方法使用sqlplus将查询输出发送到文件?

由于

1 个答案:

答案 0 :(得分:0)

说明

能否请您澄清以下内容

  1. sqlplus 客户端是否位于数据库管理系统所在的同一物理盒(或虚拟机)上(更具体地说,是oradatafiles)?< / li>
  2. 您可以通过使用fetch first n rows减小结果集的大小来测试查询吗?

时间复杂度和细节

您为什么认为瓶颈在绕线?在得出有关性能下降原因的任何结论之前,您可能需要尝试收集有关查询的一些计时统计信息。我将修改您的查询以仅返回一部分行

SELECT * FROM scott.dept FETCH FIRST 10000 rows

优化查询在很大程度上取决于数据的结构和例程的运行方式,因此,为了进行优化,您需要能够对性能变化进行基准测试。

然后您将要检查以下两个参数

SHOW PARAMETER statistics_level
SHOW PARAMETER timed_statistics

而且您还想安排查询时间

SET TIMING ON
  

请记住,所有这些只是为了基准性能,您将需要在生产中还原这些设置。

请记住,由于池化/缓冲/缓存/等原因,多次运行相同的查询会导致不一致的性能指标。您应该查询v$statistics_level并进行调查

  • 行处理
  • 排序(内存)
  • 排序(磁盘)
  • 物理阅读
  • 一致获得

我会SHUTDOWN IMMEDIATELY; STARTUP MOUNT;,然后多次对您的查询进行解释。

EXPLAIN PLAN FOR SELECT * FROM SCOTT.DEPT;

检查后续计划中的说明计划是否正在更改。

此外,在某些情况下,您可以通过运行来强制对表进行缓存

SELECT * FROM SCOTT.DEPT CACHE;

然后将其与的性能指标进行比较

SELECT * FROM SCOTT.DEPT NOCACHE;

您可能还希望将表无限期地保留在内存中

ALTER TABLE *scott.dept* STORAGE (buffer_pool keep)

如果没有发现任何明显的问题,请运行explain plan for您的查询。连续多次运行解释以查看是否有任何更改。

除此之外,您还应该记住,多次运行查询而不刷新缓冲区/清除缓存会给您不可靠的读数。如果您不确定假脱机是否是瓶颈,我还建议您运行一个explain plan for your查询

还有一些技巧可以随着时间的推移提高性能(假设此例程定期运行)。如果使用alter table *table_name* cache,则在不假脱机到文件的情况下运行查询,然后再次使用假脱机运行alter table *table_name* nocache,则性能可能更高,但是是否可行完全取决于您的用例。< / p>

设置

虽然我怀疑您的问题是否可以通过任何设置的组合来解决,但以下几项可能会带来边际收益

  1. set trimspool on
      

    删除假脱机文件中的空白以填充行大小

  2. 关闭回显
      

    这可能毫无意义,具体取决于您的例程是全自动的还是交互式的

  3. set verify off
      

    这将从假脱机中删除替换变量,但可以大大加快您的处理过程……再次取决于您的数据

  4. set autoprint off
      

    这是另一个变量设置。默认设置为“关闭”,但是您可以确保我会明确设置

  5. set serveroutput off
  6. SET TRIMOUT ON
      

    删除输出文件上的空白填充行大小

  7. set arraysize N
      

    您肯定会修改这个。 N是一次获取的行数。它的大小取决于表的结构

虽然这些设置可能可以提高例程的速度,但是性能通常特定于您的体系结构和数据集。