目录搜索
前言何为PostgreSQL?PostgreSQL简史格式约定更多信息臭虫汇报指导I. 教程章1. 从头开始1.1. 安装1.2. 体系基本概念1.3. 创建一个数据库1.4. 访问数据库章2. SQL语言2.1. 介绍2.2. 概念2.3. 创建新表2.4. 向表中添加行2.5. 查询一个表2.6. 表间链接2.7. 聚集函数2.8. 更新2.9. 删除章3. 高级特性3.1. 介绍3.2. 视图3.3. 外键3.4. 事务3.5. 窗口函数3.6. 继承3.7. 结论II. SQL语言章4. SQL语法4.1. 词法结构4.2. 值表达式4.3. 调用函数章5. 数据定义5.1. 表的基本概念5.2. 缺省值5.3. 约束5.4. 系统字段5.5. 修改表5.6. 权限5.7. 模式5.8. 继承5.9. 分区5.10. 其它数据库对象5.11. 依赖性跟踪章 6. 数据操作6.1. 插入数据6.2. 更新数据6.3. 删除数据章7. 查询7.1. 概述7.2. 表表达式7.3. 选择列表7.4. 组合查询7.5. 行排序7.6. LIMIT和OFFSET7.7. VALUES列表7.8. WITH的查询(公用表表达式)章8. 数据类型8.1. 数值类型8.2. 货币类型8.3. 字符类型8.4. 二进制数据类型8.5. 日期/时间类型8.6. 布尔类型8.7. 枚举类型8.8. 几何类型8.9. 网络地址类型8.10. 位串类型8.11. 文本搜索类型8.12. UUID类型8.13. XML类型8.14. 数组8.15. 复合类型8.16. 对象标识符类型8.17. 伪类型章 9. 函数和操作符9.1. 逻辑操作符9.2. 比较操作符9.3. 数学函数和操作符9.4. 字符串函数和操作符9.5. 二进制字符串函数和操作符9.6. 位串函数和操作符9.7. 模式匹配9.8. 数据类型格式化函数9.9. 时间/日期函数和操作符9.10. 支持枚举函数9.11. 几何函数和操作符9.12. 网络地址函数和操作符9.13. 文本检索函数和操作符9.14. XML函数9.15. 序列操作函数9.16. 条件表达式9.17. 数组函数和操作符9.18. 聚合函数9.19. 窗口函数9.20. 子查询表达式9.21. 行和数组比较9.22. 返回集合的函数9.23. 系统信息函数9.24. 系统管理函数9.25. 触发器函数章10. 类型转换10.3. 函数10.2. 操作符10.1. 概述10.4. 值存储10.5. UNION章11. 索引11.1. 介绍11.2. 索引类型11.3. 多字段索引11.4. 索引和ORDER BY11.5. 组合多个索引11.6. 唯一索引11.7. 表达式上的索引11.8. 部分索引11.9. 操作类和操作簇11.10. 检查索引的使用章12. Full Text Search12.1. Introduction12.2. Tables and Indexes12.3. Controlling Text Search12.4. Additional Features12.5. Parsers12.6. Dictionaries12.7. Configuration Example12.8. Testing and Debugging Text Search12.9. GiST and GIN Index Types12.10. psql Support12.11. Limitations12.12. Migration from Pre-8.3 Text Search章13. 并发控制13.1. 介绍13.2. 事务隔离13.3. 明确锁定13.4. 应用层数据完整性检查13.5. 锁和索引章14. 性能提升技巧14.1. 使用EXPLAIN14.2. 规划器使用的统计信息14.3. 用明确的JOIN语句控制规划器14.4. 向数据库中添加记录14.5. 非持久性设置III. 服务器管理章15. 安装指导15.1. 简版15.2. 要求15.3. 获取源码15.4. 升级15.5. 安装过程15.6. 安装后的设置15.7. 支持的平台15.8. 特殊平台的要求章16. Installation from Source Code on Windows16.1. Building with Visual C++ or the Platform SDK16.2. Building libpq with Visual C++ or Borland C++章17. 服务器安装和操作17.1. PostgreSQL用户帐户17.2. 创建数据库集群17.3. 启动数据库服务器17.4. 管理内核资源17.5. 关闭服务17.6. 防止服务器欺骗17.7. 加密选项17.8. 用SSL进行安全的TCP/IP连接17.9. Secure TCP/IP Connections with SSH Tunnels章18. 服务器配置18.1. 设置参数18.2. 文件位置18.3. 连接和认证18.4. 资源消耗18.5. 预写式日志18.6. 查询规划18.7. 错误报告和日志18.8. 运行时统计18.9. 自动清理18.10. 客户端连接缺省18.12. 版本和平台兼容性18.11. 锁管理18.13. 预置选项18.14. 自定义的选项18.15. 开发人员选项18.16. 短选项章19. 用户认证19.1. pg_hba.conf 文件19.2. 用户名映射19.3. 认证方法19.4. 用户认证章20. 数据库角色和权限20.1. 数据库角色20.2. 角色属性20.3. 权限20.4. 角色成员20.5. 函数和触发器章21. 管理数据库21.1. 概述21.2. 创建一个数据库21.3. 临时库21.4. 数据库配置21.5. 删除数据库21.6. 表空间章22. 本土化22.1. 区域支持22.2. 字符集支持章23. 日常数据库维护工作23.1. Routine Vacuuming日常清理23.2. 经常重建索引23.3. 日志文件维护章24. 备份和恢复24.1. SQL转储24.2. 文件系统级别的备份24.3. 在线备份以及即时恢复(PITR)24.4. 版本间迁移章25. 高可用性与负载均衡,复制25.1. 不同解决方案的比较25.2. 日志传送备份服务器25.3. 失效切换25.4. 日志传送的替代方法25.5. 热备章26. 恢复配置26.1. 归档恢复设置26.2. 恢复目标设置26.3. 备服务器设置章27. 监控数据库的活动27.1. 标准Unix工具27.2. 统计收集器27.3. 查看锁27.4. 动态跟踪章28. 监控磁盘使用情况28.1. 判断磁盘的使用量28.2. 磁盘满导致的失效章29. 可靠性和预写式日志29.1. 可靠性29.2. 预写式日志(WAL)29.3. 异步提交29.4. WAL配置29.5. WAL内部章30. Regression Tests30.1. Running the Tests30.2. Test Evaluation30.3. Variant Comparison Files30.4. Test Coverage ExaminationIV. 客户端接口章31. libpq-C库31.1. 数据库联接函数31.2. 连接状态函数31.3. 命令执行函数31.4. 异步命令处理31.5. 取消正在处理的查询31.6. 捷径接口31.7. 异步通知31.8. 与COPY命令相关的函数31.9. Control Functions 控制函数31.10. 其他函数31.11. 注意信息处理31.12. 事件系统31.13. 环境变量31.14. 口令文件31.15. 连接服务的文件31.16. LDAP查找连接参数31.17. SSL支持31.18. 在多线程程序里的行为31.19. 制作libpq程序31.20. 例子程序章32. 大对象32.1. 介绍32.2. 实现特点32.3. 客户端接口32.4. 服务器端函数32.5. 例子程序章33. ECPG - Embedded SQL in C33.1. The Concept33.2. Connecting to the Database Server33.3. Closing a Connection33.4. Running SQL Commands33.5. Choosing a Connection33.6. Using Host Variables33.7. Dynamic SQL33.8. pgtypes library33.9. Using Descriptor Areas33.10. Informix compatibility mode33.11. Error Handling33.12. Preprocessor directives33.13. Processing Embedded SQL Programs33.14. Library Functions33.15. Internals章34. 信息模式34.1. 关于这个模式34.2. 数据类型34.3. information_schema_catalog_name34.4. administrable_role_authorizations34.5. applicable_roles34.6. attributes34.7. check_constraint_routine_usage34.8. check_constraints34.9. column_domain_usage34.10. column_privileges34.11. column_udt_usage34.12. 字段34.13. constraint_column_usage34.14. constraint_table_usage34.15. data_type_privileges34.16. domain_constraints34.18. domains34.17. domain_udt_usage34.19. element_types34.20. enabled_roles34.21. foreign_data_wrapper_options34.22. foreign_data_wrappers34.23. foreign_server_options34.24. foreign_servers34.25. key_column_usage34.26. parameters34.27. referential_constraints34.28. role_column_grants34.29. role_routine_grants34.30. role_table_grants34.31. role_usage_grants34.32. routine_privileges34.33. routines34.34. schemata34.35. sequences34.36. sql_features34.37. sql_implementation_info34.38. sql_languages34.39. sql_packages34.40. sql_parts34.41. sql_sizing34.42. sql_sizing_profiles34.43. table_constraints34.44. table_privileges34.45. tables34.46. triggered_update_columns34.47. 触发器34.48. usage_privileges34.49. user_mapping_options34.50. user_mappings34.51. view_column_usage34.52. view_routine_usage34.53. view_table_usage34.54. 视图V. 服务器端编程章35. 扩展SQL35.1. 扩展性是如何实现的35.2. PostgreSQL类型系统35.3. User-Defined Functions35.4. Query Language (SQL) Functions35.5. Function Overloading35.6. Function Volatility Categories35.7. Procedural Language Functions35.8. Internal Functions35.9. C-Language Functions35.10. User-Defined Aggregates35.11. User-Defined Types35.12. User-Defined Operators35.13. Operator Optimization Information35.14. Interfacing Extensions To Indexes35.15. 用C++扩展章36. 触发器36.1. 触发器行为概述36.3. 用 C 写触发器36.2. 数据改变的可视性36.4. 一个完整的例子章37. 规则系统37.1. The Query Tree37.2. 视图和规则系统37.3. 在INSERT,UPDATE和DELETE上的规则37.4. 规则和权限37.5. 规则和命令状态37.6. 规则与触发器得比较章38. Procedural Languages38.1. Installing Procedural Languages章39. PL/pgSQL - SQL过程语言39.1. 概述39.2. PL/pgSQL的结构39.3. 声明39.4. 表达式39.5. 基本语句39.6. 控制结构39.7. 游标39.8. 错误和消息39.9. 触发器过程39.10. PL/pgSQL Under the Hood39.11. 开发PL/pgSQL的一些提示39.12. 从OraclePL/SQL 进行移植章40. PL/Tcl - Tcl Procedural Language40.1. Overview40.2. PL/Tcl Functions and Arguments40.3. Data Values in PL/Tcl40.4. Global Data in PL/Tcl40.5. Database Access from PL/Tcl40.6. Trigger Procedures in PL/Tcl40.7. Modules and the unknown command40.8. Tcl Procedure Names章41. PL/Perl - Perl Procedural Language41.1. PL/Perl Functions and Arguments41.2. Data Values in PL/Perl41.3. Built-in Functions41.4. Global Values in PL/Perl41.6. PL/Perl Triggers41.5. Trusted and Untrusted PL/Perl41.7. PL/Perl Under the Hood章42. PL/Python - Python Procedural Language42.1. Python 2 vs. Python 342.2. PL/Python Functions42.3. Data Values42.4. Sharing Data42.5. Anonymous Code Blocks42.6. Trigger Functions42.7. Database Access42.8. Utility Functions42.9. Environment Variables章43. Server Programming Interface43.1. Interface FunctionsSpi-spi-connectSpi-spi-finishSpi-spi-pushSpi-spi-popSpi-spi-executeSpi-spi-execSpi-spi-execute-with-argsSpi-spi-prepareSpi-spi-prepare-cursorSpi-spi-prepare-paramsSpi-spi-getargcountSpi-spi-getargtypeidSpi-spi-is-cursor-planSpi-spi-execute-planSpi-spi-execute-plan-with-paramlistSpi-spi-execpSpi-spi-cursor-openSpi-spi-cursor-open-with-argsSpi-spi-cursor-open-with-paramlistSpi-spi-cursor-findSpi-spi-cursor-fetchSpi-spi-cursor-moveSpi-spi-scroll-cursor-fetchSpi-spi-scroll-cursor-moveSpi-spi-cursor-closeSpi-spi-saveplan43.2. Interface Support FunctionsSpi-spi-fnameSpi-spi-fnumberSpi-spi-getvalueSpi-spi-getbinvalSpi-spi-gettypeSpi-spi-gettypeidSpi-spi-getrelnameSpi-spi-getnspname43.3. Memory ManagementSpi-spi-pallocSpi-reallocSpi-spi-pfreeSpi-spi-copytupleSpi-spi-returntupleSpi-spi-modifytupleSpi-spi-freetupleSpi-spi-freetupletableSpi-spi-freeplan43.4. Visibility of Data Changes43.5. ExamplesVI. 参考手册I. SQL命令Sql-abortSql-alteraggregateSql-alterconversionSql-alterdatabaseSql-alterdefaultprivilegesSql-alterdomainSql-alterforeigndatawrapperSql-alterfunctionSql-altergroupSql-alterindexSql-alterlanguageSql-alterlargeobjectSql-alteroperatorSql-alteropclassSql-alteropfamilySql-alterroleSql-alterschemaSql-altersequenceSql-alterserverSql-altertableSql-altertablespaceSql-altertsconfigSql-altertsdictionarySql-altertsparserSql-altertstemplateSql-altertriggerSql-altertypeSql-alteruserSql-alterusermappingSql-alterviewSql-analyzeSql-beginSql-checkpointSql-closeSql-clusterSql-commentSql-commitSql-commit-preparedSql-copySql-createaggregateSql-createcastSql-createconstraintSql-createconversionSql-createdatabaseSql-createdomainSql-createforeigndatawrapperSql-createfunctionSql-creategroupSql-createindexSql-createlanguageSql-createoperatorSql-createopclassSql-createopfamilySql-createroleSql-createruleSql-createschemaSql-createsequenceSql-createserverSql-createtableSql-createtableasSql-createtablespaceSql-createtsconfigSql-createtsdictionarySql-createtsparserSql-createtstemplateSql-createtriggerSql-createtypeSql-createuserSql-createusermappingSql-createviewSql-deallocateSql-declareSql-deleteSql-discardSql-doSql-dropaggregateSql-dropcastSql-dropconversionSql-dropdatabaseSql-dropdomainSql-dropforeigndatawrapperSql-dropfunctionSql-dropgroupSql-dropindexSql-droplanguageSql-dropoperatorSql-dropopclassSql-dropopfamilySql-drop-ownedSql-droproleSql-dropruleSql-dropschemaSql-dropsequenceSql-dropserverSql-droptableSql-droptablespaceSql-droptsconfigSql-droptsdictionarySql-droptsparserSql-droptstemplateSql-droptriggerSql-droptypeSql-dropuserSql-dropusermappingSql-dropviewSql-endSql-executeSql-explainSql-fetchSql-grantSql-insertSql-listenSql-loadSql-lockSql-moveSql-notifySql-prepareSql-prepare-transactionSql-reassign-ownedSql-reindexSql-release-savepointSql-resetSql-revokeSql-rollbackSql-rollback-preparedSql-rollback-toSql-savepointSql-selectSql-selectintoSql-setSql-set-constraintsSql-set-roleSql-set-session-authorizationSql-set-transactionSql-showSql-start-transactionSql-truncateSql-unlistenSql-updateSql-vacuumSql-valuesII. 客户端应用程序App-clusterdbApp-createdbApp-createlangApp-createuserApp-dropdbApp-droplangApp-dropuserApp-ecpgApp-pgconfigApp-pgdumpApp-pg-dumpallApp-pgrestoreApp-psqlApp-reindexdbApp-vacuumdbIII. PostgreSQL服务器应用程序App-initdbApp-pgcontroldataApp-pg-ctlApp-pgresetxlogApp-postgresApp-postmasterVII. 内部章44. PostgreSQL内部概览44.1. 查询路径44.2. 连接是如何建立起来的44.3. 分析器阶段44.4. ThePostgreSQL规则系统44.5. 规划器/优化器44.6. 执行器章45. 系统表45.1. 概述45.2. pg_aggregate45.3. pg_am45.4. pg_amop45.5. pg_amproc45.6. pg_attrdef45.7. pg_attribute45.8. pg_authid45.9. pg_auth_members45.10. pg_cast45.11. pg_class45.12. pg_constraint45.13. pg_conversion45.14. pg_database45.15. pg_db_role_setting45.16. pg_default_acl45.17. pg_depend45.18. pg_description45.19. pg_enum45.20. pg_foreign_data_wrapper45.21. pg_foreign_server45.22. pg_index45.23. pg_inherits45.24. pg_language45.25. pg_largeobject45.26. pg_largeobject_metadata45.27. pg_namespace45.28. pg_opclass45.29. pg_operator45.30. pg_opfamily45.31. pg_pltemplate45.32. pg_proc45.33. pg_rewrite45.34. pg_shdepend45.35. pg_shdescription45.36. pg_statistic45.37. pg_tablespace45.38. pg_trigger45.39. pg_ts_config45.40. pg_ts_config_map45.41. pg_ts_dict45.42. pg_ts_parser45.43. pg_ts_template45.44. pg_type45.45. pg_user_mapping45.46. System Views45.47. pg_cursors45.48. pg_group45.49. pg_indexes45.50. pg_locks45.51. pg_prepared_statements45.52. pg_prepared_xacts45.53. pg_roles45.54. pg_rules45.55. pg_settings45.56. pg_shadow45.57. pg_stats45.58. pg_tables45.59. pg_timezone_abbrevs45.60. pg_timezone_names45.61. pg_user45.62. pg_user_mappings45.63. pg_views章46. Frontend/Backend Protocol46.1. Overview46.2. Message Flow46.3. Streaming Replication Protocol46.4. Message Data Types46.5. Message Formats46.6. Error and Notice Message Fields46.7. Summary of Changes since Protocol 2.047. PostgreSQL Coding Conventions47.1. Formatting47.2. Reporting Errors Within the Server47.3. Error Message Style Guide章48. Native Language Support48.1. For the Translator48.2. For the Programmer章49. Writing A Procedural Language Handler章50. Genetic Query Optimizer50.1. Query Handling as a Complex Optimization Problem50.2. Genetic Algorithms50.3. Genetic Query Optimization (GEQO) in PostgreSQL50.4. Further Reading章51. 索引访问方法接口定义51.1. 索引的系统表记录51.2. 索引访问方法函数51.3. 索引扫描51.4. 索引锁的考量51.5. 索引唯一性检查51.6. 索引开销估计函数章52. GiST Indexes52.1. Introduction52.2. Extensibility52.3. Implementation52.4. Examples52.5. Crash Recovery章53. GIN Indexes53.1. Introduction53.2. Extensibility53.3. Implementation53.4. GIN tips and tricks53.5. Limitations53.6. Examples章54. 数据库物理存储54.1. 数据库文件布局54.2. TOAST54.3. 自由空间映射54.4. 可见映射54.5. 数据库分页文件章55. BKI后端接口55.1. BKI 文件格式55.2. BKI命令55.3. 系统初始化的BKI文件的结构55.4. 例子章56. 规划器如何使用统计信息56.1. 行预期的例子VIII. 附录A. PostgreSQL错误代码B. 日期/时间支持B.1. 日期/时间输入解析B.2. 日期/时间关键字B.3. 日期/时间配置文件B.4. 日期单位的历史C. SQL关键字D. SQL ConformanceD.1. Supported FeaturesD.2. Unsupported FeaturesE. Release NotesRelease-0-01Release-0-02Release-0-03Release-1-0Release-1-01Release-1-02Release-1-09Release-6-0Release-6-1Release-6-1-1Release-6-2Release-6-2-1Release-6-3Release-6-3-1Release-6-3-2Release-6-4Release-6-4-1Release-6-4-2Release-6-5Release-6-5-1Release-6-5-2Release-6-5-3Release-7-0Release-7-0-1Release-7-0-2Release-7-0-3Release-7-1Release-7-1-1Release-7-1-2Release-7-1-3Release-7-2Release-7-2-1Release-7-2-2Release-7-2-3Release-7-2-4Release-7-2-5Release-7-2-6Release-7-2-7Release-7-2-8Release-7-3Release-7-3-1Release-7-3-10Release-7-3-11Release-7-3-12Release-7-3-13Release-7-3-14Release-7-3-15Release-7-3-16Release-7-3-17Release-7-3-18Release-7-3-19Release-7-3-2Release-7-3-20Release-7-3-21Release-7-3-3Release-7-3-4Release-7-3-5Release-7-3-6Release-7-3-7Release-7-3-8Release-7-3-9Release-7-4Release-7-4-1Release-7-4-10Release-7-4-11Release-7-4-12Release-7-4-13Release-7-4-14Release-7-4-15Release-7-4-16Release-7-4-17Release-7-4-18Release-7-4-19Release-7-4-2Release-7-4-20Release-7-4-21Release-7-4-22Release-7-4-23Release-7-4-24Release-7-4-25Release-7-4-26Release-7-4-27Release-7-4-28Release-7-4-29Release-7-4-3Release-7-4-30Release-7-4-4Release-7-4-5Release-7-4-6Release-7-4-7Release-7-4-8Release-7-4-9Release-8-0Release-8-0-1Release-8-0-10Release-8-0-11Release-8-0-12Release-8-0-13Release-8-0-14Release-8-0-15Release-8-0-16Release-8-0-17Release-8-0-18Release-8-0-19Release-8-0-2Release-8-0-20Release-8-0-21Release-8-0-22Release-8-0-23Release-8-0-24Release-8-0-25Release-8-0-26Release-8-0-3Release-8-0-4Release-8-0-5Release-8-0-6Release-8-0-7Release-8-0-8Release-8-0-9Release-8-1Release-8-1-1Release-8-1-10Release-8-1-11Release-8-1-12Release-8-1-13Release-8-1-14Release-8-1-15Release-8-1-16Release-8-1-17Release-8-1-18Release-8-1-19Release-8-1-2Release-8-1-20Release-8-1-21Release-8-1-22Release-8-1-23Release-8-1-3Release-8-1-4Release-8-1-5Release-8-1-6Release-8-1-7Release-8-1-8Release-8-1-9Release-8-2Release-8-2-1Release-8-2-10Release-8-2-11Release-8-2-12Release-8-2-13Release-8-2-14Release-8-2-15Release-8-2-16Release-8-2-17Release-8-2-18Release-8-2-19Release-8-2-2Release-8-2-20Release-8-2-21Release-8-2-3Release-8-2-4Release-8-2-5Release-8-2-6Release-8-2-7Release-8-2-8Release-8-2-9Release-8-3Release-8-3-1Release-8-3-10Release-8-3-11Release-8-3-12Release-8-3-13Release-8-3-14Release-8-3-15Release-8-3-2Release-8-3-3Release-8-3-4Release-8-3-5Release-8-3-6Release-8-3-7Release-8-3-8Release-8-3-9Release-8-4Release-8-4-1Release-8-4-2Release-8-4-3Release-8-4-4Release-8-4-5Release-8-4-6Release-8-4-7Release-8-4-8Release-9-0Release-9-0-1Release-9-0-2Release-9-0-3Release-9-0-4F. 额外提供的模块F.1. adminpackF.2. auto_explainF.3. btree_ginF.4. btree_gistF.5. chkpassF.6. citextF.7. cubeF.8. dblinkContrib-dblink-connectContrib-dblink-connect-uContrib-dblink-disconnectContrib-dblinkContrib-dblink-execContrib-dblink-openContrib-dblink-fetchContrib-dblink-closeContrib-dblink-get-connectionsContrib-dblink-error-messageContrib-dblink-send-queryContrib-dblink-is-busyContrib-dblink-get-notifyContrib-dblink-get-resultContrib-dblink-cancel-queryContrib-dblink-get-pkeyContrib-dblink-build-sql-insertContrib-dblink-build-sql-deleteContrib-dblink-build-sql-updateF.9. dict_intF.10. dict_xsynF.11. earthdistanceF.12. fuzzystrmatchF.13. hstoreF.14. intaggF.15. intarrayF.16. isnF.17. loF.18. ltreeF.19. oid2nameF.20. pageinspectF.21. passwordcheckF.22. pg_archivecleanupF.23. pgbenchF.24. pg_buffercacheF.25. pgcryptoF.26. pg_freespacemapF.27. pgrowlocksF.28. pg_standbyF.29. pg_stat_statementsF.30. pgstattupleF.31. pg_trgmF.32. pg_upgradeF.33. segF.34. spiF.35. sslinfoF.36. tablefuncF.37. test_parserF.38. tsearch2F.39. unaccentF.40. uuid-osspF.41. vacuumloF.42. xml2G. 外部项目G.1. 客户端接口G.2. 过程语言G.3. 扩展H. The Source Code RepositoryH.1. Getting The Source Via GitI. 文档I.1. DocBookI.2. 工具集I.3. 制作文档I.4. 文档写作I.5. 风格指导J. 首字母缩略词参考书目BookindexIndex
文字

