a.o*_*ron 3 sql postgresql sql-optimization
我正在为PostgresQL 9.1开发Pg/PLSQL函数.当我在SQL查询中使用变量时,优化器会构建错误的执行计划.但是如果我用它的值替换变量,那么计划就可以了.例如:
v_param := 100;
select count(*)
into result
from <some tables>
where <some conditions>
and id = v_param
Run Code Online (Sandbox Code Playgroud)
在3s内完成
和
select count(*)
into result
from <some tables>
where <some conditions>
and id = 100
Run Code Online (Sandbox Code Playgroud)
在300ms内完成
在第一种情况下,优化器为任何v_param值生成固定计划.
在第二种情况下,优化器基于指定的值生成计划,尽管不使用计划缓存,但它的效率明显更高.
是否可以使优化器在没有动态绑定的情况下生成计划,并在每次执行查询时生成计划?
刚刚发布的PostgreSQL 9.2中,Tom Lane已经大大改善了这一点.请参阅PostgreSQL 9.2中的新功能:
准备好的语句曾经优化过一次,不知道参数的值.对于9.2,计划程序将使用有关所发送参数的特定计划(查询将在执行时计划),除非查询执行多次并且计划程序确定通用计划不比特定计划昂贵得多.
这是一个长期和痛苦的疣,以前需要SET enable_...使用params,使用包装函数EXECUTE或其他丑陋的黑客.现在它应该"正常工作".
升级.
对于阅读此内容的其他人,您可以判断此问题是否正在咬你,因为auto_explain参数化/准备好的查询计划与您explain自己查询时的计划不同.要验证,请尝试PREPARE ... SELECT然后EXPLAIN EXECUTE查看是否有不同的计划EXPLAIN SELECT.
另见此先前的答案.
| 归档时间: |
|
| 查看次数: |
2104 次 |
| 最近记录: |