`
lshh83
  • 浏览: 161473 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

postgres数据库优化(处理大表)

阅读更多
   最近项目要改成网络版,这样原项目肯定不适合,特别是数据库方面,网络版用户会很多,检测到的数据会更多,估算了下,某些表可能超出表的最大容量,因此要对数据库进行优化。
   数据库优化主要包括包括对冗余字段的处理,提高查询性能和大表的处理,针对冗余字段,初步看了下,主要是有的字段根本没用到,这个可能是在原来设计的时候考虑太复杂,而现实项目中根本没有用,可以通过重新定义表,删除没有用的字段来处理。提高查询性能可通过建立相关索引,优化sql等手段达到目的。在这里主要对最后一个问题发表点自己的思路。
  谈到大表,会不自然的想到分区(拆分表),把一个表分成几个表来处理不就可以了。但我们的项目用的是postgres数据库,它有没有分区的功能?经过查资料,整理出一套方案。

  目前,PostgreSQL 支持通过表继承进行分区。 每个分区必须做为单独一个父表的子表进行创建。父表自身通常是空的; 它的存在只是为了代表整个数据集。

PostgreSQL 里面可以实现下面形式的分区:
范围分区
表被一个或者多个键字字段分区成"范围", 在这些范围之间没有重叠的数值分布到不同的分区里。 比如,我们可以为特定的商业对象根据数据范围分区,或者根据标识符范围分区。
列表分区
表是通过明确地列出每个分区里应该出现那些键字值实现的。

目前还不支持散列分区。

要设置一个分区的表,做下面的步骤:
创建"主表",所有分区都从它上面继承下去。
这个表将没有什么数据,不要在这个表上定义任何检查约束, 除非你希望约束同样也适用于所有分区。同时在其上定义任何索引或者唯一约束也没有意义。
创建几个"子"表,每个都从主表上继承。 通常,这些表将不会对从主表继承过来集合增加任何字段。
我们将把子表称作分区,尽管它们就是普通的 PostgreSQL 表。
给分区表增加约束,定义每个分区允许的健值。

CREATE TABLE test ( id int not null,
  logdate date not null );
每个分区都是拥有自己内容的完整的表,只是它们从 measurement 表继承定义。
这样就解决了我们的一个问题:删除旧数据。 每个月,我们需要做的只是在最旧的子表上执行一个 DROP TABLE, 然后为新月份创建一个新的子表。
我们必须增加非重叠的表约束,所以我们的建表脚本就变成:
CREATE TABLE test0801 ( CHECK (
  logdate >= DATE '2008-01-01' AND logdate < DATE '2008-02-01' ) )
INHERITS (test);
CREATE TABLE test0802 ( CHECK (
  logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' ) )
INHERITS (test);
......
我们可能还需要在键字字段上有索引:
CREATE INDEX test0801_logdate ON
  test0801(logdate);
CREATE INDEX test0802_logdate ON
  test0802(logdate);
......
我们选择先不建立更多的索引。
如果数据只进入最新的分区,我们可以设置一个非常简单的规则来插入数据。 我们必须每个月都重新定义这个规则,这样它总是指向当前分区。
(1。可以为用户做个界面,我们写好脚本,当子表的数据量达到一定数量的时候自动提醒管理员要创建新的子表了,这样管理员去手工点下创建新表,程序会创建新表并把相关的约束建好。
2。也可以创建触发器,当子表数达到一定量时自动触发创建子表或每个月初自动创建子表)
CREATE OR REPLACE RULE test_current_partition AS
  ON INSERT TO test DO INSTEAD INSERT INTO
test0802 VALUES ( NEW.id, NEW.logdate );
分区和约束排除

约束排除(Constraint exclusion)是一种查询优化技巧, 它改进了用上面方法定义的表分区的性能。比如:

SET constraint_exclusion = on; SELECT count(*) FROM
  test WHERE logdate >= DATE ‘2008-01-01′;
如果没有约束排除,上面的查询会扫描 measurement 表中的每一个分区。打开了约束排除之后,规划器将检查每个分区的约束然后试图证明该分区不需要被扫描,因为它不能包含任何符合 WHERE 子句条件的数据行。如果规划器可以证明这个,它就把该分区从查询规划里排除出去。

你可以使用 EXPLAIN 命令显示一个规划在 constraint_exclusion 打开和关闭情况下的不同。用上面方法设置的表的典型的缺省规划是:

SET constraint_exclusion = off; EXPLAIN SELECT count(*)
  FROM test WHERE logdate >= DATE ‘2006-01-01′;

部分或者全部分区可能会使用索引扫描而不是全表扫描, 不过这里要表达的意思是我们没有必要扫描旧的分区旧可以回答这个查询。 在我们打开约束排除之后,我们可以得到生成同样回答的明显节省的规划:

SET constraint_exclusion = on;
  EXPLAIN SELECT count(*) FROM test WHERE logdate >= DATE ‘2006-01-01′;
分享到:
评论

相关推荐

    Postgres数据库基于持久内存的优化探索.pptx

    4. 事务处理优化:Postgres数据库的事务处理机制可以使用PM来存储事务日志,从而提高数据库的事务处理性能。PM的高速读写特性可以满足高性能数据库应用的需求。 Postgres数据库基于持久内存的优化探索需要对数据库...

    实时采集postgres数据库日志.zip

    实时采集Postgres数据库日志是为了确保数据的安全性、性能优化以及故障排查。 【描述】中的"数据采集、处理、显示相关的源码、工具、数据集"揭示了整个过程的几个关键环节。数据采集是获取信息的第一步,这通常通过...

    Postgres查询优化方案

    综上所述,Postgres查询优化是一个多方面、系统性的工作,涉及到索引、查询语句、数据库结构、硬件配置等多个层面。通过对这些方面的深入理解和实践,我们可以有效应对大数据量下的查询挑战,实现高效的数据访问。...

    linux-一个小100lineshell脚本用来管理Postgres数据库

    在Linux环境中,shell脚本是一种强大的工具,可以自动化执行一系列命令,提高工作效率。在这个场景中,我们有一个专门用于管理Postgres...通过学习和理解这个脚本的工作原理,我们可以更好地管理和优化Postgres数据库。

    postgres 代码生成器

    在C#编程环境中,使用Postgres作为数据库时,开发人员往往需要编写大量的重复代码来处理数据库操作。例如,创建ADO.NET实体、数据访问接口、数据访问类、业务逻辑类等。代码生成器则自动完成这些工作,显著提高开发...

    如何将一个大规模并行的Postgres数据库移植到Kubernetes上- 译稿1

    \n\n总结来说,将大规模并行的Postgres数据库,如Greenplum,移植到Kubernetes上,是利用现代云原生技术优化数据处理能力的有效途径。通过Kubernetes的自动化管理和资源调度,可以提升Greenplum的部署效率,同时保持...

    postgres分布式数据库学习资料

    - **Sharding**:通过数据分区策略,将大表分散到多个物理节点,实现水平扩展,提高读写性能。 - **Replication**:主从复制是Postgres实现高可用性和故障恢复的重要手段,可以配置多级复制链路以增强容错性。 - ...

    Postgres-XL数据库集群配置说明

    横向扩展意味着可以通过增加更多的服务器来提升数据库的处理能力,它特别适合于需要处理大规模并行数据处理任务的场景。Postgres-XL支持多主节点架构,允许不同的数据库操作在多个主节点间分布执行,这显著提高了...

    百分百 Postgres 百倍性能提升

    在深入探讨“百分百 Postgres 百倍性能提升”这一主题之前,我们首先了解Postgres数据库的基础知识。Postgres,也称为PostgreSQL,是一个开源的对象关系数据库管理系统(ORDBMS),具有复杂的查询优化器和强大的多...

    postgresSQL数据库安装流程.txt

    主要讲解PostgreSql 10.7 数据库的安装流程,包括系统的优化,环境准备,每一步安装的命令。

    BootcampX:Postgres数据库

    这个名为"BootcampX:Postgres数据库"的资源可能是针对初学者或开发者的一个训练课程,旨在帮助他们掌握Postgres的基本操作和高级特性。下面我们将深入探讨Postgres数据库的相关知识点。 1. **Postgres的核心概念**...

    3.(高级示例篇)leaflet+postgres+postgis+geoserver实现高性能热力图(亿级别数据量).zip

    在本项目中,Geoserver会作为中间层,负责从Postgres数据库中获取处理后的数据,并通过WMS(Web Map Service)或WFS(Web Feature Service)协议向客户端(即使用Leaflet的浏览器应用)提供服务。这使得前端可以动态...

    将postgres 表结构和数据转换到sqllite数据库中的工具类源码

    6. **性能优化**:由于可能涉及大量数据迁移,应考虑批量插入、多线程处理等优化策略,以提高迁移速度。 这个工具类源码的实现细节可能包括使用Spring Boot的JdbcTemplate或者JPA(Java Persistence API)进行...

    postgresql-42.2.14.数据库驱动jar

    通常,每个新版本的驱动都会修复一些已知问题,增加新的功能,或者优化性能,所以建议使用与数据库版本匹配的最新驱动。 在实际应用中,为了使用这个驱动,你需要将其添加到你的项目类路径中。在Java的Maven项目中...

    postgres 8.3 数据库

    此外,它支持复杂的事务处理,遵循ACID(原子性、一致性、隔离性、持久性)原则,确保数据的一致性和可靠性。 2. **复制与恢复**:8.3 版本引入了流复制功能,允许数据库进行实时的数据复制,这对于高可用性和灾难...

    pg-http-request-classifier:在Postgres数据库上对HTTP请求进行分类

    3. 存储请求数据:将分类后的请求信息存储到Postgres数据库,便于持久化和后期查询。 4. 实时监控:可能提供实时监控功能,展示当前的请求流量和分类状态,帮助运维人员及时发现和解决问题。 5. 报告生成:生成详细...

    东北大学数据库实验报告(PostgreSQL)

    通过这四次实验,学生不仅会掌握PostgreSQL的基本操作,还会对数据库的设计、优化及并发处理有深入理解,这对于未来在IT领域,特别是在数据库管理和开发方面的工作将大有裨益。这些技能也是IT专业人士在处理大量数据...

    create-table-postgres-database.zip_Table_postgres

    通过将大表分成多个小块(分区),可以优化查询性能。创建分区表通常涉及`CREATE TABLE AS SELECT`和`CREATE TABLE PARTITION OF`语句。 在"create-table-postgres-database.zip"文件中,很可能包含了一系列创建...

    用postgresSQL实现的数据库library系统

    在本项目中,"用postgresSQL实现的数据库library系统"是一个基于PostgreSQL数据库和JSP技术构建的图书馆管理系统。这个系统展示了如何将数据库管理和Web应用相结合,为用户提供图书查询、借阅、归还等基本功能。以下...

    edb postgres studio 1.10.5-4 for windows

    EnterpriseDB是PostgreSQL的一个分支,在PostgreSQL基础上,针对企业级应用进行了专门的优化,同时,增加了一系列如动态 性能调优(DynaTune)、EDB Loader、高效批量SQL处理等高级特性;在众多功能亮点中,...

Global site tag (gtag.js) - Google Analytics