代码之家  ›  专栏  ›  技术社区  ›  AdjunctProfessorFalcon

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

  •  0
  • AdjunctProfessorFalcon  · 技术社区  · 6 年前

    由于我们尚未诊断的原因,当对包含100多万条文本记录的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 ),这种方法还有哪些潜在的陷阱?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Laurenz Albe    6 年前

    您不需要任何多处理模块,只需设置 statement_timeout

    是的,找到并调整导致问题的查询。

        2
  •  0
  •   Joe Love    6 年前

    当为该查询运行多个进程时,在点处对DB的查询数将增加,这将增加DB的负载,来自其他源的任何其他优先级查询都将受到影响。