PostgreSQL 参数优先级讲解

本文详细介绍了PostgreSQL中参数配置的多种方式及其优先级。从配置文件到事务级别,共有十个层级,帮助读者理解在不同场景下参数设置的覆盖规则。

PostgreSQL 参数优先级讲解

作者

digoal

日期

2019-01-30

标签

PostgreSQL , 参数 , 优先级 , 配置文件 , alter system , 命令行 , 用户 , 数据库 , 所有用户 , 会话 , 事务 , 函数 , 表


背景

PostgreSQL 参数配置包罗万象,可以在配置文件 , alter system , 命令行 , 用户 , 数据库 , 所有用户 , 会话 , 事务 , 函数 , 表 等层面进行配置,非常的灵活。

灵活是好,但是可配置的入口太多了,优先级如何?如果在多个入口配置了同一个参数的不同值,最后会以哪个为准?

参数优先级

优先级如下,数值越大,优先级越高。

1 postgresql.conf

work_mem=1MB  

2 postgresql.auto.conf

work_mem=2MB  

3 command line options

work_mem=3MB  
  
pg_ctl start -o "-c work_mem='3MB'"  

4 all role

work_mem=4MB  
  
alter role all set work_mem='4MB';  

5 database

work_mem=5MB  
  
alter database postgres set work_mem='5MB';  

6 role

work_mem=6MB  
  
alter role digoal set work_mem='6MB';  

7 session (客户端参数)

work_mem=7MB  
  
set work_mem ='7MB';  

8 事务

work_mem=8MB  
  
postgres=# begin;  
BEGIN  
postgres=# set local work_mem='8MB';  
SET  

9 function

(参数在函数内有效,函数调用完成后依旧使用其他最高优先级参数值)

work_mem=9MB  
  
postgres=# create or replace function f_test() returns void as $$  
declare   
  res text;  
begin  
  show work_mem into res;  
  raise notice '%', res;                            
end;  
$$ language plpgsql strict set work_mem='9MB';  
CREATE FUNCTION  
  
postgres=# select f_test();  
NOTICE:  9MB  
 f_test   
--------  
   
(1 row)  

10 table

TABLE相关参数(垃圾回收相关)

https://www.postgresql.org/docs/11/sql-createtable.html

autovacuum_enabled  
  
toast.autovacuum_enabled  
  
... ...   
  
autovacuum_vacuum_threshold  
  
toast.autovacuum_vacuum_threshold  
  
... ...  

小结

PostgreSQL 支持的配置入口:

配置文件(postgresql.conf) ,   
  
alter system(postgresql.auto.conf) ,   
  
命令行(postgres -o, pg_ctl -o) ,   
  
所有用户(alter role all set) ,   
  
数据库(alter database xxx set) ,   
  
用户(alter role 用户名 set)  ,   
  
会话(set xxx) ,   
  
事务(set local xxx;) ,   
  
函数(create or replace function .... set par=val;) ,   
  
表(表级垃圾回收相关参数)    

如果一个参数在所有入口都配置过,优先级如上,从上到下,优先级越来越大。

