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