当我通过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实际上只是从服务器获取最少量的数据,即它实际上并没有提取所有内容,尽管只显示了一些结果。是这种情况吗?
有没有人能对这个问题有所了解?
答案 0 :(得分:3)
所以这让我相信SQL Developer用SELECT * FROM s WHERE rownum&lt; = 50
包含我的SELECT语句
不,它不是如何工作的,没有谓词被添加到原始查询以限制行数。
任何客户端的底层数据库驱动程序,无论是JDBC还是ODP,都是以块的形式从打开的游标中获取数据。在SQL Developer中,SQL array fetch Size
(Tools\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 - 在这种情况下,只需一次提取即可。