我们正在处理一个极端(超过几分钟)的长时间运行的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 blogs和SO posts推荐了此方法的一种版本,潜在的问题(如果有)是什么?
最终,我们当然想修复查询以及数据库本身的任何潜在问题,但是除了消耗可能很大的内存占用空间(as mentioned here)之外,这种方法的潜在陷阱还有哪些? ?
答案 0 :(得分:1)
您不需要任何多处理模块,只需将statement_timeout
设置为查询的最大持续时间。
是的,找到并调整引起您问题的查询。
答案 1 :(得分:0)
尽管此查询正在运行多个进程,但此时对数据库的查询数量将增加,这将增加数据库的负载,其他来源的其他优先级查询也会受到影响。