PG常用的几个查询(1)

select version(); ---查看pg版本
SELECT current_database(); --查看当前数据库
select current_user; --查看当前用户
psql -c "select version()" ----执行单条sql命令
psql -f xxxx.sql -----可以把多条命令写入文件,用-f执行
SELECT pg_database_size(current_database()); 查看当前库大小
SELECT sum(pg_database_size(datname)) from pg_database; 查询所有库大小之和
select pg_relation_size('accounts'); ---查询表大小
select pg_total_relation_size('accounts'); ---查询包含表和表索引其他总大小
select pg_tablespace_size('tbs_index')/1024/1024 as "SIZE M"; 查看表空间大小

查看TOP10大表:
SELECT table_name
,pg_relation_size(table_name) as size
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema',
'pg_catalog')
ORDER BY size DESC
LIMIT 10;

快速评估表的行数:(一般都是大表,如果用count比较耗时间)
SELECT (CASE WHEN reltuples > 0 THEN
pg_relation_size('mytable')/(8192*relpages/reltuples)
ELSE 0
END)::bigint AS estimated_row_count
FROM pg_class
WHERE oid = 'mytable'::regclass;

查询等待会话
SELECT
w.current_query as waiting_query,
w.procpid as w_pid,
w.usename as w_user,
l.current_query as locking_query,
l.procpid as l_pid,
l.usename as l_user,
t.schemaname || '.' || t.relname as tablename
from pg_stat_activity w
join pg_locks l1 on w.procpid = l1.pid and not l1.granted
join pg_locks l2 on l1.relation = l2.relation and l2.granted
join pg_stat_activity l on l2.pid = l.procpid
join pg_stat_user_tables t on l1.relation = t.relid
where w.waiting;

SELECT date_trunc('second',
current_timestamp - pg_postmaster_start_time()) as uptime; ----数据库开启多久

SELECT pg_postmaster_start_time(); --------什么时候开启的
<think>首先,用户的问题是:"我想在PostgreSQL中使用索引优化模糊查询的性能请问PostgreSQLoptimizefuzzyquerywithindex"。这是一个关于数据库优化的具体问题。系统级指令要求:-所有行内数学表达式使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识。-回答结构清晰,帮助用户逐步解决问题,保证真实可靠。用户提供的引用包括:-[^1]:关于表空间查看的信息。-[^2]:初始化数据库的命令。-[^3]:PostgreSQL单机部署和删除操作。-[^4]:添加用户、安装依赖、编译安装PostgreSQL。这些引用似乎与模糊查询优化关系不大。指令说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。"但在这个上下文中,用户没有提供上一次的问题或对话历史。所以,我应该基于当前问题回答。关键主题:PostgreSQL中优化模糊查询的性能,使用索引。模糊查询通常涉及LIKE操作符或正则表达式,例如WHEREcolumnLIKE'%pattern%'。PostgreSQL支持几种索引类型来优化模糊查询1.**B-tree索引**:对前缀查询有效,如LIKE'pattern%',但不适用于后缀或中缀查询(如'%pattern%')。2.**Trigram索引(pg_trgm扩展)**:这是优化模糊查询常用方法,适用于任意位置的模糊匹配。3.**全文搜索索引**:如果查询涉及文本搜索,可以使用tsvector和tsquery。4.**其他方法**:如使用表达式索引或自定义函数。用户的问题焦点是模糊查询,所以重点在pg_trgm扩展。步骤回答:1.**介绍问题**:模糊查询的性能问题。2.**解释解决方案**:使用pg_trgm扩展创建Trigram索引。3.**提供示例**:展示如何安装扩展、创建索引和使用查询。4.**注意事项**:讨论索引的限制和维护。5.**生成相关问题**:在最后添加相关问题。确保回答真实可靠:基于PostgreSQL官方文档和最佳实践。引用标识:如果引用外部知识,添加引用标识。但由于用户提供了引用,我应该自然地融入它们,如果相关。给定的引用似乎不直接相关,但[^3]提到PostgreSQL部署,[^4]提到安装,所以可以间接引用环境设置部分。结构化回答:-开头:直接回应用户问题。-主体:逐步指导。-结尾:生成相关问题。使用中文回答。最终输出格式:-回答内容。-§§相关问题§§部分。现在,构建回答:</think>### PostgreSQL 中使用索引优化模糊查询的性能 在 PostgreSQL 中,模糊查询(如使用 `LIKE` 操作符的查询)通常性能较差,尤其是当查询模式包含前缀通配符(如 `%pattern%`)时。这是因为标准的 B-tree 索引无法高效支持这种模式。通过使用 **Trigram 索引(基于 pg_trgm 扩展)**,您可以显著提升模糊查询的性能。Trigram 索引将文本拆分为三个字符的子序列(trigram),并对这些子序列建立索引,从而支持任意位置的模糊匹配。下面我将一步步指导您如何实现优化。 #### 步骤 1: 启用 pg_trgm 扩展 在创建索引前,必须先安装并启用 `pg_trgm` 扩展。该扩展是 PostgreSQL 自带的,但默认未激活。您需要在数据库中运行以下命令: ```sql -- 安装 pg_trgm 扩展 CREATE EXTENSION IF NOT EXISTS pg_trgm; ``` 如果扩展未安装,您可能需要从 PostgreSQL 贡献包中加载。在安装 PostgreSQL 时,确保已包含 `contrib` 模块(参考安装步骤[^4])。执行后,您可以使用 `\dx` 命令验证扩展是否启用。 #### 步骤 2: 创建 Trigram 索引 假设您有一个表 `users`,其中包含 `name` 列,您希望优化对该列的模糊查询(如 `WHERE name LIKE '%son%'`)。创建一个基于 trigram 的 GIN 或 GiST 索引: ```sql -- 在目标列上创建 GIN 索引(推荐用于读多写少的场景) CREATE INDEX idx_users_name_trgm ON users USING gin (name gin_trgm_ops); -- 或者创建 GiST 索引(更适合写多读少或数据频繁更新的场景) CREATE INDEX idx_users_name_trgm_gist ON users USING gist (name gist_trgm_ops); ``` - **索引类型选择**: - GIN 索引:查询速度更快,但占用更多存储空间,更新开销较大。 - GiST 索引:更新效率更高,但查询速度略慢于 GIN。 - **注意事项**: - 索引只对文本类型(如 `text`、`varchar`)有效。如果列是其他类型(如整数),需先转换为文本。 - 索引大小会随数据增长而增加,建议监控表空间使用情况(可使用 `pg_size_pretty` 函数查看表空间大小[^1])。 #### 步骤 3: 优化查询语句 创建索引后,确保您的查询语句能触发索引使用。使用 `LIKE` 或 `ILIKE`(大小写不敏感)时,模式应至少包含一个非通配符字符。示例: ```sql -- 正确:索引可被触发(模式包含非通配符字符) SELECT * FROM users WHERE name LIKE '%son%'; -- 错误:索引无法触发(模式为纯通配符,如 '%%') SELECT * FROM users WHERE name LIKE '%%'; ``` 为了提高性能,您可以: - 使用 `SIMILAR TO` 或正则表达式,但需确保查询模式适合 trigram 匹配。 - 结合 `pg_trgm.similarity_threshold` 参数调整相似度阈值(默认 0.3),例如: ```sql SET pg_trgm.similarity_threshold = 0.5; -- 设置更高的阈值以减少结果集 SELECT * FROM users WHERE name % 'son'; -- % 操作符使用相似度匹配 ``` #### 步骤 4: 性能测试和验证 创建索引后,使用 `EXPLAIN ANALYZE` 命令验证索引是否生效: ```sql EXPLAIN ANALYZE SELECT * FROM users WHERE name LIKE '%son%'; ``` 输出中应显示 `Index Scan` 或 `Bitmap Index Scan`,表明索引被使用。例如: ``` Bitmap Heap Scan on users (cost=12.35..25.18 rows=5 width=32) (actual time=0.045..0.046 rows=2 loops=1) Recheck Cond: (name ~~ '%son%'::text) Heap Blocks: exact=1 -> Bitmap Index Scan on idx_users_name_trgm (cost=0.00..12.35 rows=5 width=0) (actual time=0.038..0.038 rows=2 loops=1) Index Cond: (name ~~ '%son%'::text) Planning Time: 0.112 ms Execution Time: 0.072 ms ``` 如果未触发索引,检查查询模式或索引类型。 #### 注意事项和最佳实践 - **性能提升效果**:Trigram 索引可将模糊查询速度提升 10-100 倍(取决于数据量和模式),但索引维护会增加写入开销。在频繁更新的表中,需权衡读写性能。 - **索引维护**:定期运行 `ANALYZE` 更新统计信息,并使用 `REINDEX` 重建索引以防性能下降(特别是在大量数据变更后[^3])。 - **局限性**: - 索引不支持超短模式(少于 3 字符),因为 trigram 要求最小长度为 3。 - 如果查询涉及多列,考虑使用表达式索引(如 `CREATE INDEX ... ON table USING gin ((col1 || ' ' || col2) gin_trgm_ops)`)。 - **备选方案**:如果 trigram 索引不适用,可考虑: - **全文搜索索引**:用于语义搜索(如 `to_tsvector`)。 - **B-tree 索引**:仅对前缀查询(如 `LIKE 'son%'`)有效。 - **外部工具**:如 PostgreSQL 的 `pg_bigm` 扩展(支持双字符索引)。 通过以上步骤,您可以有效优化模糊查询性能。如果索引未按预期工作,检查 PostgreSQL 日志(如 `PGLOG` 路径[^4])以诊断问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值