假设我们有一个 orders
表,其中包含 order_id
、customer_id
、order_total
等列,并且数据量较大。现在有多个查询同时运行,导致系统资源竞争严重。
优化索引
如果经常需要根据 customer_id
来查询订单信息,可以创建相应的索引:
CREATE INDEX idx_customer_id ON orders (customer_id);
使用资源队列
创建一个资源队列,并将一些用户或查询分配到该队列:
CREATE RESOURCE QUEUE limited_queue WITH (ACTIVE_STATEMENTS = 5, MEMORY_LIMIT = '500MB', CPU_RATE_LIMIT = 50);
ALTER ROLE some_user RESOURCE QUEUE limited_queue;
调整参数
增加 shared_buffers
的大小(例如将其设置为系统内存的 25%):
ALTER SYSTEM SET shared_buffers = '2GB';
分析查询性能
使用 EXPLAIN
分析一个复杂查询:
EXPLAIN SELECT o.order_id, c.name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_total > 1000;
从执行计划中,可能会发现是否存在全表扫描、索引使用是否合理等问题,并相应地进行优化。