23.1. Routine Vacuuming日常清理

的PostgreSQL数据库需要定期维护为vacuuming。 对于许多安装,由autovacuum daemon执行清空操作足够了,其描述在Section 23.1.5。 要获得你想要的最佳结果,你可能需要调整所述的 autovacuuming 参数。某些数据库管理员将想要使用VACUUM命令, 补充或替换管理守护进程的活动,其将由cronTask Scheduler 脚本。要设置手动管理正确地清除,有必要了解在下面几个小节讨论的问题。那些依赖autovacuuming的管理员可能仍然希望略读这些资料, 帮助他们了解和调整autovacuuming。

23.1.1. 清理基础

PostgreSQL的 VACUUM 命令定期来处理每个表有以下几个原因:

  1. 通过更新或删除行恢复或重复使用所占用的磁盘空间。

  2. 通过PostgreSQL查询规划器更新数据统计分析。

  3. transaction ID wraparound可以防止由于非常旧的数据丢失

这些原因都决定了要执行不同的频率和范围的VACUUM操作,在下面的小节解释。

有两种VACUUM:标准的VACUUMVACUUM FULLVACUUM FULL可以回收更多的磁盘空间,但运行速度要慢得多。 VACUUM标准方式可以与产生的数据库操作并行运行。(像SELECTINSERTUPDATEDELETE命令可以工作正常, 但是当正在清理该表时,你不能使用像ALTER TABLE命令修改表定义。) VACUUM FULL需要在表上的一个排斥锁才能工作,并因此不能与其它使用该表的并行。 因此一般情况下管理员应尽量用标准的 VACUUM,并期避免使用VACUUM FULL

VACUUM 创建大量的I/O交互,这可能会导致其它活动会话性能表现不好。 这里有个配置参数,可以调整,以减少清理性能的影响, 请参阅 Section 18.4.3。

23.1.2. 恢复磁盘空间

在正常的 PostgreSQL 操作里,对一行的 UPDATEDELETE 并未立即删除旧版本的数据行。这个方法 对于获取多版本并发控制的好处是必要的(MVCC, 详情参阅章Chapter 13):如果一个行的版本仍有可能被其它事务看到, 那么你就不能删除它。但到了最后,不会有任何事务对过期的或者已经删除的 行感兴趣。而它占据的空间必须为那些新行的使用而回收,以避免对磁盘空间 的无休止需求。这件事是通过运行 VACUUM 实现的。

标准形式的VACUUM删除死行版本在表和索引标记以便将来重用的可用空间。 然而,它不会返回操作系统的空间,除非在特殊情况下,一个或多个表页成为完全自由,而且可以很容易获得一个独占表锁。 与此相反,VACUUM FULL积极压缩表,通过写完成没有死空间的表文件的新版本。这可以最大限度地减少表的大小,但可能需要很长一段时间。 这还需要额外的磁盘空间表的新副本,直到操作完成。 这可以最大限度地减少表的大小,但可能需要很长一段时间。这还需要额外的磁盘空间表的新副本,直到操作完成。

