2010-10-05 18 views
2

我正在使用ADOdb for PHP库从一个oracle数据库访问600万行视图表。需要建议调试:SQL查询使用ADOdb的方式太长

从运行在SUSE机web服务器中的下面的SQL查询时间约1分钟:

$ adodb_handle->执行(“SELECT COUNT(BEPROTEXT)FROM(SELECT BEPROTEXT FROM V_E_LOG WHERE BEPROTEXT LIKE' %jaya%')“);

在我的笔记本电脑上运行,从WAMP相同的SQL查询(也使用ADOdb的LIB)需要大约7秒

如果我运行下面的SQL查询:

$ adodb_handle->执行( “SELECT COUNT(BEPROTEXT)FROM V_E_LOG”);

从SUSE和笔记本电脑大约需要3秒。

我不知道为什么从SUSE计算机的第一个查询需要这么长时间,1分钟? 你们可以给我一些建议,我该如何解决这个问题或调试问题?我在一个死胡同这里:(

+0

SUSE机器和笔记本电脑都查询位于单独机器上的相同oracle数据库。我的笔记本电脑上的网络服务器是wamp。我不确定SUSE计算机上有哪些Apache版本。 – justin 2010-10-05 03:16:19

+0

我遇到的问题是SUSE机器和我的笔记本电脑都运行相同的SQL语句,但从SUSE机器查询的时间比我的笔记本电脑(3秒)长(1分钟)。所有机器都位于同一个LAN上。 – justin 2010-10-05 03:18:56

+0

最大的区别是因为在第一个查询中,您会计算每个包含jaya的文本,因此sql server必须检查表中存储的每个字符串是否包含jaya。第二个只计算每个文本与表中总共行数的总和。 – ITroubs 2010-10-06 20:12:57

回答

0

抱歉,延迟响应。我设法解决了这个问题,但首先让我回答一些你们问的问题。

贾斯汀洞:我没有检查出使用的SQLDeveloper它向我指出的,为什么该查询这么长时间的正确方向的查询计划。

Itroubs:实际上,我在使用数据表jQuery插件网页上显示的数据。我需要执行完整的查询/子查询计数来启用分页功能。

我遇到的问题是我的SUSE机器需要大约1分钟,而我的笔记本电脑需要3秒才能对相同的oracle数据库执行相同的SQL查询语句。 经过调查,我意识到之前从SUSE机SQL查询我设置如下:

$adodb_handle->Execute("alter session set NLS_SORT=BINARY_CI"); 
$adodb_handle->Execute("alter session set NLS_COMP=LINGUISTIC"); 

使不区分大小写的滤波以该会话的Oracle数据库。我没有在笔记本电脑中设置。 如果我没有设置不区分大小写的东西,那么SUSE机器的查询现在需要大约3秒才能完成,这与我的笔记本电脑相同。

感谢球员们的所有建议和知识分享。干杯

1
  1. 我认为“6.百万行” 指的是行数在 表。
  2. 什么是 两个查询的查询计划?

从SQL生成查询计划* Plus的

SQL> set autotrace traceonly; 
SQL> <<run your query>> 

输出将查询计划和一些执行统计数据。该法案您的查询返回的数据不会被打印(set autotrace on将显示查询输出和查询计划/执行统计数据)。在这里发布快速查询和慢速查询的结果。

+0

yup ... 600万行代表表格中的行数。什么是查询计划?对于业余问题抱歉;) – justin 2010-10-05 05:45:41

+0

用更多信息更新了答案。 – 2010-10-05 06:02:44

1

你为什么要对子查询进行计数?

woudln't它是更好的做一些事情,如:

$adodb_handle->Execute("SELECT COUNT(BEPROTEXT),BEPROTEXT FROM V_E_LOG WHERE BEPROTEXT LIKE '%jaya%'"); 

顺便说一个LIKE与一个相当大的表中的两个通配符可以非常快放慢你的查询执行时间视增长率那张桌子。