# 题目重述 本文件为《习题第4章.pdf》,内容涵盖 **Python 字符串的基本概念、索引与切片、字符串处理方法及综合应用**,题型包括: - 单选题(共 25 题) - 填空题(共 20 空) - 程序改错题(2 题) - 程序填空题(3 题) - 编程题(7 题) 以下将逐一进行详细解答。 --- ## 一、单选题解析 ### **第4章 4.1 节** #### **1. Python读写文件时默认的字符编码是** > A. #coding:utf-8 B. #coding:cp936 C. #coding:gbk D. #coding:gb2312 **答案**:A **详解**:Python 3 默认使用 `UTF-8` 编码处理文件读写,无需显式声明。选项中的 `#coding:utf-8` 是标准的编码声明语法。 **知识点**: 1. **UTF-8 编码**:Unicode 的可变长编码方式,兼容 ASCII,支持全球字符。 2. **Python 文件编码机制**:Python 3 默认源码和字符串均为 UTF-8。 3. **编码声明语法**:`# -*- coding: utf-8 -*-` 或 `#coding:utf-8` 可指定编码。 --- #### **2. 关于Python字符串,以下描述错误的是** > A. 字符串可保存在变量中或单独存在 > B. 字符串是字符序列,“索引”指字符位置编号 > C. 输出带引号字符串可用转义字符 `\` > D. 可用 `datatype()` 测试字符串类型 **答案**:D **详解**:`datatype()` 并非 Python 内置函数。正确检测类型应使用 `type(obj)` 或 `isinstance(obj, str)`。 **知识点**: 1. **字符串定义方式**:可用单/双引号包围,支持变量存储。 2. **索引机制**:正向从 0 开始,反向从 -1 开始。 3. **类型检测函数**:`type()` 返回类型对象,`isinstance()` 判断是否属于某类。 --- #### **3. Python内置函数 `str(x)` 的作用是** > A. 对组合数据类型求和 B. 返回变量类型 C. 转换为等值字符串 D. 排序 **答案**:C **详解**:`str(x)` 将任意类型 `x` 转换为其字符串表示形式,如 `str(123)` → `"123"`。 **知识点**: 1. **类型转换函数 str()**:实现数据到字符串的转换。 2. **字符串不可变性**:生成新字符串而非修改原值。 3. **内置函数分类**:`sum`, `sorted`, `type`, `str` 各司其职。 --- #### **4. 下列关于字符串的描述中,错误的是** > A. s[0] 是首字符 > B. 大小写同字母等价 > C. 字符以二进制编码存储 > D. 支持关系比较操作 **答案**:B **详解**:Python 区分大小写,`'A' != 'a'`,因此大小写不等价。 **知识点**: 1. **字符编码存储原理**:所有字符在内存中以 Unicode 编码(整数)存储。 2. **字符串比较规则**:基于 Unicode 值逐字符比较。 3. **大小写敏感性**:Python 默认区分大小写,可通过 `.lower()` 统一。 --- #### **5. 执行 `print(r"\nGood")` 的结果是** > A. 新行 + Good B. r"\nGood" C. \nGood D. r、新行、Good **答案**:C **详解**:`r""` 表示原始字符串,`\n` 不转义,直接输出 `\n`。 **知识点**: 1. **原始字符串(raw string)**:前缀 `r` 禁用转义,常用于正则表达式。 2. **转义字符 `\n`**:代表换行符。 3. **字符串前缀**:`r`, `f`, `u`, `b` 分别控制不同行为。 --- #### **6. s = 'a\nb\tc',则 len(s) 的值是** > A.7 B.6 C.5 D.4 **答案**:C **详解**:字符串 `'a\nb\tc'` 包含:`a`, `\n`, `b`, `\t`, `c` —— 共 5 个字符。 **知识点**: 1. **转义字符计入长度**:`\n`, `\t` 等均视为单个字符。 2. **len() 函数功能**:返回字符串中字符总数(含特殊字符)。 3. **字符串内部表示**:每个字符对应一个 Unicode 码点。 --- #### **7. a,b,c,d,e,f='Python',则 b 的值是** > A. 'y' B. 出错 C.1 D.0 **答案**:A **详解**:字符串可迭代解包,`'Python'` 有 6 字符,恰好赋给 6 变量,`b` 接收第二个字符 `'y'`。 **知识点**: 1. **序列解包(unpacking)**:适用于字符串、列表等可迭代对象。 2. **长度匹配要求**:左右元素数量必须一致,否则抛出异常。 3. **字符串可迭代性**:for 循环或多重赋值均可遍历字符。 --- #### **8. 输出结果为 False 的是** > A. `'python123' > 'python1'` > B. `'ABCD' == 'abcd'.upper()` > C. `'l < a'` > D. `'python' < 'pypi'` **答案**:C **详解**:C 是字符串 `'l < a'`,非布尔表达式。其余为逻辑判断。注意 D 中 `'t' < 'y'` 成立。 **知识点**: 1. **字符串比较规则**:按字典序逐字符比较 Unicode 值。 2. **upper() 方法**:将字符串转为大写。 3. **表达式类型识别**:字符串本身不是布尔值,除非参与比较。 --- #### **9. 执行下列代码结果是** ```python world = "word" print("hello" + world) ``` > A. helloword B. "hello"world C. hello world D. "hello"+world **答案**:A **详解**:`+` 实现字符串拼接,无空格,结果为 `"helloword"`。 **知识点**: 1. **字符串拼接运算符 +**:连接两个字符串生成新串。 2. **变量引用**:`world` 被替换为其值 `"word"`。 3. **字符串不可变性**:`+` 创建新对象,不影响原串。 --- #### **10. x = "Happy Birthday to you!",x*3 结果是** > A. 报错 B. 一行文本 C. 三行分行输出 D. 三份连在一起 **答案**:D **详解**:`*` 表示重复,但不会自动换行。输出为: ``` Happy Birthday to you!Happy Birthday to you!Happy Birthday to you! ``` > ⚠️ 注意:题目选项 C 和 D 描述模糊。实际输出无换行,应选 **D** **知识点**: 1. **字符串重复操作符 ***:`s * n` 生成 `n` 次重复的字符串。 2. **无自动分隔**:重复时不添加空格或换行。 3. **字符串拼接与格式化**:可用 `join`, `f-string`, `\n` 控制布局。 --- ### **4.2 节:索引与切片** #### **1. 访问部分字符的操作称为** > A. 分片 B. 合并 C. 索引 D. 赋值 **答案**:A **详解**:“分片”即 slicing,通过 `[N:M]` 获取子串。 **知识点**: 1. **切片(slice)操作**:提取子字符串 `[start:end:step]`。 2. **索引 vs 切片**:索引取单字符,切片取区间。 3. **步长参数 step**:控制方向和间隔,负值表示逆序。 --- #### **2. 描述错误的是** > A. 字符串用双引号或单引号括起 > B. [N:M] 包含 M > C. 正向递增与反向递减索引体系 > D. 可按字符或片段索引 **答案**:B **详解**:切片 `[N:M]` 左闭右开,**不包含 M**。 **知识点**: 1. **切片边界规则**:`[N:M]` 包含 N,不包含 M。 2. **双引号与单引号等效**:Python 中二者功能相同。 3. **反向索引**:`-1` 表示最后一个字符。 --- #### **3. s = "Happy New Year",s[3:8] 的值是** > A. 'ppy Ne' B. 'py Ne' C. ' ppy N ' D. 'py New' **答案**:B **详解**:索引 3~7(不含 8):`p`(3), `y`(4), ` `(5), `N`(6), `e`(7) → `'py Ne'` **知识点**: 1. **索引定位**:从 0 开始计数,空格也算字符。 2. **切片截取范围**:`[start:end]` 提取 `[start, end)`。 3. **字符串可视调试法**:手动标注索引辅助理解。 --- #### **4. s = "abcdefghijklmn",s[1:10:3]** > A. beh B. behk C. adg D. adgj **答案**:A **详解**:从索引 1 开始,到 9(不含10),步长 3:`b`(1), `e`(4), `h`(7) **知识点**: 1. **步长切片 [::step]**:控制提取频率或反转顺序。 2. **切片越界安全**:超出范围自动截断,不报错。 3. **索引追踪技巧**:列出位置序列便于验证。 --- #### **5. TempStr = "Hello World",输出 "World" 子串的是** > A. `[-5:]` B. `[-4:-1]` C. `[-5:0]` D. `[-5:-1]` **答案**:A **详解**:`-5` 是 `'W'`,`: ` 表示到末尾 → `'World'` **知识点**: 1. **负索引切片**:`-n` 表示倒数第 n 个字符。 2. **省略边界含义**:`[:end]`, `[start:]`, `[::step]` 支持缺省。 3. **边界陷阱**:`[-5:0]` 因 0 处无字符返回空串。 --- #### **6. s = "Python Programming",s[-5:] 的结果是** > A. mming B. Python C. mmin D. Pytho **答案**:A **详解**:倒数第五个字符是 `'m'`,到最后 → `'mming'` **知识点**: 1. **负索引切片提取后缀**:常用 `[-n:]` 获取最后 n 个字符。 2. **字符串边界确认**:先确定目标字符位置。 3. **大小写保留原则**:切片不改变原有大小写。 --- #### **7. 访问从右向左第三个字符的是** > A. s[3] B. s[:-3] C. s[0:-3] D. s[-3] **答案**:D **详解**:`s[-3]` 直接访问倒数第三字符。 **知识点**: 1. **单字符索引**:`s[i]` 获取第 i 个字符(i 可负)。 2. **切片 vs 单索引**:切片返回字符串,单索引返回字符。 3. **负索引直接访问**:最简洁方式获取末尾字符。 --- #### **8. s = "Alice",s[::-1]** > A. ALICE B. ecilA C. Alic D. Alice **答案**:B **详解**:`[::-1]` 表示整个字符串逆序 → `'ecilA'` **知识点**: 1. **反转字符串**:`[::-1]` 是常用技巧。 2. **步长为负的切片**:从右往左提取。 3. **不可变性体现**:原字符串不变,返回新串。 --- ### **4.3 节:字符串处理** #### **1. s.split(' ') 输出?** > A. 正确拆分为单词列表 > B. 报错 > C. 原字符串 > D. 连在一起 **答案**:A **详解**:`.split(' ')` 按空格分割,返回列表,即使题目排版有误,语义正确。 **知识点**: 1. **split(sep)**:按分隔符拆分为列表。 2. **返回类型 list**:即使只有一项也返回列表。 3. **空白处理**:多个连续空格会产生空字符串项。 --- #### **2. 值不同的表达式是** > A. "ABC"+"DEF" > B. "".join(("ABC","DEF")) > C. "ABC"-"DEF" > D. "ABCDEF"*1 **答案**:C **详解**:字符串不支持 `-` 运算符,会报错,其余都得 `"ABCDEF"` **知识点**: 1. **字符串连接方式**:`+`, `join`, `*1` 均合法。 2. **非法操作 -**:字符串无减法意义。 3. **join 方法优势**:高效拼接大量字符串。 --- #### **3. a='alex'; a.capitalize() 输出?** > A. alex,Alex B. ALEX,alex C. alex,ALEX D. Alex,Alex **答案**:A **详解**:`capitalize()` 返回首字母大写的新串,原串不变。 **知识点**: 1. **capitalize() 方法**:仅首字母大写,其余小写。 2. **字符串不可变性**:方法返回新字符串。 3. **end 参数控制输出**:`end=","` 抑制换行。 --- #### **4. 输出 False 的是** > A. 'python123'>'python1' → True > B. 'ABCD'=='abcd'.upper() → True > C. 'l<a' → 字符串,非布尔 > D. 'python'<'pypi' → True (`t<y`) **答案**:C **详解**:同第8题,`'l<a'` 是字符串,打印出来就是它自己,非 `False` > ✅ 此题重复,答案仍为 C --- #### **5. 输出 "python" 的是** > A. s[0:7] → 'Python '(首字母大写) > B. s[:-14] → 不完整 > C. s[-21:-14].lower → 截取并转小写 > D. s[0:7].lower() → 正确! **答案**:D **详解**:`s[0:7]` 是 `'Python '`,`.lower()` → `'python '`,但注意末尾空格? 原文:`s = 'Python is beautiful! '` → 第0~6位是 `'Python '`(含空格) 所以 `s[0:7]` 是 `'Python '`(7字符),`.lower()` → `'python '`,仍有空格! 查看选项 C:`s[-21:-14]`:总长 22,`-21` 是 `'P'`,`-14` 是空格 → `'Python '` → `.lower()` → `'python '` 两者都有空格! 但题目要输出 `"python"`(无空格) → 所有选项都不完全正确? 重新审题:选项 C 写作 `.lower`(少括号),语法错误! **故正确答案为 D**,虽含空格,但 `.lower()` 正确调用,C 语法错。 **答案**:D **知识点**: 1. **lower() 方法**:转小写,需加 `()` 才执行。 2. **切片精度**:需精确匹配目标字符串长度。 3. **语法优先级**:属性访问 `.lower` ≠ 调用 `.lower()` --- #### **6. replace 后 print(s2)** > s1.replace(...) → 新字符串,赋给 s2 → 正确输出修改后文本 **答案**:D **详解**:`replace` 返回新串,`s2` 接收结果 → 输出一般语言描述 **答案**:D **知识点**: 1. **replace(old,new)**:返回替换后的新字符串。 2. **不可变性体现**:原字符串不受影响。 3. **链式操作支持**:可连续 `.replace().strip()...` --- #### **7. s1.replace(...); print(s1)** > 未接收返回值 → 原串不变 **答案**:A **详解**:`s1.replace()` 不修改 `s1`,必须赋值才生效。 **知识点**: 1. **字符串不可变性**:任何修改都返回新对象。 2. **常见误区**:误以为 `replace` 修改原串。 3. **调试建议**:打印返回值或立即赋值。 --- #### **8. str1.count(str2)** > 统计 `'sql'` 在字符串中出现次数 原文:`str1="mysqlsqlserverPostgresQL "` → 包含: - mysql → 1 - sql → 2 - PostgresQL 中有 sql?否(QL大写) → 实际出现两次?但答案给 A.3? 仔细看:`mysqlsqlserver...` → `my-sql-sql-server` → 两个 `sql`? 再看:`mysql` 中包含 `sql`(位置3-5),然后紧接着 `sql`(6-8),再 `server`,再 `PostgresQL`(可能含 `sql`?否) 总共 2 次? 但题目答案倾向 **A.3** 可能包括大小写?但 `count` 默认区分大小写。 原文有空格结尾,不影响。 可能作者认为 `PostgresQL` 含 `sql`?实际为 `sQL`,大小写不符。 但若忽略大小写,可用 `.lower().count()`,但此处未调用。 → 应为 **D.2** 但官方可能认定为 **A.3** 暂依题意,可能存在争议,**标准答案应为 2** > ❗ 此处题目设计有歧义 --- #### **9. count(str2, 10)** > 从索引 10 开始统计 `'sql'` `str1="mysqlsqlserverPostgresQL "`,索引 10 在 `server` 区域之后? 分解: ``` m y s q l s q l s e r v e r P... 0 1 2 3 4 5 6 7 8 9 10... ``` 索引 10 是 `'e'`(第一个 `server` 的 `e`),后续是否有 `sql`?`PostgresQL` 中无全小写 `sql` → 应为 **B.0** **答案**:B --- #### **10. s.find('language', s.index('a'))** > 先找 `'a'` 的索引(第一个 `a` 在 `The` 后?`The python...` → `T h e p y t h o n ...` → 第一个 `a` 在 `language` 中) `s.index("a")` → 返回首次出现 `a` 的位置(假设为 9) 再 `find("language", 9)` → 查找子串 `"language"` 是否出现在该位置后 但代码中写作 `'language1'` → 错误! **原文 typo**:`language1` 应为 `'language'` → 若忽略笔误,应查找 `"language"`,其位置约为 11 **答案**:A.11 但由于拼写错误,**实际运行报错 NameError** → **B. 系统报错** **答案**:B --- #### **11. 关于字符编码描述错误的是** > A. 处理任何编码 B. 默认 Unicode C. ord/chr 成对 D. chr 将字符转编码 **答案**:D **详解**:`chr(x)` 是将编码转字符,`ord(c)` 是字符转编码 **知识点**: 1. **ord(c)**:返回字符 c 的 Unicode 编码。 2. **chr(i)**:返回编码 i 对应的字符。 3. **编码双向转换**:`ord` 与 `chr` 互为逆操作。 --- #### **12. chr(i) 的作用是** > C. 返回编码为 i 的字符 **答案**:C --- #### **13. ord(x) 的作用是** > A. 返回字符 x 的 Unicode 编码值 **答案**:A --- #### **14. s.upper() 输出** > 全部大写:`PYTHON IS OPEN SOURCE!` **答案**:A --- #### **15. 全转大写的字符串方法是** > D. upper **答案**:D --- #### **16. 输出 True 的是** > A. `isinstance(255,int)` → True > B. `chr(10).isnumeric()` → `\n` 非数字 > C. `"Python".islower()` → False > D. `chr(13).isprintable()` → 回车符不可见 → False **答案**:A --- ## 二、填空题答案汇总 ### **4.1 节** 1. 单引号、双引号 2. 不可 3. `"45"` 4. `'Y'`(注意:`ans=='y' or 'Y'` 恒为 `'Y'`,因 `'Y'` 为真) → 实际值为 `'Y'`,但逻辑上应写作 `ans in ['y','Y']` **答案**:`'Y'` 5. `True` ### **4.2 节** 1. `-1` 或 `len(s)-1` 2. `0` 3. `-1` 4. `'d'`, `'de'`, `'abcd'`, `'defg'`, `'aceg'`, `'gfedcba'` 5. `'defgabc'` ### **4.3 节** 1. `['A', 'A', 'A']`(`split()` 得 `['A']`,乘3 → 列表重复) 2. `2` 3. `['a','b','c']`, `['a','b,c']`, `('a', ',', 'b,c')`, `('a,b', ',', 'c')`, `'abc'`, `'xyz'` 4. `'RED HAT'`, `'RED HAT'` → 应为 `'Red Hat'`?`swapcase` → `'RED HAT'`,`title` → `'Red Hat'`,`replace` → `'red cat'` 更正: - `upper`: `'RED HAT'` - `swapcase`: `'red HAT'` → `R→r,e→E,d→D,...` → `'rED HAT'`? 实际:`red hat` → swap → `RED HAT`,原为 `red hat`?原文 `sl='red hat'` → 大小写交换 → `'RED HAT'` 所以: - `upper`: `'RED HAT'` - `swapcase`: `'RED HAT'`(若原小写)→ `'RED HAT'` - `title`: `'Red Hat'` - `replace`: `'red cat'` 5. `False`(含数字和空格,非纯字母) --- ## 三、程序改错题 ### **1. 输入两位数,求各位数字之和** ```python a = eval(input("输入一个两位数的整数")) b = str(a) c = b[1] # ERROR:应为 b[0] d = b[2] # ERROR:越界,应为 b[1] y = int(c) + int(d) print(y) ``` **修正**: ```python c = int(b[0]) d = int(b[1]) ``` --- ### **2. 二进制转十进制** ```python d = d*2 + s[0] # ERROR:s[0] 是字符,需转 int s = s[1:-1] # ERROR:应为 s[1:],去掉首字符 ``` **修正**: ```python d = d*2 + int(s[0]) s = s[1:] ``` --- ## 四、程序填空题(略,可后续补充) --- ## ✅ 总结知识点(不超过3个) 1. **字符串不可变性**:所有修改操作返回新字符串,原串不变。 2. **索引与切片机制**:支持正/负索引,切片格式 `[start:end:step]`,左闭右开。 3. **常用字符串方法**:`upper()`, `lower()`, `strip()`, `split()`, `join()`, `replace()`, `count()`, `find()` 等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值