sql - Postgres - 观点是否得到准备好的陈述的支持?

标签 sql postgresql prepared-statement sql-view

在创建 View 的时候,PostgreSQL是否也为对应的查询创建了prepared statement?还是每次访问 View 时都重新生成查询执行计划?

最佳答案

不是,每次使用 View 都会构造一个查询计划。即使 View 与其他表或 View 连接(您可以将 View 视为一种宏)。只需查看生成的查询计划:

CREATE table one
        ( one_id INTEGER NOT NULL PRIMARY KEY
        , one_text text
        );
INSERT INTO one (one_id,one_text)
SELECT gs, 'one_' || gs::integer
FROM generate_series (0,10,2) gs;

CREATE table two
        ( two_id INTEGER NOT NULL PRIMARY KEY
        , two_text text
        );
INSERT INTO two (two_id,two_text)
SELECT gs, 'two_' || gs::integer
FROM generate_series (0,10,3) gs;

VACUUM ANALYZE one;
VACUUM ANALYZE two;

CREATE VIEW silly_carth AS
SELECT o.one_id, o.one_text
        , t.two_id, t.two_text
FROM one o
CROSS JOIN two t
        ;

EXPLAIN
SELECT * FROM silly_carth;
EXPLAIN
SELECT * FROM silly_carth WHERE one_id = two_id;

结果计划:

                            QUERY PLAN                            
------------------------------------------------------------------
 Nested Loop  (cost=0.00..2.41 rows=24 width=20)
   ->  Seq Scan on one o  (cost=0.00..1.06 rows=6 width=10)
   ->  Materialize  (cost=0.00..1.06 rows=4 width=10)
         ->  Seq Scan on two t  (cost=0.00..1.04 rows=4 width=10)
(4 rows)

                            QUERY PLAN                            
------------------------------------------------------------------
 Hash Join  (cost=1.09..2.21 rows=4 width=20)
   Hash Cond: (o.one_id = t.two_id)
   ->  Seq Scan on one o  (cost=0.00..1.06 rows=6 width=10)
   ->  Hash  (cost=1.04..1.04 rows=4 width=10)
         ->  Seq Scan on two t  (cost=0.00..1.04 rows=4 width=10)
(5 rows)

关于sql - Postgres - 观点是否得到准备好的陈述的支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34807950/

相关文章:

MySQL 通过删除旧数据并保持行数相同来添加新数据

更新列出的所有列时的 Postgresql 触发器

PHP Prepared Statement删除所有记录

php - 对于 PDO 准备语句,我应该使用 bindParam()、bindValue() 还是 execute()

php - 我可以为 MySQL 中的列指定特定的可选值吗

sql - 使用 SQL 插入重复记录

sql - PostgreSQL - 确定总数的百分比

postgresql - 预写日志记录如何提高 Postgres 中的 IO 性能?

node.js - NodeJs - Sequelize - 无法识别的属性数据类型

MYSQL查询成java jdbc准备语句,报错: com. mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException