PREPARE - 创建一个准备好的查询

SYNOPSIS

PREPARE plan_name [ (datatype [, ...] ) ] AS statement

DESCRIPTION 描述

PREPARE 创建一个已准备好的查询。 一个已准备好的查询是服务器端的对象,可以用于优化性能。 在执行 PREPARE 语句的时候,指定的查询被分析,重写以及规划。 当随后发出 EXECUTE 语句的时候, 已准备好的查询就只需要执行了。因此,分析,重写,以及规划阶段都只执行一次,而不是每次查询执行的时候都要执行一次。

准备好的查询可以接受参数:在它执行的时候替换到查询中的数值。 要给一个准备好的查询声明参数,我们需要在 PREPARE 语句里包含一个数据类型的列表。在查询本身里,你可以按照位置来引用这些参数, 比如 $1,$2,等。 在执行查询的时候,在 EXECUTE 语句里为这些参数声明实际的数值。 参考 EXECUTE [execute(7)] 获取更多信息。

准备好的查询是在本地存储的(在当前后端里),并且只是在当前数据库会话的过程中存在。 如果客户端退出,那么准备好的查询就会被遗忘,因此我们必须在被重新使用之前重新创建。 这也意味着一个准备好的查询不能被多个同时的数据库客户端使用; 但是,每个客户端可以创建它们自己的已准备好的查询来使用。

如果一个会话准备用于执行大量类似的查询,那么已准备好的查询可以获得最大限度的性能优势。 如果查询非常复杂,需要复杂的规划或者重写,那么性能差距将非常明显。 比如,如果查询设计许多表的连接,或者有多种规则要求应用。如果查询的规划和重写相对简单, 而执行起来开销相当大,那么已准备好的查询的性能优势就不那么明显。

PARAMETERS 参数

plan_name
给予这个特定的已准备好查询的任意名字。它必须在一个会话中是唯一的, 并且用于执行或者删除一个前面准备好的查询。
datatype
已准备好查询的某个参数的数据类型。要在已准备好查询内部引用这个参数,使用 $1,$2,等。
statement
任何 SELECT, INSERT, UPDATE, 或 DELETE 语句。

NOTES 注意

在一些情况下,PostgreSQL 为一个已准备好的查询生成的查询规划可能还不如按照普通方法提交并执行的查询生成的规划好。 这是因为该查询在被规划的时候(也是优化器视图判断最优查询规划的时候), 在查询中声明的任何参数的实际数值都还不可见。 PostgreSQL 在表中收集数据分布的统计, 而且可以利用查询中的常量来猜测执行查询的可能结果。 因为这些数据在准备哪种带参数的查询的规划的时候还不可得, 所以,选出来得规划可能是次好的。 要检查 PostgreSQL 为已准备好的查询选取的查询计划, 使用 EXPLAIN EXECUTE

原文地址:https://www.cnblogs.com/fanweisheng/p/11097572.html

时间: 2024-10-24 15:42:58

PREPARE - 创建一个准备好的查询的相关文章

DEALLOCATE - 删除一个准备好的查询

SYNOPSIS DEALLOCATE [ PREPARE ] plan_name DESCRIPTION 描述 DEALLOCATE 用于删除前面准备好的查询. 如果你没有明确 DEALLOCATE 一个准备好的查询, 那么它在会话结束的时候删除. 有关已准备好的查询的更多信息.参阅 PREPARE [prepare(7)]. PARAMETERS 参数 PREPARE  这个关键字被忽略. plan_name  要删除的已准备查询. COMPATIBILITY 兼容性 SQL 标准包括一个 

Java链接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash

准备工作 1.创建Java的Maven项目 创建好的目录结构如下:  另外注意junit的版本,最好不要太高,最开始笔者使用的junit4.12的,发现运行的时候会报错.最后把Junit的版本改成4.7的之后,问题解决了. 创建测试工具类HbaseDemo,为了保证能够让Hbase运行,需要最开始写出如下配置: package toto.com.hbase; import java.util.ArrayList; import java.util.Iterator; import org.apa

使用函数创建一个过滤查询

使用类:public class FunctionRangeQParserPlugin extends QParserPlugin 通过函数创建一个范围查询: 其他参数: l, 下限范围,可选) u, 上限范围,可选) incl, 包含下限:true/false,可选,默认为true incu, 包含上限:true/false,可选,默认为true例子: {!frange l=1000 u=50000}myfield 过滤查询例子:: fq={!frange l=0 u=2.2}sum(user

利用Myeclipse创建一个Swing应用

在我看来,java强大之处在于:Java不仅仅适用于B/S架构的程序,是做服务端的不二之选以外;还可以用来做C/S架构的程序.虽然现在市面上越来越少使用这种技术,被诸如C#之类的语言代替,但swing的确可以实现桌面化的客户端程序.学java的最好还是要知道有swing这个东西,不然当老板问你知不知道Swing.你说不知道会很尴尬.我们总监问我和另一个同事知不知道swing,那个小伙子一脸懵逼的看着我......闲话少叙,我们一起来看一下利用Myeclipse怎么创建一个swing程序.首先准备

使用ABP创建一个《电话簿项目》-MPA版本

此篇博客是属于半教程博客,为什么说是半教程呢.因为我不会打算说什么理论性的东西,没必要.要看理论性的资料以及基础信息,请前往tkb至简和@阳光铭睿的博客查看文档资料. 扫个小盲: MPA:为多页面,通过服务器端进行渲染razor进行绑定数据的方式(等其他情况. SPA:则为单页面,可以用作前后端分离如:vue,angular这些前端技术,而后端只需要提供webapi就可以了(当然还有其他方式. 1.首先创建一个模板解决方案"PhoneBook" 打开ABP的官方网站:http://ww

mysql 如何创建一个简单的存储过程

1 用mysql客户端登入2 选择数据库 mysql>use test3 查询当前数据库有哪些存储过程 mysql>show procedure status where Db='test'4 创建一个简单的存储过程 mysql>create procedure hi() select 'hello'; 5 存储过程创建完毕,看怎么调用它 mysql>call hi();显示结果 mysql> call hi(); +-------+ | hello | +-------+

关于Oracle 创建用户 ,分级查询,以及PL/SQL语言的随感

--------系统权限-------- 创建用户 create user zc identifid by zc ; --创建用户 grant create session to zc;--创建用户登陆权限 revoke create session from zc;--接触用户登陆权限 alter user account  unlock; --修改用户不锁定权限 drop user zc cascade:---级联删除 ----对象权限 三种对象:DBA  最高权限 resource 不能创

【Head First Servlets and JSP】笔记7:如何创建一个全局的dog?

重定向与请求分派 “局部”参数——ServletConfig——servlet初始化参数 “全局”参数——ServletContext——上下文初始化参数 Web app的“构造器”——ServletContextListener 实战:如何创建一个全局的dog? 1.重定向与请求分派. resp.sendRedirect("http://www.cnblogs.com/xkxf/"); RequestDispatcher view = req.getRequestDispatcher

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型 (转)

第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以跳过本章. 本章将带你漫游使用实体框架建模的基本实例,建模是实体框架的核心特性,同时也是区别实体框架和微软早期的数据访问平台的特性.一旦建好模,你就可以面向模型编写代码,而不用面向关系数据库中的行和列. 本章以创建一个简单概念模型的实例开始,然后让实体框架创建底层的数据库,剩下的实例,将向你展示,如