使用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
參數調整并行度)。