做标准VACUUM通常能够满足用日常清理的目标避免需要做VACUUM FULL。 autovacuum守护进程试图以这种方式工作,其实从不做 VACUUM FULL。 在这种方法中,这个想法不是保持表为最小尺寸,但要保持稳定状态的磁盘空间使用情况: 每张表占用的空间相当于其最小尺寸,加,获取到清理之间使用的多少空间。 尽管VACUUM FULL可用于收缩表为其最小尺寸,并返回磁盘空间给操作系统。 有一点在此不多如果表只会在将来再次增长。因此,适度频次运行标准VACUUM 要较好于 不频发的运行VACUUM FULL保持大量更新表。

有些管理员喜欢调度的清理本身,例如,晚上当负荷低时,做所有的工作。 按照一个固定的时间做清理表的困难是,如果一个表有更新活动的意外大增。 可能会庞大到确实需要VACUUM FULL回收空间。使用autovacuum守护进程,缓解这一问题, 因为守护进程的时间表清理动态响应更新的活动。完全禁用守护进程是不明智的,除非你有一个非常可预见的工作量。 一个可能的折衷办法就是设置守护进程的参数,以便它将只对异常繁重更新活动作出反应,因此可以从失控保持这些事情, 当典型的负载时,调度VACUUM还期望做批量的工作。

