Postgresql查询效率计算初探_PostgreSQL

来源:脚本之家  责任编辑:小易  

你下的是编译完的二进制版,源码版在Source code下点file brower,下载postgresql-9.2.1.tar.gz

摘要

关系数据库很重要的一个方面是查询速度。查询速度的好坏,直接影响一个系统的好坏。

"||" 就相当于字符串的加法

查询速度一般需要通过查询规划来窥视执行的过程。

在已经安装了PostgreSQL的Linux上,使用下面的命令即可查询安装的版本:psql --version PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名

查询路径会选择查询代价最低的路径执行。而这个代价是怎么算出来的呢。

首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等; postgresql 64位:http://www.3322.cc/so

主要关注的参数和表

log_duration = off log_statement = 'none' 这两个选项的意思是不log任何sql语句和执行时间,但是恰恰是关闭了这两个,log_min_duration_statement才会生效!可能postgresql内部

参数:来自postgresql.conf文件,可以通过show 来查看

但是口说无凭,所以在我的电脑上写了几个查询测试一下。我用的是Postgresql9.4,但感 但在数据量更大(按照原问题,这里in的数量其实无法预知)的情况下效率只会更低,再加上

seq_page_cost = 1.0 # measured on an arbitrary scale random_page_cost = 4.0 # same scale as above cpu_tuple_cost = 0.01 # same scale as above cpu_index_tuple_cost = 0.005 # same scale as above cpu_operator_cost = 0.0025 # same scale as above parallel_tuple_cost = 0.1 # same scale as above parallel_setup_cost = 1000.0 # same scale as above

在pgAdmin的窗口中,直接打开SQL文件然后执行就可以了。 你所说的Oracle的执行方式,应该是在sql plus命令窗口中执行sql文件。这个功能在PostgreSQL的命令窗口psql中也

表(视图): pg_class(主要关注relpages, reltuples), pg_stats

贴一下报错

分析简单的查询的成本计算过程

没用过.run,为何不从源码直接编译?

建立模拟数据,插入100000条数据进入一个表

在pg_hba.conf配置文件中更改密码方式

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

create table test(id int, info text); insert into test(id, info) select i, md5(i::text) from generate_series(1, 100000) t(i);

Select * from (Select * from 表名) 括号内为第一个查询。

没有索引的情况

1)下载腾讯手机管家PC版,安装完成并成功连接上手机; 2)打开腾讯手机管家PC版----工具箱----第三方工具中,就可以看到kingroot工具; 3)点击kingroot,手机与电脑连接正常后点

分析全表查询的成本计算过程

参考一下如下的页面。

postgres=# analyze test; #防止没有分析 postgres=# explain select * from test; QUERY PLAN ------------------------------------------------------------- Seq Scan on test (cost=0.00..1834.00 rows=100000 width=37)

1.查询pg_class表,查看test表的page数量和行数

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

postgres=# select t.relpages, t.reltuples from pg_class t where t.relname = 'test'; relpages | reltuples ----------+----------- 834 | 100000

成本为1834.00是怎么算出来的?

2.这个过程,实际上是顺序扫描了834个page,节点发射了100000行

3.查看配置参数

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

seq_page_cost = 1.0 cpu_tuple_cost = 0.01

4.得出的结果就是

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

postgres=# select 834 * 1.0 + 100000 * 0.01; ?column? ---------- 1834.00

5.得出来的查询成本就是 1834.00。和上面的查询计划算出来的一致。

全表加入条件的成本计算过程

postgres=# explain select * from test where id = 100; QUERY PLAN -------------------------------------------------------- Seq Scan on test (cost=0.00..2084.00 rows=1 width=37) Filter: (id = 100)

成本 2084.00是怎么算出来的?

1.查询pg_class表, pages,tuples和上面的例子一样

2.这个过程就是顺序test表,发射100000行,然后通过云存过滤了100000行

3.查看过滤运算一行的代价

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

cpu_operator_cost = 0.0025

4.得出的结果是

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

postgres=# select 834 * 1.0 + 100000 * 0.01 + 100000 * 0.0025; ?column? ----------- 2084.0000

加入索引的情况

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

``` create index on test(id); ```

对比下面的四种情况

Index Only Scan

postgres=# explain select id from test where id = 100; QUERY PLAN ----------------------------------------------------------------------------- Index Only Scan using test_id_idx on test (cost=0.29..8.31 rows=1 width=4) Index Cond: (id = 100)

Index Scan

postgres=# explain select * from test where id = 100; QUERY PLAN ------------------------------------------------------------------------- Index Scan using test_id_idx on test (cost=0.29..8.31 rows=1 width=37) Index Cond: (id = 100)

Index Scan

postgres=# explain select * from test where id < 100; QUERY PLAN ---------------------------------------------------------------------------- Index Scan using test_id_idx on test (cost=0.29..10.11 rows=104 width=37) Index Cond: (id < 100)

