我试图找出PostgreSQL对磁盘施加了多大的压力,结果到目前为止令人沮丧.请看一下方法论,显然我错过了一些东西或以错误的方式计算数字.
PostgreSQL 9.6.0-1.pgdg16.04 + 1在一个单独的LXC容器内运行,Ubuntu 16.04.1 LTS(内核版本4.4.0-38-通用,SSD上的ext4文件系统),只有一个客户端连接来自我运行测试.
我禁用autovacuum以防止不必要的写入.写入字节的计算是通过以下命令完成的,我想查找所有PostgreSQL进程(包括WAL编写器)写入的总字节数:
pgrep postgres | xargs -I {} cat /proc/{}/io | grep ^write_bytes | cut -d' ' -f2 | python -c "import sys; print sum(int(l) for l in sys.stdin)"
Run Code Online (Sandbox Code Playgroud)
使用#符号我标记了一个数据库命令,?在数据库命令之后我标记了write_bytes sum的结果.测试用例很简单:只有一int4列填充10000000值的表.
在每次测试之前,我运行一组命令来释放磁盘空间并防止其他写入:
# DELETE FROM test_inserts;
# VACUUM FULL test_inserts;
# DROP TABLE test_inserts;
Run Code Online (Sandbox Code Playgroud)
正如文档所述,UNLOGGED表中的更改不会写入WAL日志,因此这是一个很好的开始:
# CREATE UNLOGGED TABLE test_inserts (f1 INT);
? 1526276096
# INSERT INTO test_inserts SELECT generate_series(1, 10000000); …Run Code Online (Sandbox Code Playgroud) 我试图理解两个查询在性能上的巨大差异。
假设我有两张桌子。第一个包含某些域集的 A 记录:
Table "public.dns_a"
Column | Type | Modifiers | Storage | Stats target | Description
--------+------------------------+-----------+----------+--------------+-------------
name | character varying(125) | | extended | |
a | inet | | main | |
Indexes:
"dns_a_a_idx" btree (a)
"dns_a_name_idx" btree (name varchar_pattern_ops)
Run Code Online (Sandbox Code Playgroud)
第二个表处理 CNAME 记录:
Table "public.dns_cname"
Column | Type | Modifiers | Storage | Stats target | Description
--------+------------------------+-----------+----------+--------------+-------------
name | character varying(256) | | extended | |
cname | character varying(256) | | extended | | …Run Code Online (Sandbox Code Playgroud) 我product_details在PostgreSQL数据库中有一个表,该表的两列是bill_no INT和purchase_date DATE。
当前bill_no是主键,但是我的客户希望将其更改为bill_no购买年份,因为账单号在每年年初以1开头。
有没有办法来改变表的主键bill_no,只有一年的一部分的purchase_date?