gpt4 book ai didi

database - 如何处理耗时的SQL?

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:30 26 4
gpt4 key购买 nike

我们有一个有 600 万条记录的表,然后我们有一个 SQL 需要大约 7 分钟来查询结果。我认为SQL不能再优化了。

查询时间导致我们的 weblogic 抛出 max stuck thread 异常。

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

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

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,所以我们需要对其进行子字符串化和连接,而不是我们可以在 ... 和 ... 之间使用我认为这里很难优化。

最佳答案

很可能此查询正在执行全文件扫描,因为您所处的 WHERE 条件不太可能利用任何索引。

LogDate 是日期字段还是文本字段?如果它是日期字段,则不要执行 substr 和 concat。只需说“LogDate between '2009-02-02' and '2009-02-03' or whatever the date range is. 如果它被定义为文本字段,你应该认真考虑将它重新定义为日期字段。(如果你的日期真的是文本,写成 mm/dd/yyyy 那么如果日期跨度超过一年,您的 ORDER BY ... LOGDATE DESC 将不会提供有用的结果。)

是否需要对 StudentID 进行修剪?最好在将数据放入数据库之前清理数据,然后在每次检索数据时尝试清理数据。

如果 LogDate 被定义为日期并且您可以在输入时修剪 studentid,然后在一个或两个字段上创建索引,查询时间应该会大大减少。

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

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

关于database - 如何处理耗时的SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com