把数据乱序插入

truncate table test; insert into test(id, info) select i, md5(i::text) from generate_series(1, 1000000) t(i) order by random();

postgres=# explain select * from test where id < 100; QUERY PLAN ---------------------------------------------------------------------------- Bitmap Heap Scan on test (cost=5.22..380.64 rows=102 width=37) Recheck Cond: (id < 100) -> Bitmap Index Scan on test_id_idx (cost=0.00..5.19 rows=102 width=0) Index Cond: (id < 100)

结论

VACUUM 回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 VACUUM, 特别是在常更新的表上。 具体命令格式查找下文档吧!

有索引的时候,成本会大大减少。 执行计划跟数据的分布有很大的关系。 有索引的分析相对复杂一点,可以先参考官方源码实现。后面再补充上来

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

PostgreSQL从菜鸟到专家 什么是PostgreSQL数据库

  安装PostgreSQL数据库之后,默认是只接受本地访问连接。如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相 应的配置。配置远程连接PostgreSQL数据库的步骤很简单,只需要修改data目录下的pg_hba.conf和postgresql.conf, 其中pg_hba.conf是用来配置对数据库的访问权限,postgresql.conf文件用来配置PostgreSQL数据库服务器的相应的参数。 下面介绍配置的步骤:   1.修改pg_hba.conf文件,配置用户的访问权限:   # TYPE DATABASE USER CIDR-ADDRESS METHOD   # "local" is for Unix domain socket connections only   local all all trust   # IPv4 local connections:   host all all 127.0.0.1/32 trust   host all all 192.168.1.0/24 md5   # IPv6 local connections:   host all all ::1/128 trust   其中红色标识的内容为新添加的内容,表示允许网段192.168.1.0上的所有主机使用所有合法的数据库用户名访问数据库,并提供加密的密码验 证。在我们的环境中,我们需要在主机192.168.1.5上使用postgres用户访问192.168.1.9上的PostgreSQL数据库。   2.修改postgresql.conf文件,将数据库服务器的监听模式修改为监听所有主机发出的连接请求。   定位到#listen_addresses='localhost'。PostgreSQL安装完成后,默认是只接受来在本机localhost的连接请 求,通过将改行内容修改为listen_addresses='*'来允许数据库服务器监听来自任何主机的连接请求:   listen_addresses = '*' # what IP address(es) to listen on;   # comma-separated list of addresses;   # defaults to 'localhost', '*' = all   # (change requires restart)   修改之后,保存并退出,然后重起数据库,就可以在在远程机器上访问PostgreSQL数据库了。   另外,数据库管理小贴士:   matrix数据库使用的是PostgreSQL数据库。你可以安装一个类似phpmyadmin的管理

用JSP编写计算程序,该怎么编程连接到数据库PostgreSQL啊?一些参数需要从PostgreSQL的数据表里面调用

