为什么我的查询需要2分钟才能运行?

时间:2011-01-27 16:57:48

标签: sql

注意 - 数据库中有大约2-3百万条记录。

SELECT     
   route_date, stop_exception_code, unique_id_no, 
   customer_reference, stop_name, stop_comment,
   branch_id, customer_no, stop_expected_pieces, 
    datetime_updated, updated_by, route_code
FROM
   cops_reporting.distribution_stop_information distribution_stop_information
WHERE     
   (stop_exception_code <> 'null') AND 
   (datetime_updated >= { ts '2011-01-25 00:00:01' })
ORDER BY datetime_updated DESC

3 个答案:

答案 0 :(得分:4)

如果您发布了此表中已有的索引,或者可能是查询执行计划,则会更容易了解。实际上,如果您创建包含stop_exception_codedatetime_updated的组合索引,我猜您可以提高性能。而且我不能保证这实际上会有效,但它可能值得一试。没有任何其他信息,我不能说更多......

答案 1 :(得分:1)

一些经验法则:

  • 加入的列的索引。
  • WHERE子句中使用的列的索引。
  • 'Not equals'总是慢于'Equals'条件。考虑将表拆分为空的表和非表的表,或将表作为索引分成连接表。
  • 使用正确的JOIN语法,即通过编写INNER JOIN来明确连接的位置可以加快某些数据库的速度(我已经看到10min +查询只需通过此更改就可以在mysql上减少30秒)
  • 为每个表使用别名,并为每列使用前缀
  • 作为函数/过程存储,它将预编译并快速获得

答案 2 :(得分:1)

stop_exception_code <> 'null'

请告诉我'null'不是数据库中的字符串。标准SQL将是

stop_exception_code IS NOT NULL

stop_exception_code is NULL

我不确定NULL stop_exception_code对你意味着什么。但如果它意味着“我不知道”,那么使用“我不知道”的特定值可能会让您的服务器在该列上使用索引,并且索引它可能无法用于NULL 。 (或者你可能已经通过使用字符串'null'来完成它。)

没有看到您的DDL,实际查询和执行计划,这就是我可以告诉您的全部内容。