使用多个连接,按顺序和小限制优化PostgreSQL查询
我需要一些优化从大表中获取查询的技巧.
在这个例子中我有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: 解决方法
一种可能的方法是从连接中删除商店.相反,你可以:
>在存储过程或源代码中循环存储(按s_name排序),并为每个存储执行stocks.fk_store上的连接过滤.只要获得足够数量的记录,就可以打破循环. 通过这种方式你应该有一个很好的好处. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |