使用EXPLAIN或EXPLAIN ANALYZE命令查看查询执行计划,重点关注操作符类型(如Seq Scan全表扫描、Index Scan索引扫描)、成本估计(startup_cost/total_cost)和实际执行时间。通过分析可快速定位性能瓶颈(如未使用索引的全表扫描)。在pgAdmin中,可直接在SQL查询编辑器执行查询,右键选择“Explain/Explain Analyze”查看可视化执行计划。
WHERE、JOIN、ORDER BY子句涉及的列上创建索引(如CREATE INDEX idx_column ON table_name(column_name)),优先选择高选择性列(唯一值多的列)。WHERE子句中对索引列使用函数(如WHERE UPPER(name) = 'JOHN')、算术运算(如WHERE age + 1 > 30)或!=/<>操作符;避免SELECT *(只查询所需列,减少索引回表开销)。REINDEX命令重建碎片化索引(如REINDEX TABLE table_name),删除不再使用的冗余索引。WITH子句(CTEs,公共表表达式)拆分复杂查询,提高可读性和复用性;避免嵌套子查询,优先使用JOIN(如INNER JOIN、LEFT JOIN)替代。LIMIT和OFFSET限制返回结果集(如SELECT * FROM table LIMIT 100 OFFSET 0);避免SELECT *,仅选择必要列(如SELECT id, name FROM table)。EXISTS代替IN(如SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id)),因EXISTS在找到第一条匹配记录后即停止搜索;用UNION ALL代替UNION(UNION需去重,开销更大)。定期运行ANALYZE命令收集表和索引的统计信息(如行数、数据分布),帮助查询优化器生成更优的执行计划。在pgAdmin中,可通过“Tools”→“Analyze”工具批量更新统计信息,或在SQL编辑器执行ANALYZE table_name。
根据服务器硬件资源(CPU、内存、存储)调整关键参数,提升查询性能:
SET work_mem = '64MB'),避免临时文件写入磁盘。SET maintenance_work_mem = '512MB'),加快维护任务速度。对于数据量超过千万行的大表,使用分区技术将数据分散到多个物理分区(如按时间范围RANGE、列表LIST或哈希HASH分区),减少单次查询需要扫描的数据量。在pgAdmin中,可通过“Tables”→“Create Partition”向导创建分区表,或使用SQL命令(如CREATE TABLE sales PARTITION BY RANGE (sale_date))。
VACUUM VERBOSE table_name查看详情)。REINDEX INDEX idx_column)。DELETE FROM logs WHERE create_time < NOW() - INTERVAL '1 year'),减少表大小。若软件优化达到瓶颈,可升级服务器硬件:
shared_buffers和work_mem的上限,减少磁盘I/O。max_parallel_workers参数调整并行度)。