对于那些不使用autovacuum,一个典型的方法是在低使用时一天做一次的调度数据库范围的VACUUM, 补充下更新频繁的表有必要更频繁的清理。 (有些安装更新率非常高,清理的最繁忙的表往往每隔几分钟一次。) 如果你有个多数据库的集群,别忘了每一个的VACUUMvacuumdb这个程序有帮助的。

Tip: 当一个表中包含大量死行版本,作为一个大规模的更新或删除活动的结果,平常的VACUUM未必令人满意。 如果你有这样的表,并且你需要回收过多占用的磁盘空间,你将需要使用VACUUM FULL,或者选择CLUSTER或者 ALTER TABLE表重写的变体之一。这些命令重写整个表的新副本,并建立新的索引。 所有这些选项需要独占锁。 请注意他们也暂时使用额外的磁盘空间大约等于大小的表中,因为不能发布的表和索引的旧副本,直到新的完成。

Tip: 如果你有一个表,它的内容经常被完全删除, 那么可以考虑用 TRUNCATE 而不是后面跟着 VACUUMDELETETRUNCATE 立即删除整个表的内容,而不要求 随后的 VACUUMVACUUM FULL 来恢复现在未使用的磁盘空间。

23.1.3. 更新规划器统计

PostgreSQL 的查询规划器依赖一些有关 表内容的统计信息用以为查询生成好的规划。这些统计是通过 ANALYZE命令获得的,你可以直接调用这条命令, 也可以把它当做 VACUUM 里的一个可选步骤来调用。 拥有合理准确的统计是非常重要的,否则,选择了恶劣的规划很可能 降低数据库的性能。

当一张表的内容足够改变时,如果启用了 autovacuum 守护进程,将发出ANALYZE命令。 不过,管理员可能更愿意依靠手工设定的ANALYZE选项,尤其,如果已知表的更新活动当没有生效在"感兴趣" 的表字段统计。 这个守护进程调度是严格的作为一个插入或更新的行数的功能;它没有了解是否会导致有意义的统计变化。

和为了回收空间做清理一样,经常更新统计信息也是对更新频繁的表 更有用。不过,即使是更新非常频繁的表,如果它的数据的统计分布 并不经常改变,那么也不需要更新统计信息。一条简单的拇指定律就 是想想表中字段的最大跟最小值改变的幅度。比如,一个包含行更新 时间的 timestamp 字段将随着行的追加和更新稳定 增长最大值;这样的字段可能需要比那些包含访问网站的 URL 的字段 更频繁一些更新统计信息。那些 URL 字段可能改变得一样频繁, 但是其数值的统计分布的改变相对要缓慢得多。

我们可以在特定的表,甚至是表中特定的字段上运行ANALYZE ,所以如果你的应用有需求的话,可以对某些信息更新得比其它信息更 频繁。不过,在实际中,这种做法的有用性是值得怀疑的。因为 ANALYZE 使用了统计学上的随机采样的方法进行行采样, 而不是把每一行都读取进来,所以即使在大表上也是一项相当快的操作。

Tip: 尽管用 ANALYZE 针对每个字段进行挖掘的方式可能不是很实用, 但你可能还是会发现值得针对每个字段对 ANALYZE 收集的统计 信息的详细级别进行调整。那些经常在 WHERE 子句里使用的字段 如果有非常不规则的数据分布,那么就可能需要比其它字段更细致的数据图表。 参阅ALTER TABLE SET STATISTICS 或更改数据库的使用默认在 default_statistics_target的配置参数 。

此外,缺省情况下 选择这些函数是有限制信息的。 但是,如果你创建表达式的索引,它使用一个函数调用,可以极大地提高使用表达式索引的查询计划收集有关函数的有用的统计数据。

23.1.4. 避免事务ID重叠造成的问题

PostgreSQL 的 MVCC 事务语意依赖于比较 事务 ID(XID)的数值:一条带有大于当前事务 XID 的插入 XID 的行版本是"在将来" ,并且不应为当前事务可见。 但是因为事务 ID 的大小有限(在我们写这些的时候是 32 位), 如果集群一次运行的时间很长(大于 40 亿次事务),那么它就要受到 transaction ID wraparound的折磨:XID 计数器回到零位, 然后突然间所有以前的事务就变成看上去是在将来的,这意味着它们的 输出将变得可见。简而言之,可怕的数据丢失。实际上数据仍然在那里, 但是如果你无法获取数据,这么说也只是自我安慰罢了。若要避免此问题, 有必要以清理的每个数据库的每张表每20亿的事务至少一次。