以下是我给你提供的一个连接类

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576import java.sql.*; public class connect{     String strDBDriver="org.postgresql.Driver";    String strDBUrl="jdbc:postgresql://localhost:1433;databasename=数据库名;     private Connection conn=null;    private Statement stmt=null;    ResultSet rs=null;    public ksxt()    {        try        {            Class.forName(strDBDriver);        }        catch(java.lang.ClassNotFoundException e)         {            System.err.println("ksxt():"+e.getMessage());        }    }    public ResultSet executeQuery(String sql)    {        rs=null;        try        {            conn=DriverManager.getConnection(strDBUrl,"数据库登录名","密码");            stmt=conn.createStatement();            rs=stmt.executeQuery(sql);        }        catch(SQLException ex)         {            System.err.println("aq.executeQuery:"+ex.getMessage());        }        return rs;    }    public void executeUpdate(String sql)    {        stmt=null;        rs=null;        try        {            conn=DriverManager.getConnection(strDBUrl,"数据库登录名","密码");            stmt=conn.createStatement();            stmt.executeQuery(sql);            stmt.close();            conn.close();        }        catch(SQLException ex)        {            System.err.println("aq.executeQuery:"+ex.getMessage());        }    }    public void closeStmt()    {        try        {            stmt.close();        }        catch(SQLException e)        {            e.printStackTrace();        }    }    public void closeConn()    {        try        {            conn.close();        }        catch(SQLException e)        {            e.printStackTrace();        }    }}

安装postgresql之后为什么找不到postgresql service

没有正常启动 postgresql service.
可以 在运行里面 输入 services.msc 找到 postgresql 的服务。启动他。
或者也可以
用postgres 自带的 工具pg_ctl来注册
D:\pgsql>bin\pg_ctl register -N PostgreSQL -D “D:\pgsql\data”
启动PostgreSQL服务
D:\pgsql> sc start PostgreSQL

为什么linux不能安装最新版本的postgresql呢 (postgresql-9.1.2.tar.gz)

可选择源码编译安装:一、在root用户下使用源码编译方式安装PostgreSQL1. 解压tar jxvf postgresql-9.1.2.tar.bz2 2. 检查依赖软件包rpm -qa | grep readlinerpm -qa | grep zlibrpm -qa | grep gccrpm -qa | grep make3. 如果缺少依赖软件包,安装以下软件包gccmakezlib-develreadline-devel4. 配置PostgreSQLcd postgresql-9.1.2./configure --prefix=/usr/local/pgsql5. 编译并安装PostgreSQLmakemake install6. 创建组和用户groupadd postgres useradd -g postgres postgrespasswd postgres 7. 创建数据库库文件存储目录、给postgres赋予权限:mkdir /usr/local/pgsql/datacd /usr/local/pgsqlchown postgres.postgres datatouch /var/log/pgsql.logchown postgres.postgres /var/log/pgsql.log8. 初始化数据库目录(在postgres用户下执行命令)cd /usr/local/pgsql/./bin/initdb -E UTF-8 -D /usr/local/pgsql/data --locale=zh_CN.UTF-8

  • 本文相关:
  • postgresql中使用dblink实现跨库查询的方法
  • 在postgresql中实现递归查询的教程
  • postgresql树形结构的递归查询示例
  • pgsql查询优化之模糊查询实例详解
  • sql server数据迁移至postgresql出错的解释以及解决方案
  • postgresql中使用dblink实现跨库查询的方法
  • linux下创建postgresql数据库的方法步骤
  • postgresql图(graph)的递归查询实例
  • postgresql教程(四):数据类型详解
  • 在windows下手动初始化postgresql数据库教程
  • postgresql数据库中跨库访问解决方案
  • postgresql教程(十五):系统表详解
  • postgresql树形结构的递归查询示例
  • postgresql数据库事务实现方法分析
  • PostgreSQL从菜鸟到专家 什么是PostgreSQL数据库
  • 用JSP编写计算程序,该怎么编程连接到数据库PostgreSQL啊?...
  • 安装postgresql之后为什么找不到postgresql service
  • 为什么linux不能安装最新版本的postgresql呢 (postgresql-9.1.2...
  • postgresql查询当前月数据 表中为Oracle数据库语句,怎么修改时...
  • postgresql数据库linux源码解压后找不到configure 版本为postg...
  • postgresql postgresql ”||“的用法
  • linux 如何查询PostgreSQL的版本
  • 请问谁有 navicat postgresql 的注册码, 或者如何破解navicat po...
  • 如何查看PostgreSQL执行效率低的SQL
  • 探讨select in 在postgresql的效率问题
  • 如何查看PostgreSQL执行效率低的SQL
  • 用PHP连接linux下的PostgreSQL数据库,用pgadmin可以连同虚...
  • postgreSQL Error running /temp/postgresql_installer/get...
  • PostgreSql用C:\Program Files\PostgreSQL\9.0\bin\...
  • postgresql 运行三四天后变的越来越慢,需要怎样配置postgresq...
  • postgresql 如何将查询结果作为另一个表的名字来使用
  • 如何用root用户对postgresql查询同步状态
  • 用PHP连接PostgreSQL,php.ini文件用做修改吗?我用在PHP中...
  • 你是怎么把MySQL成功转为PostgreSQL的,能不能告诉我,我有...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页postgresqlpostgresql中使用dblink实现跨库查询的方法在postgresql中实现递归查询的教程postgresql树形结构的递归查询示例pgsql查询优化之模糊查询实例详解sql server数据迁移至postgresql出错的解释以及解决方案postgresql中使用dblink实现跨库查询的方法linux下创建postgresql数据库的方法步骤postgresql图(graph)的递归查询实例postgresql教程(四):数据类型详解在windows下手动初始化postgresql数据库教程postgresql数据库中跨库访问解决方案postgresql教程(十五):系统表详解postgresql树形结构的递归查询示例postgresql数据库事务实现方法分析postgresql 角色与用户管理介绍windows下postgresql数据库的下载windows下postgresql安装图解15个postgresql数据库实用命令分postgresql中的oid和xid 说明windows postgresql 安装图文教程postgresql alter语句常用操作小postgresql 安装和简单使用postgresql 创建表分区postgresql新手入门教程postgresql 数据库性能提升的几个方面postgresql备份和增量恢复方案postgresql中调用存储过程并返回数据集实postgresql管理工具phppgadmin入门指南windows上postgresql安装配置教程sqlite教程(七):数据类型详解postgresql教程(十一):服务器配置phppgadmin 配置文件参数说明中文版postgresql树形结构的递归查询示例postgresql 查看数据库,索引,表,表空间
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved