加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用多个连接,按顺序和小限制优化PostgreSQL查询

发布时间:2020-12-13 16:07:49 所属栏目:百科 来源:网络整理
导读:我需要一些优化从大表中获取查询的技巧. 在这个例子中我有5个表: Brands- id_brand- b_nameProducts- id_product- p_name- ean...- fk_brandProd_attributes- id_prod_att- size_basic...- fk_productStores- id_store- s_name...Stocks- id_stock- stock_a
我需要一些优化从大表中获取查询的技巧.

在这个例子中我有5个表:

Brands
- id_brand
- b_name

Products
- id_product
- p_name
- ean
...
- fk_brand

Prod_attributes
- id_prod_att
- size_basic
...
- fk_product

Stores
- id_store
- s_name
...

Stocks
- id_stock
- stock_amount
- fk_prod_att
- fk_store

我需要查询有序的股票有序列表,所以这是我使用的一般方法:

SELECT stores.s_name,stocks.stock_amount,prod_attributes.size_basic,products.p_name,products.ean,brands.b_name 

FROM (stocks 
    INNER JOIN stores 
    ON stocks.fk_store = stores.id_store) 
    INNER JOIN (prod_attributes 
        INNER JOIN (products 
            INNER JOIN brands 
            ON products.fk_brand = brands.id_brand) 
        ON prod_attributes.fk_product = products.id_product) 
    ON stocks.fk_prod_att = prod_attributes.id_prod_att 

ORDER BY s_name,p_name,size_basic 

LIMIT 25 OFFSET 0

这适用于小型表,但是当表增长时,查询变得非常昂贵. Stocks中有3,5M行,Prod_attributes中有300K,超过8800ms时执行25K产品,这对我来说是不可接受的.

所有的forgein键都有索引,最近对DB进行了真空分析.

我知道问题出在ORDER BY部分,因为查询不使用索引并进行顺序扫描.如果我删除了排序,那么查询速度非常快.

为了解决这个问题,我知道我可以删除ORDER BY,但对我来说这不是一个可行的选择.数据库或物化视图的反规范化也可能有助于此 – 如果可能的话,我想再次避免这种情况.

我还能做些什么来加快查询速度?

EXPLAIN ANALYZE:
– 订单减慢:http://explain.depesz.com/s/AHO
– 快速无订单:http://explain.depesz.com/s/NRxr

解决方法

一种可能的方法是从连接中删除商店.相反,你可以:

>在存储过程或源代码中循环存储(按s_name排序),并为每个存储执行stocks.fk_store上的连接过滤.只要获得足够数量的记录,就可以打破循环.
>如果可能,使用fk_store键对库存进行分区,以便大量减少连接中的元组数量.

通过这种方式你应该有一个很好的好处.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读