当我通过SQL Developer查询时,幕后发生了什么?

时间:2016-10-24 09:35:35

标签: oracle-sqldeveloper

当我通过SQL Developer查询我的数据库时,我总是想知道幕后发生了什么。

独立于表的大小,默认情况下我总是最多可以获得50行。我允许向下滚动结果表,显然它会以某种方式延迟加载其余的结果。

显示前50个结果似乎不随表的大小而变化(至少对于简单的final而言),因此这让我相信SQL Developer正在封闭我的{{1带有SELECT * FROM t的语句SELECT。如果是这种情况,正如我想象的那样,它不会显示在s标签上。

如果需要,SQL Developer后来如何懒得获得剩下的结果?它是否使用某种偏移量?它是否总是必须重做查询,而不是仅使用SELECT * FROM s WHERE rownum <= 50的行,而是为Explain Plan等执行此操作?这肯定是低效的。但除非它这样做,否则冒取错误的行集会冒险(因为行的表处置可能会在其间发生变化!)。

我还假设默认情况下,SQL Developer实际上只是从服务器获取最少量的数据,即它实际上并没有提取所有内容,尽管只显示了一些结果。是这种情况吗?

有没有人能对这个问题有所了解?

2 个答案:

答案 0 :(得分:3)

  

所以这让我相信SQL Developer用SELECT * FROM s WHERE rownum&lt; = 50

包含我的SELECT语句

不,它不是如何工作的,没有谓词被添加到原始查询以限制行数。

任何客户端的底层数据库驱动程序,无论是JDBC还是ODP,都是以块的形式从打开的游标中获取数据。在SQL Developer中,SQL array fetch SizeTools\Preferences\Database\Advanced)负责设置每次往返数据库服务器时应从游标中获取多少行的值。因此,例如,如果您有一个包含100行的表并且array fetch size设置为50,那么您将在2次往返数据库中获取该表中的所有行+ 1次额外行程。

但这并不意味着您只能看到50行。然而,在50行的批量中填充SQL Developer的网格需要很多行。因此,在您按f9 or Ctrl+Enter后,您可以看到显示100行,并且它需要两次+1次往返服务器。

答案 1 :(得分:1)

正如其他人在这里提出的跟踪数据库查询的简单步骤。

在SQL Developer中运行

 ALTER SESSION SET tracefile_identifier = mytest;
 alter session set events '10046 trace name context forever, level 1';

第一个语句有助于在数据库服务器上找到跟踪文件,第二个语句激活跟踪。

有关详细信息,请参阅docs

比运行样本查询,例如

 select owner, object_name from dba_objects

并向下滚动几页,例如到第130行。 关闭连接并检查跟踪文件:

 =====================
 PARSING IN CURSOR #210335064 len=42 dep=0 uid=48 oct=3 lid=48 tim=20962225002 hv=3579237936 ad='b7ef8180' sqlid='114vazvapdpjh'
 select owner, object_name from dba_objects
 END OF STMT
 PARSE #210335064:c=15600,e=31487,p=0,cr=4,cu=0,mis=1,r=0,dep=0,og=1,plh=2354722397,tim=20962225000
 EXEC #210335064:c=0,e=46,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2354722397,tim=20962225198
 FETCH #210335064:c=0,e=1650,p=0,cr=39,cu=0,mis=0,r=50,dep=0,og=1,plh=2354722397,tim=20962226907

 *** 2016-10-24 17:36:49.734

您会看到光标被解析,执行并获取50行(r = 50)。 请注意光标编号(#210335064)并在跟踪文件中进一步查看:

 FETCH #210335064:c=0,e=515,p=0,cr=16,cu=0,mis=0,r=50,dep=0,og=1,plh=2354722397,tim=20970608847

 *** 2016-10-24 17:37:03.376

接下来50行......

 FETCH #210335064:c=0,e=304,p=0,cr=6,cu=0,mis=0,r=50,dep=0,og=1,plh=2354722397,tim=20976035474

 *** 2016-10-24 17:37:19.866

接下来提取50行,最后关闭光标

 CLOSE #210335064:c=0,e=300,dep=0,type=0,tim=20992663336

您已滚动超过130行,客户端执行3次提取,默认提取大小为50行 您可以将获取大小增加到200 - 在这种情况下,只需一次提取即可。