2017-04-03 58 views
1

我想知道如果我在PostgreSQL的准备语句,即:是否执行预先准备的声明中跳过规划阶段的PostgreSQL

PREPARE newquery(int) AS 
SELECT * FROM table1 WHERE somefield > $1; 

将后端调用解析分析和规划师,当我执行:

EXECUTE newquery(123); 

我发现了一些documentation,它说的是PostgreSQL的“跳过”解析准备查询的分析和规划,并通过这样做,显著优化查询执行。

我试图通过覆盖post_parse_analyze_hookplanner_hook,并从他们简单地写一些东西到日志文件(即“计划被称为”)测试这一点,所以我可以看到,如果规划者和分析仪被调用。这种测试方法是否有效?

我很困惑,因为每次执行EXECUTE newquery(some number);解析分析器和计划器都被调用。

我正在做这一切,因为我想要统计查询编译了多少次以便更好地理解“查询缓存”。

注意:我在一个会话中执行此操作。每次我连接到服务器时,我都会再次准备这些语句。

为什么计划和解析分析器被调用?

+0

我想为'EXECUTE newquery(123);'调用解析分析器,'不适合查询下划线和计划器,因为查询计划可能取决于参数。好问题,但让我们等待更有经验的人。 – Abelisto

回答

3

这必须是“定制计划”在9.2中引入的功能。 对于预处理语句的前几个执行,它将生成一个定制计划,该定制计划使用参数值,然后切换到通用计划(即不使用参数值),如果这些计划看起来不像通用计划。

尝试EXECUTE准备好的声明至少六次,看看规划师是否仍然被调用。

+0

谢谢!正好6次之后,策划者没有被叫到。还有一件事,解析分析器仍然被调用,对于'EXECUTE newquery(123);'? – ZrtvenoJagnje

+0

必须是。这是一个SQL查询,所以需要解析。 –

+0

非常感谢,先生! – ZrtvenoJagnje