首页 文章

选择使用EXECUTE并在postgres中重写类似的查询

提问于
浏览
1

我有几乎相同的连接查询,我的(>两个)查询之间的区别是作为连接的表之一 . 性能方面更好的是:1)重写查询(在一个存储过程中?)或2)传递连接所在的表作为存储过程中的参数(用plpgsql BTW编写)并运行查询执行

我假设2)更优雅,但是通过使用EXECUTE,一个人无法从查询优化中获益

还有,当我有不同数量的条件时 . 如何确保查询在最佳时间运行? (我把它重写10次以上的查询不是要走的路:D)

4 回答

  • 1

    如果您想从查询优化中受益,您绝对应该重写查询 .

    它确实会导致不那么优雅和更长的代码,而且难以维护,但这是为了支付性能而有时需要的价格 .

  • 0

    由于重复规划了执行的查询,因此使用 execute 会有一些开销 .

    为了获得最佳结果和可维护性,请编写一个函数来编写所需的各种函数 . 例:

    PostgreSQL trigger to generate codes for multiple tables dynamically

  • 0

    EXECUTE是动态的,需要至少一个新的解析 - 所以更多的开销 .

  • 1

    1)重写查询(在一个存储过程中?)

    如果您能够缓存查询计划,请执行此操作 . 动态执行SQL意味着后端需要每次都重新规划查询 . 有关详细信息,请查看PREPARE .

    2)将连接所在的表作为参数传递给存储过程(用plpgsql BTW编写)并使用EXECUTE运行查询

    不必要! Pl/PgSQL automatically does a PREPARE/EXECUTE为你 . 这是使用Pl / PGSQL可以获得的主要速度增益之一 . 修辞:您认为生成_1734777中显示的计划是便宜还是容易?如果可能的话,缓存那一大块工作 .

    另外,当我有不同数量的条件时呢 . 如何确保查询在最佳时间运行? (我把它重写10次以上的查询不是要走的路:D)

    使用单独的 PREPARE ed语句是一种方法,也是优化查询执行的最佳方式 . 你可以做一些奇特的事情,比如使用单个集合返回PL函数,你传递不同的参数,它有条件地执行不同的SQL,但我不推荐它 . 为获得最佳性能,请坚持 PREPARE / EXECUTE 并管理应用程序内部的命名语句 .

相关问题