PostgreSQL 数据库维护

  • 时间:
  • 浏览:0
  • 来源:万人炸金花_万人炸金花官网

(2 rows)

testtable        |       1760 1   |      157

ANALYZE

  对于重建后的索引还发生另外有有一个 性能上的优势,可能在新建立的索引上,逻辑上相互连接的页面在物理上往往也是连在同去的,从前时需提高磁盘页面被连续读取的几率,从而提高整个操作的IO传输时延。见如下示例:

postgres=# SELECT test_insert(); --执行两次。

INSERT INTO testtable VALUES(i);

postgres=# CREATE TABLE testtable (i integer);

relname       | relfilenode    | relpages

postgres=# SELECT relname,relfilenode, relpages FROM pg_class WHERE relname = 'testtable' or relname = 'testtable_idx';

count

test_insert

VACUUM

---------------+-------------+----------

#5. 确认四次批量插入都成功。

$$ LANGUAGE plpgsql;

max := min + 60 00;

(1 row)

#      是和其内部内部结构实现办法有关,只是在上面的插入中,索引所占的页面数量就不必继续增加。

postgres=# ANALYZE testtable;

testtable_idx  |       1760 5   |       68

testtable        |       1760 1   |      157

postgres=# SELECT relname,relfilenode, relpages FROM pg_class WHERE relname = 'testtable' or relname = 'testtable_idx';

testtable_idx  |       1760 4   |      173

(1 row)

-------------

postgres=# SELECT relname,relfilenode, relpages FROM pg_class WHERE relname = 'testtable' or relname = 'testtable_idx';

#6. 分析测试表,以便有关该表的统计信息被更新到PostgreSQL的系统表。

---------------+-------------+----------

testtable_idx  |       1760 4   |      173

#12. 再重新批量插入两次,只是在分析该表以更新其统计信息。

postgres=# CREATE INDEX testtable_idx ON testtable(i);

relname      | relfilenode     | relpages

DECLARE

BEGIN

#15. 重新批量删除数据。

RETURN 0;

test_insert

-------

postgres=# DELETE FROM testtable WHERE i < 60 00;

CREATE FUNCTION

postgres=# DELETE FROM testtable WHERE i < 60 00;

FOR i IN min..max LOOP

#8. 批量删除数据。

#4. 批量插入数据到测试表(执行四次)

postgres=# VACUUM ANALYZE testtable;

DELETE 19996

---------------+-------------+----------

#10. 这里时需额外说明的是,上面删除的数据均发生数据表的前部,可能删除的是末尾要素,

END LOOP;

min integer;

  1. 查看数据表所占用的磁盘页面数量。

(2 rows)

(2 rows)

SELECT COUNT(*) INTO min from testtable;

-------------

#14. 时需看完索引的页面数量实在这样继续增加。

(1 row)

postgres=# SELECT relname,relfilenode, relpages FROM pg_class WHERE relname = 'testtable' or relname = 'testtable_idx';

  2. 查看指定数据表的索引名称和索引占用的磁盘页面数量。

#9. 执行vacuum和analyze,以便更新系统表,同去为该表和索引记录高水标记。

#7. 查看测试表和索引当前占用的页面数量(通常每个页面为8k)。

postgres=# SELECT relname,relfilenode, relpages FROM pg_class WHERE relname = 'testtable' or relname = 'testtable_idx';

60 04

#11. 查看测试表和索引在删除后,再通过VACUUM ANALYZE更新系什么都计信息后的结果(保持不变)。

ANALYZE

postgres=# SELECT COUNT(*) FROM testtable;

---------------+-------------+----------

---------------+-------------+----------

#      如where i > 60 00,这样在执行VACUUM ANALYZE的只是,数据表可能被物理的缩小。

CREATE TABLE

#      实在降低了,说明它们占用的物理空间可能缩小了。

DELETE 60 03

testtable        |       1760 1   |      157

testtable_idx  |       1760 4   |       90

#1. 创建测试数据表。

ANALYZE

relname      | relfilenode     | relpages

postgres=# SELECT test_insert();

testtable        |       1760 2   |      118

testtable        |       1760 1   |      157

#16. 从上面的查询时需看出,在执行VACUUM FULL命令只是,测试表和索引所占用的页面数量

(1 row)

postgres=# VACUUM FULL testtable;

#2. 为测试表创建索引。

relname       | relfilenode    | relpages

(2 rows)

END;

postgres=# ANALYZE testtable;

relname      | relfilenode    | relpages

postgres=# ANALYZE testtable;

test_insert

-------------

CREATE INDEX

  在PostgreSQL中,为数据更新频繁的数据表定期重建索引(REINDEX INDEX)是非常有必要的。对于B-Tree索引,不到你这个 可能删剪清空的索引页才会得到重复使用,对于你这个 仅要素空间可用的索引页将不必得到重用,可能有有一个 页面中大多数索引键值都被删除,只留下很少的一要素,这样该页将不必被释放并重用。在你这个 极端的请况下,可能每个索引页面的利用率极低,一旦数据量显著增加,可能原因分析分析索引文件变得极为庞大,不仅降低了查询传输时延,只是还发生整个磁盘空间被删剪填满的危险。

#13. 此时时需看完数据表中的页面数量仍然为只是的高水标记数量,索引页面数量的增加

ANALYZE

postgres=# SELECT test_insert();

#3. 创建批量插入测试数据的函数。

testtable_idx  |       1760 4   |       90

postgres=# CREATE OR REPLACE FUNCTION test_insert() returns integer AS $$

max integer;