2011-09-22 217 views
7

我正在使用我们的Web应用程序处理一些Oracle性能问题。有一件事我注意到,似乎混淆了任何类型的测试,但返回大量结果的简单查询仍然非常缓慢。一个例子是:Oracle - 为什么SELECT * FROM Foo;太慢了?

select * from TPM_PROJECTWORKGROUPS; 

当我运行它,我得到:

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

[Executed: 9/22/2011 1:52:38 PM] [Execution: 203ms] 

如果我理解这个正确的,这意味着实际查询了203ms运行,但它花了59秒该数据被退回到客户端,这是“取”在这种情况下意味着什么?

我无法直接连接到数据库机器并在本地运行查询,但假设罪魁祸首是实际的网络带宽本身是否安全?这是有道理的,因为我在西雅图,服务器在纽约,但对于5800行仍然是一分钟似乎是非常缓慢的通过。

是否有任何快速建议:a)确认网络带宽确实是问题; b)任何“疑难杂症”或检查为什么通过线缆串行化数据太慢的原因?谢谢!

基于评论一些更新:

SELECT COUNT(*)FROM(SELECT * FROM TPM_PROJECTWORKGROUPS)吨;

结果:

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

[Executed: 9/22/2011 2:16:08 PM] [Execution: 219ms] 

如果我尝试选择只有一个列:

SELECT专案编号FROM TPM_PROJECTWORKGROUPS;

结果:选择

5825结果[取的元数据:0毫秒] [获取数据:1米0]

[执行时:2011/9/22二点17分20秒PM] [执行:203ms]

表架构:

专案编号(NUMBER) WORKGROUPID(NUMBER)

+0

你确定TPM_PROJECTWORKGROUPS是一张表而不是视图吗? – MusiGenesis

+0

一排的大小是多少?任何CLOB/BLOB? – muratgu

+2

尝试'SELECT COUNT(*)FROM(select * from TPM_PROJECTWORKGROUPS)t;'看看是否有很大的差异 –

回答

6

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

沿着同样的路线,您可能会受益于在网络上移动较少的数据并将更多逻辑推送到服务器。您是否实际上向用户显示了具有5800行数据的网格?或者,您是否获取该数据,然后在应用程序中执行一些处理(即,对数据进行排序并显示前100行)?如果您可以将该处理推送到数据库并减少必须通过数据库传输的数据量,那么您的状况会好得多。

Oracle可以选择配置SDU和TDU以及SQL * Net中的一些其他网络参数。但是,我不会开始查看这些选项,直到您优化了获取大小并确保您将可能的最小数据量拉回来。

+0

现在,我使用Aqua Data Studio运行它,它使用JDBC。我非常小心获取比我需要更多的数据;在这种特殊情况下,我正在报告实际/确实/需要显示大量数据。其中一些报告需要几分钟时间才能生成,但查询似乎在半秒内运行!对我来说,所有的时间都是通过电线发送数据,这真是太神奇了。 –

+0

另外,我可以在SQLPlus中运行这些查询,但它似乎没有报告查询和提取需要多长时间。有没有一个选项来启用它? –

+0

糟糕 - 找到它了:SET TIMING ON; –

1

当你正在处理一个web应用程序时,快速找回某些东西很重要。 调查FIRST_ROWS提示。这可能对你的情况有价值。

+0

有趣的功能,谢谢! –

1

从表中选择几千行不应该花费近一分钟。我的猜测是你的系统其他地方有性能问题。可能是数据库中的其他活动,或与服务器/网络/存储有关的问题。数据库中其他查询的性能是否同样缓慢?

0

请检查表碎片。通常Table Fragmentaion会导致更多的I/O并且查询速度变慢。你可以使用oracle segment advisor来检查它,并解决它有两种方法首先使用oracle shrink table命令:是要慢并且还要锁表,其次是使用oracle move table命令,如果使用oracle并行选项。关于移动表的唯一一点是它将会使用未被使用的索引。

相关问题