周期性的运行 VACUUM 可以解决这个问题的原因在于 PostgreSQL 可以辨别特殊的 XID (FrozenXID)。这个 XID 总是被认为比任何普通的 XID 旧。 普通的 XID 使用 模-231 算法进行比较。这就意味着对于每个普通的 XID , 总是有二十亿个 XID 是"older"以及二十亿个 XID "newer";表达这个意思 的另外一个方法是普通的 XID 空间是没有终点的环。因此, 一旦某行带着特定的普通 XID 创建出来,那么该行将在以后的 二十亿次事务中表现得是"过去时",而不管我们说的是哪个普通 XID 。如果该行在超过二十亿次事务之后仍然存在,那么它就 会突然变成在将来的行。为了避免数据丢失,老的行必须在 到达二十亿次事务标记之前的某个时候赋予 FrozenXID。 一旦它被赋予了这个特殊的 XID ,那么它们在所有普通事务 面前表现为"过去时",而不管事务 ID 是否重叠,因此这样的 行不管保存多长时间,直到删除之前都会完好。这个 XID 的重新赋值是 VACUUM 控制的。

vacuum_freeze_min_age controls how old an XID value has to be before it's replaced with FrozenXID. 较大的值,此设置的保留事务性信息更长,而较小的值增加可以经过改值前必须再次清理表事务的数目。

通常VACUUM跳过没有任何死行版本的页,但是那些页可能仍有旧XID值的行版本。 为了确保所有的旧XID值由FrozenXID替换,需要整表扫描。当VACUUM做这些时,vacuum_freeze_table_age控制: vacuum_freeze_table_age controls when VACUUM does that:如果表尚未完全扫描 vacuum_freeze_table_age减去 vacuum_freeze_min_age事务,则强制全表扫描。 设置它为0,强制VACUUM总是扫描所有页,有效的忽略可见映射。

表在清理之前允许执行的最大事务次数是 20 亿减去上次清理时的 vacuum_freeze_min_age 值。如果超过这个限制就很 可能造成数据丢失。为了保证数据安全,必须在任何可能包含旧于 autovacuum_freeze_max_age 指定的 XID 的表上调用autovacuum 。(甚至在autovacuum 被禁用的情况下也可以调用。)

这就意味着,每 autovacuum_freeze_max_age 减去 vacuum_freeze_min_age 次事务后将自动清理未被清理的表。对于那些周期性 清理以回收空间的表来说,这个并不重要。对于静态表(包括只插入不更新/删除的表), 因为不需要回收空间的清理,所以可以尝试最大化强制清理的时间间隔, 也就是增加 autovacuum_freeze_max_age 的值或减少vacuum_freeze_min_age 的值。

对于vacuum_freeze_table_age最大有效值为0.95 * autovacuum_freeze_max_age; 一个设置高于这个将是最大上限。值高于autovacuum_freeze_max_age将没有任何意义,因为无论如何此时 将触发反重叠的autovacuum,在这发生前0.95乘数留下了一些闲余空间要运行VACUUM来处理。 作为一个经验法则,vacuum_freeze_table_age应该设置为低于autovacuum_freeze_max_age的某个值, 留下足够的差距因此定期调度VACUUM或者在该窗口中运行正常删除和更新活动的引发autovacuum。 设置太近,可能会导致反重叠autovacuums,即使表最近清理过回收空间,而较低的值导致更多频繁的全表扫描。

增加 autovacuum_freeze_max_age(以及一起的 vacuum_freeze_table_age )的唯一不利之处在于数据库 集群的pg_clog 子目录将会占用更多空间,因为它必须 为所有 autovacuum_freeze_max_age 之后的事务存储 提交状态。每个事务提交状态使用 2 字节,因此如果 autovacuum_freeze_max_age 的值略小于 20 亿, pg_clog 将会增加到大约 500M 。如果这个尺寸比起 你的数据库来只是小菜一碟,我们推荐你将 autovacuum_freeze_max_age 设为允许的最大值。否则,如何设置将取决于你愿意给 pg_clog 多大的空间。默认值是 2 亿,大约需要 50MB 的 pg_clog 存储空间。

减小 vacuum_freeze_min_age 的不利之处是可能导致 VACUUM 做无用功:如果行在不久之后就被修改,那么将 XID 修改 为 FrozenXID 就是在浪费时间,因为它很快就将获得一个新 的 XID 。因此这个设置应当足够大以使得行不被过早的冻结。 减小 vacuum_freeze_min_age 的另一个不利之处是事务插入或修改行的 准确细节将会很快丢失。这个信息有时迟早会派上用场,特别是数据库本 扩之后分析究竟发生了什么错误的时候。因为这两个原因,在完全静态的 表上减小这个值是不明智的。

为了跟踪数据库中最老的 XID 寿命,VACUUM 在系统表 pg_classpg_database 里存储了 事务 ID 统计。尤其是一个数据库的 pg_class 行中 的 relfrozenxid 字段包含了最后一个 VACUUM 命令使用的冻结终止 XID 。系统保证在该数据库中所有比这个终止 XID 老的普通 XID 都被 FrozenXID 代替。同样, 一个数据库的 pg_database 行中的datfrozenxid 字段是普通 XID 的下界,它只是数据库中每个表 relfrozenxid 的最小值。检查这个信息的一个便利方法是执行下面的查询

SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';
SELECT datname, age(datfrozenxid) FROM pg_database;

age 字段用于测量从中止 XID 到当前事务 XID 的数目。

