Oracle SQL优化:SQL查询需要很长时间

时间:2008-11-13 19:46:46

标签: sql oracle optimization

SELECT DISTINCT 
    'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
     rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE L_code = '1000' AND licensing_no IS NOT NULL

这似乎是导致我无法在开发环境中将这些记录导出到文本文件的罪魁祸首。有什么方法可以让这个查询更快地运行。它返回大约2000多行文本。

10 个答案:

答案 0 :(得分:4)

解决方案很简单。

在(code,licensing_no)上创建索引,在(l_code,licensing_no)上创建索引以更快地获取记录。在应用程序的后期或者只需在外部包装中执行“美化”操作:

SELECT    'LRS-TECH  1'
       || RPAD (code, 7)
       || RPAD ('APPTYPE', 30)
       || RPAD (licensing_no, 30)
       || RPAD (' ', 300) AS RECORD
  FROM (SELECT DISTINCT code, licensing_no
                   FROM apps
                  WHERE l_code = '1000' AND licensing_no IS NOT NULL)

答案 1 :(得分:2)

除非您知道如何优化查询,否则无法诊断此问题。

试试这个:

explain plan for SELECT DISTINCT 
'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
 rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE L_code = '1000' AND licensing_no IS NOT NULL
/

select * from table(dbms_xplan.display)
/

现在,试试这个......它将帮助您检测统计数据问题:

explain plan for SELECT /*+ dynamic_sampling(4) */ DISTINCT 
'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
 rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE L_code = '1000' AND licensing_no IS NOT NULL
/

select * from table(dbms_xplan.display)
/

请使用这些结果更新原始帖子。

答案 2 :(得分:0)

如果您还没有L_code和licensing_no列的索引,我会尝试。

答案 3 :(得分:0)

如果L_code ='1000'的记录很多且唯一的附加测试是NOT NULL,则可能存在基数问题。索引很难选择是否为NULL。

返回的行数并不重要 - 这是检查的行数是问题。

有哪些索引?

答案 4 :(得分:0)

嗯...摆脱DISTINCT可能有助于考虑代码是PRIMARY KEY。我不认为这是导致主要加工问题的原因。如果相信RPAD等导致大部分查询延迟。

索引主要是ASCEND CODE字段。这是表中唯一相关的索引。

答案 5 :(得分:0)

您可以使用触发器和查询在辅助表,视图或列中预构建RECORD派生值,而不是在频繁查询表时动态构建它。

了解表的大小可能会有所帮助。如果你有一个大列,或者有很多记录,那么它可能与IO或缓存有关。

答案 6 :(得分:0)

对于每个看这个SQL的人都很抱歉,但这是一个令人难以置信的服务器问题。这个场景似乎已经消失了,我相信数据可用性问题就是DB所在的位置,但是有人可能会给我一些见解。

在我的Localhost上,我运行代码,即时工作。我在不到一秒的时间内将数据表中的数据导出到文本文件中......完成。

在我们的开发环境中,同一页面位于旧的ASP中。当我们转换为.NET时,我们网站的一半是经典ASP。问题似乎是在DEV网站上,经典的ASP页面可以在不到一秒的时间内完美,快速地完成。当我上传新转换的ASPX文件时,它会在该查询上挂起约30秒。

在Localhost上,旧的经典ASP会挂起大约30秒。

所以,我有一个相反的问题,因为经典的ASP不会挂在DEV站点上,而是在我的机器上,而我自己的ASPX页面挂在DEV站点上,但不在我的机器上。不同之处在于我相信数据是在我自己的DEV站点上的代码中提取的,而ASP页面是从驻留在旧的DEV站点服务器上的代码中提取数据,该服务器将结果移植到DEV站点。因此,从技术上讲,代码不会在同一台服务器上运行。经典的ASP代码在我们的旧站点服务器上。

我假设这两个网站之间存在某种速度问题或服务器问题。

答案 7 :(得分:0)

正如大多数答案所示,您的问题听起来像是一个优化问题。您以后的回答会显着改变问题的性质。我建议将其作为新问题发布或修改原始问题,询问您真正想知道的内容。

我无法帮助您解决ASP / ASPX问题,但如果这是一个优化问题,我建议为新的WHERE子句创建一个基于函数的索引,如下所示:

SELECT DISTINCT 
    'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
     rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE DECODE(L_code,'1000',licensing_no,NULL) IS NOT NULL;

DECODE上的基于函数的索引(L_code,'1000',licensing_no,NULL)将包含您要返回的所有记录。如果你需要更高的速度,你可以创建一个关于查询结果的物化视图,但这将是最后的努力。

答案 8 :(得分:0)

我想知道是不是因为oracle对aspx页面的查询使用了不同的索引(或根本没有)。
我建议更新表格上的统计数据,看看是否有任何区别 有关如何执行此操作,请参阅this question(以及“计算统计信息”已过时的评论,而不是替换为软件包)

答案 9 :(得分:-1)

摆脱DISTINCT。