Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres 9.4 sql查询超时_Sql_Postgresql_Postgresql 9.4 - Fatal编程技术网

Postgres 9.4 sql查询超时

Postgres 9.4 sql查询超时,sql,postgresql,postgresql-9.4,Sql,Postgresql,Postgresql 9.4,下面的查询在添加这两行或其中任何一行后超时 AND final IS NOT NULL ORDER BY tmodified ASC 查询持续运行超过10分钟。。。。然后暂停 如果我删除上面两行,它将在1毫秒内返回结果,这样可以正常工作 你知道我如何让上面两行和下面的查询一起工作吗 表_h有3600万条记录,在该表中 column final is numeric(10,5) column tmodified is bigint, Timestamp 我正在使用Postgres 9.4

下面的查询在添加这两行或其中任何一行后超时

AND final IS NOT NULL 
ORDER BY tmodified ASC
查询持续运行超过10分钟。。。。然后暂停

如果我删除上面两行,它将在1毫秒内返回结果,这样可以正常工作

你知道我如何让上面两行和下面的查询一起工作吗

表_h有3600万条记录,在该表中

column final is  numeric(10,5)
column tmodified is bigint, Timestamp
我正在使用Postgres 9.4

这是完整的查询

SELECT DISTINCT t.cid, h.a, am.b, u2.c, u.d, h.e, ie.f, im.g FROM table_am as am
  INNER JOIN table_t as t on (t.id = am.id AND t.type = am.type)
  INNER JOIN table_h AS h on h.iid = t.id
  INNER JOIN table_u AS u ON u.id = h.uid
  INNER JOIN table_u AS u2 ON u2.id = h.lu
  INNER JOIN table_im AS im ON im.asid = am.sid
  INNER JOIN table_ie AS ie ON ie.uid = u.uid
  INNER JOIN table_g AS g ON g.id = h.oldid
WHERE h.final >= 0 
  AND h.final IS NOT NULL
  AND h.tmodified >= 1499903419
  AND ie.p = im.p
  AND h.sr IN ('x', 'y', 'z')
  AND h.id = (SELECT id FROM table_h WHERE oldid = h.oldid AND final >= 0 
              AND final IS NOT NULL -- Issue is here and
              ORDER BY tmodified ASC -- Issue is here
              LIMIT 1)
  AND h.id NOT IN (SELECT id FROM table_m  WHERE tmodified > 1499903419) 

尝试用联接替换相关子查询,如下所示:

SELECT ...
FROM table_am as am
...
INNER JOIN table_g AS g ON g.id = h.oldid
INNER JOIN
(
    SELECT id, oldid, MIN(tmodified) AS min_mod
    FROM table_h
    WHERE final >= 0 AND final IS NOT NULL
    GROUP BY id, oldid
) t
    ON h.id     = t.id    AND
       h.oldid  = t.oldid AND
       h.tmodified = t.min_mo

请注意,我们也可以使用行号或其他分析函数来表示这一点,但希望这能为您提供一个开始的位置。

尝试用连接替换相关子查询,类似于以下内容:

SELECT ...
FROM table_am as am
...
INNER JOIN table_g AS g ON g.id = h.oldid
INNER JOIN
(
    SELECT id, oldid, MIN(tmodified) AS min_mod
    FROM table_h
    WHERE final >= 0 AND final IS NOT NULL
    GROUP BY id, oldid
) t
    ON h.id     = t.id    AND
       h.oldid  = t.oldid AND
       h.tmodified = t.min_mo

请注意,我们也可以使用行号或其他分析函数来表示,但希望这能为您提供一个起点。

好吧,我可以解决您一半的问题。条件:

AND h.final IS NOT NULL
h.final >= 0
这是不需要的。条件:

AND h.final IS NOT NULL
h.final >= 0
我们已经考虑到了这一点

如果剩余的查询返回得很快,则使用子查询或cte,然后按以下顺序排序:

with cte as (
      select . . ., t.modified
     )
select cte.*
from cte
order by modified;

我能解决你一半的问题。条件:

AND h.final IS NOT NULL
h.final >= 0
这是不需要的。条件:

AND h.final IS NOT NULL
h.final >= 0
我们已经考虑到了这一点

如果剩余的查询返回得很快,则使用子查询或cte,然后按以下顺序排序:

with cte as (
      select . . ., t.modified
     )
select cte.*
from cte
order by modified;

用吸尘器清理所有涉及的表将解决此问题

VACUUM ANALYZE table_am;
VACUUM ANALYZE table_t;
VACUUM ANALYZE table_h;
VACUUM ANALYZE table_u;
VACUUM ANALYZE table_im;
VACUUM ANALYZE table_ie;
VACUUM ANALYZE table_g;
VACUUM ANALYZE table_m;

参考:

对所有涉及的表进行真空处理将解决此问题

VACUUM ANALYZE table_am;
VACUUM ANALYZE table_t;
VACUUM ANALYZE table_h;
VACUUM ANALYZE table_u;
VACUUM ANALYZE table_im;
VACUUM ANALYZE table_ie;
VACUUM ANALYZE table_g;
VACUUM ANALYZE table_m;

参考:

3600万乘以3600万等于多少?非常多。你应该去掉这个相关的子查询。有什么想法,如何改进它吗?我们必须重写你的查询。我的猜测是,只要去掉相关子查询,查询就可以完成,只需从where子句中删除两列(final和orderby)就可以了。但这是必要的。可能是因为“不为空”和ORDERBY需要花费大量时间……好吧,对该子查询进行排序可能会花费大量的时间。你明白为什么吗?对于同一个表的每条记录,表中有3600万条记录需要排序。3600万乘以3600万是多少?非常多。你应该去掉这个相关的子查询。有什么想法,如何改进它吗?我们必须重写你的查询。我的猜测是,只要去掉相关子查询,查询就可以完成,只需从where子句中删除两列(final和orderby)就可以了。但这是必要的。可能是因为“不为空”和ORDERBY需要花费大量时间……好吧,对该子查询进行排序可能会花费大量的时间。你明白为什么吗?该表有3600万条记录要排序,对于同一表的每条记录。tModified是时间戳,您认为max会返回上次修改的记录吗?@Developer感谢您捕捉到它。tModified是时间戳,您认为max会返回上次修改的记录吗?@Developer感谢您捕捉到它。