您好!您这个问题有如下方案供参考
1、count 索引字段
2、打开constraint_exclusion参数配置
3、分区建议不要超过100个
如果还是慢请你发执行计划过来我看看。
PostgreSQL项目管理脚本SQL .
最近项目要改成网络版,这样原项目肯定不适合,特别是数据库方面,网络版用户会很多,检测到的数据会更多,估算了下,某些表可能超出表的最大容量,因此要对数据库进行优化。
数据库优化主要包括包括对冗余字段的处理,提高查询性能和大表的处理,针对冗余字段,初步看了下,主要是有的字段根本没用到,这个可能是在原来设计的时候考虑太复杂,而现实项目中根本没有用,可以通过重新定义表,删除没有用的字段来处理。提高查询性能可通过建立相关索引,优化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′;
分享到:
相关推荐
它是用Golang和React编写的,并且与MySQL或Postgres一起作为单个Linux二进制文件运行。 每个月16日,都会有一个新的编译器Mattermost Mattermost是一个开源的,自托管的Slack替代品,来自https://mattermost.org。 ...
Zalando Postgres Operator 是 IAC 的一种实现,专为管理 Kubernetes(K8s)集群上的 PostgreSQL 数据库设计。 Zalando Postgres Operator UI 是一个图形界面工具,它简化了数据库即服务的体验,使得非管理员用户也...
数据库表结构文件:db目录下postgres下的main.sql文件 数据库测试数据文件:db目录下的data.sql文件 python环境: python2.7 pip install tornado pip install psycopg2 pip install mysql.connector > ...
4. 事务处理优化:Postgres数据库的事务处理机制可以使用PM来存储事务日志,从而提高数据库的事务处理性能。PM的高速读写特性可以满足高性能数据库应用的需求。 Postgres数据库基于持久内存的优化探索需要对数据库...
NULL 博文链接:https://flyqantas.iteye.com/blog/2162837
### 数据库练习知识点详解 #### 一、课程背景与目标 **标题:“database exercise”** **描述:“the exercise of the database”** 本课程是澳大利亚国立大学计算机科学学院为COMP2400/COMP6240关系数据库课程...
一、数据库搭建 1、yum 指定目录安装 https://blog.csdn.net/llwy1428/article/details/105143053 2、yum 直接安装 https://blog.csdn.net/llwy1428/article/details/102486414 3、编译安装 ...
连接指标 这是一个跟踪指标的小应用程序。... 设置你的 Postgres 数据库 rake db:create rake db:migrate 从 Twilio 加载数据 foreman run import_calls 检查! foreman run rails s 打开浏览器并转到localh
快速将 geonames.org 引导到您的 Postgres 中! 这组指令和实用程序是在使用进行实验并将其放入我的 postgres 实例时产生的。 安装程序会做什么: 创建geonames模式。 创建geonamesadmin用户并将他设置为geonames...
ETL从Web抓取数据并将其存储到Postgres数据库 网页抓取 网址: https://id.wikipedia.org/wiki/Daftar_orang_terkaya_di_Indonesia : https://id.wikipedia.org/wiki/Daftar_orang_terkaya_di_Indonesia 要求 码头...
koa应用程序与minicloud + sqlite / mysql / mssql / postgres集成 克隆 $ git clone http : //github.com/minicloud/minicloud-example 安装包 $ cd minicloud - example $ npm install china user中国大陆用户...
ssh -vv postgres@node2 七、SELinux配置 在某些系统中,需要配置SELinux以允许无密码登录。可以使用以下命令禁用SELinux: SELINUX=disabled 并重启服务器: reboot 八、结论 本文详细介绍了Postgres用户下...
数据库/持久化层:postgres 使用的第三方库: rocket, tokio, tokio-postgres, deadpool-postgres, log, simplelog, futures, async-recursion, serde 更多细节请移步我的blog:Rust Rocket: 构建Restful服务实战...
GORM PostgreSQL驱动程序GORM PostgreSQL驱动程序用法import(“ gorm.io/driver/postgres”“ gorm.io/gorm”)// https://github.com/lib/pq dsn:=“ user = gorm password = gorm DB .name = gorm port = 9920 ...
miceCMS可无缝支持MSSQL,MySQL,Postgres,SqLite,Frontbase,MaxDB,MiniSql,FBSQL和Sybase等众多主流和非主流的数据库系统,如果以上的数据库系统都还没有你喜欢的(^-^),你还可以选择文本文件(txt)来存放数据库,经过...
而对于Linux用户,可以使用YUM包管理器或者参考GitHub上的博客文章(如https://github.com/digoal/blog/blob/master/201710/20171018_01.md和https://github.com/digoal/blog/blob/master/201611/20161121_01.md)...
pgbackup 用于在本地或AWS S3上备份远程PostgreSQL数据库的CLI。用法传入完整的数据库URL,存储驱动程序和目标。 S3带存储桶名称的示例: $ pgbackup postgres://bob@example.com:5432/db_one --driver s3 backups带...