我该如何处理耗时的SQL?

Mem*_*eak 2 database oracle query-optimization

我们有一个包含600万条记录的表,然后我们有一个SQL需要大约7分钟来查询结果.我认为SQL无法再进行优化.

查询时间导致我们的weblogic抛出最大卡住线程异常.

有什么建议让我来处理这个问题吗?

以下是查询,但我很难改变它,

SELECT * FROM  table1 
WHERE trim(StudentID) IN ('354354','0') 
AND concat(concat(substr(table1.LogDate,7,10),'/'),substr(table1.LogDate,1,5)) 
       BETWEEN '2009/02/02' AND '2009/03/02' 
AND TerminalType='1' 
AND RecStatus='0' ORDER BY StudentID, LogDate DESC, LogTime
Run Code Online (Sandbox Code Playgroud)

但是,我知道使用字符串来比较日期是耗时的,但有人在我无法更改表结构之前写了...

LogDate被定义为一个字符串,格式是mm/dd/yyyy,所以我们需要子串和连接它比我们可以在...之间使用...我觉得这里很难优化.

Jay*_*Jay 7

可能性是这个查询正在进行全文扫描,因为你在WHERE条件下不太可能利用任何索引.

LogDate是日期字段还是文本字段?如果它是一个日期字段,那么不要做substr和concat.只需说"2009-02-02"和"2009-02-03"之间的LogDate或者日期范围是什么.如果将其定义为文本字段,您应该认真考虑将其重新定义为日期字段.(如果您的日期确实如此是文本,写成mm/dd/yyyy然后你的ORDER BY ...如果日期超过一年,LOGDATE DESC将不会给出有用的结果.)

是否有必要对StudentID进行修剪?在将数据放入数据库之前清理数据然后在每次检索时尝试清理数据要好得多.

如果将LogDate定义为日期并且您可以在输入上修剪studentid,则在一个或两个字段上创建索引,并且查询时间应显着下降.

或者,如果您想要快速而肮脏的解决方案,请在"trim(studentid)"上创建索引.

如果这没有帮助,请提供有关表格布局和索引的更多信息.