为什么这个postgresql查询这么慢?

Dan*_*son 1 sql database postgresql indexing

我不是数据库专家,但我有足够的知识让自己陷入困境,就像这里的情况一样.这个查询

SELECT DISTINCT p.* 
  FROM points p, areas a, contacts c 
 WHERE (    p.latitude > 43.6511659465 
        AND p.latitude < 43.6711659465 
        AND p.longitude > -79.4677941889 
        AND p.longitude < -79.4477941889) 
   AND p.resource_type = 'Contact' 
   AND c.user_id = 6
Run Code Online (Sandbox Code Playgroud)

非常慢.points表的记录少于2000条,但执行大约需要8秒.纬度和经度列上有索引.删除隐含resource_type和user_id的子句没有区别.

纬度和经度字段都被格式化为数字(15,10) - 我需要一些计算的精度.

此项目中有许多其他查询,其中比较了点,但没有执行时间问题.这是怎么回事?

OMG*_*ies 11

您是否忘记了实际查询中的内容?它缺少三个表之间的ANSI-89连接,为您提供笛卡尔积,但只提取POINTS记录.

  • 不仅如此,`AND c.user_id = 6`什么都不做,因为没有返回来自`contacts`的结果. (2认同)

Cha*_*les 5

您正在加入三个表,p,a和c,但您没有指定如何将它们连接在一起.您得到的是在符合条件的所有表中的所有行之间的完整笛卡尔连接,然后是区域中的所有行.

你可能想要在某些区域附加某些东西.和...接触的东西......好吧,我不知道你的架构是什么样的.

尝试在开头粘贴"EXPLAIN"以获取有关正在发生的事情的信息.