暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 行处理如何在GV $ SQL中工作和更新

askTom 2017-02-16
423

问题描述

Row_procseced,磁盘读取和缓冲区如何在执行任何查询时实际工作。我在执行两种不同的情况下遇到了两种情况
查询。(我的sql arrayfetch大小为50)

1.磁盘读取和缓冲区增加,直到整个执行完成并且行处理 = 50。
当我选择所有行时,处理的行不断增加,但磁盘读取和缓冲区获取没有变化,

是否像,整个执行完成,并且所有行都被处理,但由于数组大小而仅显示50?

但如果是这样,在第二种情况下会发生什么,如下所示。

2.磁盘读取和缓冲区增加,直到整个执行完成并且行处理 = 50,但是当我选择所有行时,所有三个参数都在增加 (row_procedued,diskread和缓冲区获取)

专家解答

这取决于查询。这是示例1

SQL> create table t as select * from dba_objects;

Table created.

SQL> set arraysize 50
SQL> set pause on
SQL> select /*test1*/ * from t;

[data]



现在,对于该查询,我不需要读取整个表-pause/arraysize表示 “只需读取50并停止”。所以当我看v $ sql我看到这个:

SQL> select sql_text, rows_processed, disk_reads, buffer_gets
  2  from v$sql where sql_id = '280q6uvsgs2d3';

SQL_TEXT                                                         ROWS_PROCESSED DISK_READS BUFFER_GETS
---------------------------------------------------------------- -------------- ---------- -----------
select /*test1*/ * from t                                                    51          5           6


现在,我继续按Enter键以获取50行的批处理,就像我一样,当我在表中单击 * new * 块时,计数器会增加,我 * 还 * 要读取。

SQL_TEXT                                                         ROWS_PROCESSED DISK_READS BUFFER_GETS
---------------------------------------------------------------- -------------- ---------- -----------
select /*test1*/ * from t                                                    51          5           6

SQL> /

SQL_TEXT                                                         ROWS_PROCESSED DISK_READS BUFFER_GETS
---------------------------------------------------------------- -------------- ---------- -----------
select /*test1*/ * from t                                                   101          5           8

SQL> /

SQL_TEXT                                                         ROWS_PROCESSED DISK_READS BUFFER_GETS
---------------------------------------------------------------- -------------- ---------- -----------
select /*test1*/ * from t                                                   251          5          13



现在考虑一个查询,比如

通过object_id从t顺序中选择/* test2 */ *

要进行排序,我需要读取表中的每一行 * 之前 * 我甚至可以开始返回第一行。因此,当我开始返回前50个时,我已经完成了所有工作。


SQL> select sql_text, rows_processed, disk_reads, buffer_gets
  2  from v$sql where sql_id = '69djn1r805gvf';

SQL_TEXT                                                         ROWS_PROCESSED DISK_READS BUFFER_GETS
---------------------------------------------------------------- -------------- ---------- -----------
通过object_id从t顺序中选择/* test2 */ *                                 51       1745        1751

mcdonac@np12
SQL> /

SQL_TEXT                                                         ROWS_PROCESSED DISK_READS BUFFER_GETS
---------------------------------------------------------------- -------------- ---------- -----------
通过object_id从t顺序中选择/* test2 */ *                                201       1745        1751




显然还有其他排列,例如,我的排序可能不得不转储到磁盘,所以当我读取结果时,我可能需要磁盘读取 (不是从数据,而是从临时排序区域) 等。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论