我有几乎相同的连接查询,我的(>两个)查询之间的区别是作为连接的表之一 . 性能方面更好的是:1)重写查询(在一个存储过程中?)或2)传递连接所在的表作为存储过程中的参数(用plpgsql BTW编写)并运行查询执行
我假设2)更优雅,但是通过使用EXECUTE,一个人无法从查询优化中获益
还有,当我有不同数量的条件时 . 如何确保查询在最佳时间运行? (我把它重写10次以上的查询不是要走的路:D)
如果您想从查询优化中受益,您绝对应该重写查询 .
它确实会导致不那么优雅和更长的代码,而且难以维护,但这是为了支付性能而有时需要的价格 .
由于重复规划了执行的查询,因此使用 execute 会有一些开销 .
execute
为了获得最佳结果和可维护性,请编写一个函数来编写所需的各种函数 . 例:
PostgreSQL trigger to generate codes for multiple tables dynamically
EXECUTE是动态的,需要至少一个新的解析 - 所以更多的开销 .
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 并管理应用程序内部的命名语句 .
PREPARE
EXECUTE
4 回答
如果您想从查询优化中受益,您绝对应该重写查询 .
它确实会导致不那么优雅和更长的代码,而且难以维护,但这是为了支付性能而有时需要的价格 .
由于重复规划了执行的查询,因此使用
execute
会有一些开销 .为了获得最佳结果和可维护性,请编写一个函数来编写所需的各种函数 . 例:
PostgreSQL trigger to generate codes for multiple tables dynamically
EXECUTE是动态的,需要至少一个新的解析 - 所以更多的开销 .
如果您能够缓存查询计划,请执行此操作 . 动态执行SQL意味着后端需要每次都重新规划查询 . 有关详细信息,请查看PREPARE .
不必要! Pl/PgSQL automatically does a PREPARE/EXECUTE为你 . 这是使用Pl / PGSQL可以获得的主要速度增益之一 . 修辞:您认为生成_1734777中显示的计划是便宜还是容易?如果可能的话,缓存那一大块工作 .
使用单独的
PREPARE
ed语句是一种方法,也是优化查询执行的最佳方式 . 你可以做一些奇特的事情,比如使用单个集合返回PL函数,你传递不同的参数,它有条件地执行不同的SQL,但我不推荐它 . 为获得最佳性能,请坚持PREPARE
/EXECUTE
并管理应用程序内部的命名语句 .