我们有一个有600万条记录的表,然后我们有一个需要大约7分钟来查询结果的sql。我认为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
但是,我知道使用字符串比较日期是很费时的,但是有人在我无法更改表结构之前编写了…
logdate被定义为一个字符串,格式是mm/dd/yyyy,因此我们需要子字符串和concat,而不能在…还有…我觉得这里很难优化。
最佳答案
很可能这个查询正在执行完整的文件扫描,因为您所在的环境不太可能利用任何索引。
logdate是日期字段还是文本字段?如果是日期字段,则不要执行substr和concat。只需说“logdate between'2009-02-02'and'2009-02-03'或任何日期范围。如果它被定义为文本字段,您应该认真考虑将其重新定义为日期字段。(如果您的日期真的是文本,并且是在年/月/日写的,那么您的订单由…如果日期跨度超过一年,logdate desc将不会给出有用的结果。)
有必要对studentid进行修剪吗?在将数据放入数据库之前,最好先对其进行清理,然后在每次检索数据时尝试对其进行清理。
如果logdate被定义为日期,并且您可以在输入时修剪studentid,那么在一个或两个字段上创建索引,查询时间应该会显著减少。
或者,如果您想要一个快速而肮脏的解决方案,请在“trim(studentid)”上创建一个索引。
如果没有帮助,请给我们更多关于您的表布局和索引的信息。