Oracle - 为什么选择SELECT*FROM Foo; 太慢了?

Mik*_*sen 7 sql database oracle networking oracle11g

我正在使用我们的网络应用程序解决一些Oracle性能问题.我注意到的一件事似乎是混淆了任何类型的测试,返回大量结果的简单查询仍然很慢.一个例子是:

select * from TPM_PROJECTWORKGROUPS;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

 5825 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 59s] 

 [Executed: 9/22/2011 1:52:38 PM] [Execution: 203ms] 
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这意味着实际查询运行时间为203毫秒,但是将数据返回给客户端需要59秒,这是"获取"意味着在这种情况下?

我没有权限直接连接到数据库机器并在本地运行查询,但可以安全地假设罪魁祸首是实际的网络带宽本身吗?这是有道理的,因为我在西雅图,服务器在纽约,但5800行的一分钟似乎相当缓慢的吞吐量.

是否有任何快速建议:a)确认网络带宽确实是问题; b)任何"陷阱"或事情要检查为什么通过线路序列化数据是如此之慢?谢谢!

基于评论的一些更新:

SELECT COUNT(*)FROM(select*from TPM_PROJECTWORKGROUPS)t;

结果:

 1 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 0ms] 

 [Executed: 9/22/2011 2:16:08 PM] [Execution: 219ms] 
Run Code Online (Sandbox Code Playgroud)

如果我尝试只选择一列:

从TPM_PROJECTWORKGROUPS中选择PROJECTID;

结果:

选取5825条记录[获取元数据:0ms] [获取数据:1m 0s]

[执行时间:2011/9/22 2:17:20] [执行:203ms]

表模式:

PROJECTID(NUMBER)WORKGROUPID(NUMBER)

Jus*_*ave 6

您使用什么API与数据库交互(SQL*Plus,JDBC,ODBC等)?任何API都有一些函数,用于指定在单个网络往返中获取多少行(或多少数据).例如,在SQL*Plus中,它是set arraysize N.在JDBC中,它是setFetchSize.其他API将具有类似的功能.如果您在WAN上,通常希望通过增加每次网络往返所获取的行数来最小化应用程序的繁琐程度.

同样,您可能会受益于通过网络移动更少的数据并将更多逻辑推送到服务器.您是否实际向用户显示包含5800行数据的网格?或者您是否获取该数据然后在应用程序中执行某些处理(即订购数据并显示前100行)?如果您可以将该处理推送到数据库并减少必须通过数据库传输的数据量,那么您将会好得多.

Oracle可以选择在SQL*Net中配置SDU和TDU以及一些其他网络参数.但是,在您优化获取大小并确保尽可能减少数据量之前,我不会开始考虑这些选项.