VACUUM 通常只扫描自上次清理修改的页,但是整表扫描时,relfrozenxid 只能提前。当 relfrozenxidvacuum_freeze_table_age事务旧, 使用VACUUMFREEZE选项,或者所有页发生需要清理或删除死行版本时做整表扫描。 当VACUUM扫描整表时,在结束age(relfrozenxid),其应该设置的一个比 vacuum_freeze_min_age 多一点之后使用。 (自VACUUM启动后,更多数量的事务启动)。如果该表上没有整表扫描的VACUUM直到达到autovacuum_freeze_max_age, 将会很快在该表上强制autovacuum处理。

如果从表中清理旧 XID 失败,那么当数据库的旧 XID 到达 1000 万个事务以后, 系统将发出类似下面这样的警告信息:

WARNING:  database "mydb" must be vacuumed within 177009986 transactions
HINT:  To avoid a database shutdown, execute a database-wide VACUUM in "mydb".

(作为提示的建议,应用手工VACUUM 解决这个问题;但是注意必须超级用户执行VACUUM,否则处理系统目录是会失败, 因此不能提前数据库的 datfrozenxid。) 如果忽略了上面的警告信息,那么系统将在距离重叠小于 100 万次的 时候关闭,并且拒绝执行任何新的事务:

ERROR:  database is not accepting commands to avoid wraparound data loss in database "mydb"
HINT:  Stop the postmaster and use a standalone backend to VACUUM in "mydb".

这个 100 万的事务安全边界留下来用于让管理员在不丢失数据的情况下 进行恢复,方法是手工执行所需要的 VACUUM 命令。不过, 因为一旦进入了安全关闭模式,系统就不能再执行命令,做这件事情的 唯一的方法是停止主服务器,使用一个单独运行的后端来执行 VACUUM 。 关闭模式不会强制于独立运行的后端。参阅 postgres 手册获取有关使用独立运行后端的细节。

23.1.5. autovacuum 守护进程

PostgreSQL系统带有一个额外的可选服务进程, 叫做 autovacuum 守护进程, 它的目的是自动执行 VACUUMANALYZE 命令。 在打开这个选项之后,autovacuum 守护进程将周期性运行并且检查那些 有大量插入、更新、删除行操作的表。这些检查使用行级别的统计收集设施; 因此,除非把 track_counts设置为 true ,否则无法使用 autovacuum 守护。 在缺省配置,autovacuuming启用适当的设置和相关配置参数。

" autovacuum 守护进程"实际上包含多个进程。有一种持久性的守护进程,名叫autovacuum launcher, 其负责启动所有数据库的autovacuum worker进程。这个启动程序将跨越时间分配的工作, 尝试每隔autovacuum_naptime秒为每个数据库启动一个工作者。 (因此,如果安装的有N个数据库,则每隔autovacuum_naptime/N秒启动一个新工作者。) 允许最多autovacuum_max_workers工作者进程同时运行。 如果有超过 autovacuum_max_workers要处理的数据库, 在接下来的数据库将尽快处理的第一个工作者完成。在每个工作者进程将检查数据库中的每张表,并执行VACUUM ,需要时 ANALYZE

如果几个较大的表都有资格在短时间内清理,所有 autovacuum工作者可能成为一段长时间都忙于清除这些表。 这会导致不清理其它表和数据库直到一个工作者变得可用。在单个数据库中多少工作者可能是没有限制的,但工作者还是尽量避免重复做已完成的其它工作者的工作。 请注意运行的工作者数目不计关于max_connections或superuser_reserved_connections 的限制。

将总是清理那些 relfrozenxid 大于 autovacuum_freeze_max_age 的表。(这也适用于那些表的冻结最大寿命已通过修改存储参数,见下文) 否则如果上次 VACUUM 之后的过期行的数量超过了 "vacuum threshold",那么就清理该表。清理阈值定义为:

vacuum threshold = vacuum base threshold + vacuum scale factor * number of tuples

这里的清理基本阈值是 autovacuum_vacuum_threshold , 清理缩放系数是 autovacuum_vacuum_scale_factor , 行数是 pg_class.reltuples。 过期行的数量是从统计收集器里面获取的, 这是一个半精确的计数,由每次 UPDATEDELETE 操作更新。 半精确的原因是在重负载时有些信息可能会丢失。 如果表的relfrozenxid 值比vacuum_freeze_table_age的事务更旧, 则要冻结行和relfrozenxid做整表扫描, 否则只扫描最后一个清理后修改过的页。

为了分析,使用了一个类似的条件:分析阈值,定义为

analyze threshold = analyze base threshold + analyze scale factor * number of tuples

它会和上次 ANALYZE 插入、更新、删除的总行数进行比较。

通过 autovacuum不能访问临时表。因此,应通过会话的 SQL 命令适当地清理和分析操作。

缺省的阈值和伸缩系数是从 postgresql.conf 里面 取得的,不过,可以针对每个表独立设置, 参阅节存储参数获取更多信息。 如果 pg_autovacuum 里面存在针对特定表的行,那么就使用该特定的设置; 否则使用全局设置。参阅节Section 18.9 获取有关全局设置的更多细节。

除了基本阈值和缩放系数之外,在 pg_autovacuum 里还有 6 个参数 可以为每个表进行设置。首先, autovacuum_enabled 可以设置为 false 让 autovacuum 守护进程 完全忽略某个表。这种情况下,autovacuum 只有在为了避免事务 ID 重叠必须清理整个数据库的时候才会动那个表。接下来两个参数, 清理开销延迟autovacuum_vacuum_cost_delay 和清理开销限制autovacuum_vacuum_cost_limit, ,用于针对特定的表为vacuum_freeze_min_age 和vacuum_freeze_table_age 特性设置数值。

当多个工作者正在运行,成本的限制是"平衡"之间的所有正在运行的工作者,使系统总的影响是相同的, 不管实际运行的工作者数目。

上一篇:下一篇: