需要的优化帮助:带有多个联接和过滤器的复杂PostgreSQL查询

puruo6ea  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(4)|浏览(80)

我在PostgreSQL中遇到了一个复杂的SQL查询的性能问题,并寻求您的专业知识来帮助优化它。该查询涉及多个表和联接,执行时间似乎比预期的要长。我相信在提高效率和加快检索结果的过程方面,仍有改善的空间。详细信息:数据库:涉及的PostgreSQL表:customers、orders、order_items和products使用案例:此查询旨在检索有关2022年1月1日之后订购电子产品的美国客户的数据。

SELECT customers.customer_id, customers.name, products.product_id, products.product_name, 
       orders.order_id, orders.order_date, order_items.quantity, order_items.unit_price
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
JOIN order_items ON orders.order_id = order_items.order_id
JOIN products ON order_items.product_id = products.product_id
WHERE customers.country = 'USA'
AND orders.order_date >= '2022-01-01'
AND products.category = 'Electronics'
ORDER BY orders.order_date DESC;

字符串
我将非常感谢任何关于如何优化此查询的见解或建议。我的目标是高效地检索所需的数据,同时最大限度地减少资源使用和查询执行时间。我特别感兴趣的是任何索引建议、连接优化或其他可以提高整体性能的SQL技术。

2ic8powd

2ic8powd1#

DBMS将尝试找到一种方法来积累数据,而不构建庞大的中间结果。它可能会寻找您查询中最具限制性的因素。如果你的客户主要在欧洲,customers.country = 'USA'可能是最具限制性的条款。DBMS将挑选那些相对较少的客户,查找他们的订单等。或者您的数据库中可能有自1995年以来的订单。那么orders.order_date >= date '2022-01-01'将是开始收集数据的好方法。获得自2022年以来相对较少的订单,获得他们的电子产品和美国客户并完成它。或者可能有500个不同的类别,电子产品只是其中之一。或者可能没有一个子句单独对显著减少所访问的数据很有帮助。
我不知道你的数据,我也不知道你的DBMS对你的数据有多了解。以下是一些你可以尝试的索引:

create index idx1 on customers (country) include customer_id, name;
create index idx2 on orders (customer_id, order_date) include order_id;
create index idx3 on order_items (order_id) include product_id, quantity, unit_price;
create index idx4 on products (product_id, category) include product_name;

create index idx5 on orders (order_date) include customer_id, order_id;
create index idx6 on customers (customer_id) include country, name;

create index idx7 on products (category) include product_id, product_name;
create index idx8 on order_items (product_id) include order_id, quantity, unit_price;
create index idx9 on orders (order_id, order_date) include customer_id;

字符串
创造这些。然后检查正在使用哪些索引,并删除未使用的索引。

gab6jxml

gab6jxml2#

如果不需要每个表中的所有列,请考虑只选择所需的列。
这减少了需要处理的数据量

jfgube3f

jfgube3f3#

该查询涉及多个表和联接,执行时间似乎比预期的要长。
要最小化查询的执行时间,请使用EXPLAIN ANALYZE检查计划和执行细节,以便在执行任何其他步骤之前确切了解导致执行时间延长的原因。

91zkwejq

91zkwejq4#

创建缺失索引:

CREATE INDEX idx_customers_country ON customers (country);
CREATE INDEX idx_orders_order_date ON orders (order_date);
CREATE INDEX idx_products_category ON products (category);
CREATE INDEX idx_order_items_order_id ON order_items (order_id);
CREATE INDEX idx_order_items_product_id ON order_items (product_id);

字符串
优化查询:

WITH relevant_orders AS (
    SELECT order_id
    FROM orders
    WHERE order_date >= '2022-01-01'
)
SELECT c.customer_id, c.name, p.product_id, p.product_name, 
       o.order_id, o.order_date, oi.quantity, oi.unit_price
FROM customers c
JOIN relevant_orders ro ON c.customer_id = ro.customer_id
JOIN order_items oi ON ro.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE c.country = 'USA'
AND p.category = 'Electronics'
ORDER BY o.order_date DESC;

相关问题