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

时间:2011-06-23 19:27:20

标签: sql postgresql query-optimization

我实际上有相同的连接查询,我的(>两个)查询之间的差异是作为连接的表之一。性能方面更好的是: 1)重写查询(在一个存储过程中?)或 2)将连接所​​在的表作为参数传递给存储过程(用plpgsql BTW编写)并使用EXECUTE运行查询

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

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

4 个答案:

答案 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并管理应用程序内的命名语句。