了解使用多处理来管理长时间运行的数据库查询的含义

时间:2018-10-02 17:13:44

标签: python django postgresql django-models python-multiprocessing

我们正在处理一个极端(超过几分钟)的长时间运行的Django orm关键字文本查询,该查询导致超时。

出于我们尚未诊断的原因,当在包含超过一百万条文本记录的postgres数据库中进行关键字搜索时,尽管实施了我们认为是提高性能的推荐方法(例如,场景(例如GIN索引和to_tsvectors)。

可能还有很多未解决的问题,但是作为一个临时解决方案,最初的Google搜索指向使用多处理模块来管理/停止挂起查询的解决方案。例如:

import multiprocessing
import time

def run_problem_db_query(textFileSearchParameter, returned_statements):
    # this is the db query that hangs.....
    retrieved_text_files = statements.extra(where=["textfiles_tsv @@ plainto_tsquery(%s)"], params=[textFileSearchParameter])
    return retrieved_text_files

retrieved_text_files = None

p = multiprocessing.Process(target=run_problem_db_query, name="run_problem_db_query", args=(textSearch, retrieved_text_files))
p.start()
time.sleep(10)
p.terminate()
p.join()

即使few blogsSO posts推荐了此方法的一种版本,潜在的问题(如果有)是什么?

最终,我们当然想修复查询以及数据库本身的任何潜在问题,但是除了消耗可能很大的内存占用空间(as mentioned here)之外,这种方法的潜在陷阱还有哪些? ?

2 个答案:

答案 0 :(得分:1)

您不需要任何多处理模块,只需将statement_timeout设置为查询的最大持续时间。

是的,找到并调整引起您问题的查询。

答案 1 :(得分:0)

尽管此查询正在运行多个进程,但此时对数据库的查询数量将增加,这将增加数据库的负载,其他来源的其他优先级查询也会受到影响。