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

问题描述:

注 - db中有大约2-3百万条记录。为什么我的查询需要2分钟才能运行?

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 
+2

什么数据库引擎? – Blorgbeard 2011-01-27 16:59:55

+0

您需要添加更多关于模式和相关索引的信息。例如 - datetime_updated上有一个索引,它是什么类型的索引?连接列上是否有索引? – iain 2011-01-27 17:01:22

如果你发布你已经在这个表上,或者一个查询执行计划的指标,它会更容易了解。事实上,如果您创建包含stop_exception_codedatetime_updated的组合索引,我会猜测您可以提高性能。我不能保证这实际上可行,但它可能值得一试。我不能说远不止这些,没有任何其他信息...

一些经验法则:对连接列

  • 指数。
  • WHERE子句中使用的列的索引。
  • '不等于'总是比'等于'条件慢。考虑将表拆分为那些为空和那些不属于这些的表,或者将表拆分为联接表作为索引。
  • 使用正确的JOIN语法即是明确在哪里连接是通过写INNER JOIN速度东西在某些数据库(我见过一个10分钟+查询只是单是这种变化踏踏实实地在MySQL 30秒)
  • 使用别名每个表和前缀,每列
  • 店作为一个函数/过程,它会预编译,并得到更快

stop_exception_code <> 'null' 

请告诉我,“空”是不是引入你的数据库。标准SQL将

stop_exception_code IS NOT NULL 

stop_exception_code is NULL 

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

没有看到你的DDL,实际查询和执行计划,这些都是我可以告诉你的。