此查询需要944,319.072 ms并返回27行。
SELECT
AP_ATTRIBUTE.stylename,
AP_BASIC.style,
AP_ATTRIBUTE.color,
AP_ATTRIBUTE.size,
AP_BASIC.ap_sizesequence_id AS apSizesequenceId,
M_TRANSACTION.movementdate AS MOVEMENTDATE,
SUM(M_TRANSACTION.MOVEMENTQTY) AS MOVEMENTQTY,
COALESCE(M_PRODUCTPRICE.pricelist, 999999) AS pricelist,
M_INOUT.M_INOUT_ID,
M_INOUT.DOCUMENTNO AS DOCUMENTNO,
C_BPARTNER.VALUE AS BPNAME,
'' AS M_MOVEMENTLINE_ID,
'' AS MOVEMENT,
'' AS MOVEMENT_DESCRIPTION,
'' AS M_INVENTORY_ID,
'' AS M_MOVEMENT_ID,
'' AS M_PRODUCTIONPLAN_ID,
'' AS PRODUCTION_PLAN
FROM
M_TRANSACTION
LEFT JOIN
AP_ATTRIBUTE ON AP_ATTRIBUTE.M_PRODUCT_ID = M_TRANSACTION.M_PRODUCT_ID
LEFT JOIN
AP_BASIC ON AP_BASIC.AP_BASIC_ID = AP_ATTRIBUTE.AP_BASIC_ID
LEFT JOIN
M_PRODUCTPRICE ON
M_TRANSACTION.M_PRODUCT_ID = M_PRODUCTPRICE.M_PRODUCT_ID
AND M_PRODUCTPRICE.m_pricelist_version_id = '69CBAFD24AB24E3CB9B9A44E282D62EC',
M_INOUTLINE,
M_INOUT,
C_BPARTNER
WHERE
M_TRANSACTION.M_INOUTLINE_ID = M_INOUTLINE.M_INOUTLINE_ID
AND M_INOUTLINE.M_INOUT_ID = M_INOUT.M_INOUT_ID
AND M_TRANSACTION.M_INOUTLINE_ID IS NOT NULL
AND M_INOUT.C_BPARTNER_ID = C_BPARTNER.C_BPARTNER_ID
AND M_TRANSACTION.AD_CLIENT_ID IN (
'0',
'FF80818129E99DC80129E9AD546A0708'
)
AND M_TRANSACTION.AD_ORG_ID IN (
'44523886B0E0423584BB0E87133F3EE4',
'4510F92E007E48B28EE6CEB088A78348',
'0'
)
AND AP_ATTRIBUTE.isActive = 'Y'
AND 1 = 1
AND M_TRANSACTION.movementdate >= to_date('2012-12-01')
AND M_TRANSACTION.movementdate < to_date('2013-01-01')
AND M_INOUT.M_WAREHOUSE_ID = '50657AE0F49A421A9F10154C8632A726'
AND M_INOUT.ISSOTRX = 'N'
GROUP BY
AP_ATTRIBUTE.stylename,
AP_BASIC.style,
AP_ATTRIBUTE.color,
AP_ATTRIBUTE.size,
AP_BASIC.ap_sizesequence_id,
M_TRANSACTION.movementdate,
M_PRODUCTPRICE.pricelist,
M_INOUT.M_INOUT_ID,
M_INOUT.DOCUMENTNO,
C_BPARTNER.VALUE
ORDER BY
M_TRANSACTION.movementdate,
M_INOUT.M_INOUT_ID,
style,
color,
size
M_TRANSACTION
中有2,962,657行
pk:m_transaction_id
index:m_product_id
AP_ATTRIBUTE
中有106,380行
pk:AP_ATTRIBUTE_id
没有索引
AP_BASIC
中有6,128行
pk:AP_BASIC_id
没有索引
M_PRODUCTPRICE
中有223,917行
index:(m_pricelist_version_id,m_product_id)
M_INOUTLINE
中有2,000,329行
pk:m_inoutline_id
index:m_product_id,m_inout_id
M_INOUT
中有45,919行
pk:m_inout_id
index:m_inout_id
EXPLAIN ANALYZE
显示了此计划(也在explain.depesz.com):
GroupAggregate (cost=201073.74..201073.78 rows=1 width=138) (actual time=944255.849..944256.284 rows=517 loops=1)
-> Sort (cost=201073.74..201073.74 rows=1 width=138) (actual time=944255.828..944255.859 rows=517 loops=1)
Sort Key: m_transaction.movementdate, m_inout.m_inout_id, ap_basic.style, ap_attribute.color, ap_attribute.size, ap_attribute.stylename, ap_basic.ap_sizesequence_id, m_productprice.pricelist, m_inout.documentno, c_bpartner.value
Sort Method: quicksort Memory: 162kB
-> Nested Loop (cost=0.00..201073.73 rows=1 width=138) (actual time=272067.456..944244.793 rows=517 loops=1)
-> Nested Loop (cost=0.00..201066.14 rows=1 width=146) (actual time=272067.433..944239.495 rows=517 loops=1)
-> Nested Loop (cost=0.00..201058.34 rows=1 width=107) (actual time=13.225..943784.425 rows=28860 loops=1)
-> Nested Loop Left Join (cost=0.00..201049.06 rows=1 width=107) (actual time=13.197..940249.631 rows=28860 loops=1)
-> Nested Loop Left Join (cost=0.00..201040.64 rows=1 width=136) (actual time=13.122..938969.396 rows=28860 loops=1)
-> Nested Loop (cost=0.00..201032.88 rows=1 width=130) (actual time=13.086..938463.010 rows=28860 loops=1)
Join Filter: ((m_transaction.m_product_id)::text = (ap_attribute.m_product_id)::text)
-> Seq Scan on m_transaction (cost=0.00..188132.06 rows=1 width=78) (actual time=0.015..932.400 rows=28936 loops=1)
Filter: ((m_inoutline_id IS NOT NULL) AND ((ad_client_id)::text = ANY ('{0,FF80818129E99DC80129E9AD546A0708}'::text[])) AND (movementdate >= '2012-12-01 00:00:00'::timestamp without time zone) AND (movementdate < '2013-01-01 00:00:00'::timestamp without time zone) AND ((ad_org_id)::text = ANY ('{44523886B0E0423584BB0E87133F3EE4,4510F92E007E48B28EE6CEB088A78348,0}'::text[])))
-> Seq Scan on ap_attribute (cost=0.00..11820.75 rows=86405 width=85) (actual time=0.001..20.121 rows=86645 loops=28936)
Filter: (isactive = 'Y'::bpchar)
-> Index Scan using ap_bs_key on ap_basic (cost=0.00..7.76 rows=1 width=72) (actual time=0.013..0.014 rows=1 loops=28860)
Index Cond: ((ap_basic_id)::text = (ap_attribute.ap_basic_id)::text)
-> Index Scan using m_productprice_pricelist_ve_un on m_productprice (cost=0.00..8.40 rows=1 width=36) (actual time=0.042..0.042 rows=1 loops=28860)
Index Cond: (((m_pricelist_version_id)::text = '69CBAFD24AB24E3CB9B9A44E282D62EC'::text) AND ((m_transaction.m_product_id)::text = (m_product_id)::text))
-> Index Scan using m_inoutline_key on m_inoutline (cost=0.00..9.27 rows=1 width=66) (actual time=0.120..0.120 rows=1 loops=28860)
Index Cond: ((m_inoutline_id)::text = (m_transaction.m_inoutline_id)::text)
-> Index Scan using m_inout_key on m_inout (cost=0.00..7.79 rows=1 width=72) (actual time=0.015..0.015 rows=0 loops=28860)
Index Cond: ((m_inout_id)::text = (m_inoutline.m_inout_id)::text)
Filter: (((m_warehouse_id)::text = '50657AE0F49A421A9F10154C8632A726'::text) AND (issotrx = 'N'::bpchar))
-> Index Scan using c_bpartner_key on c_bpartner (cost=0.00..7.57 rows=1 width=56) (actual time=0.007..0.008 rows=1 loops=517)
Index Cond: ((c_bpartner_id)::text = (m_inout.c_bpartner_id)::text)
总运行时间:944,256.536 ms
27资料列
总运行时间:944,319.072 ms
如何改善查询的效果?
答案 0 :(得分:1)
我重新格式化,删除了噪音和残骸,添加了表别名并转换为显式ANSI连接语法,以及其他内容:
SELECT
a.stylename,
b.style,
a.color,
a.size,
b.ap_sizesequence_id,
t.movementdate,
SUM(t.movementqty) AS movementqty,
COALESCE(p.pricelist, 999999) AS pricelist,
i.m_inout_id,
i.documentno,
c.value as bpname,
'' as m_movementline_id,
'' as movement,
'' as movement_description,
'' as m_inventory_id,
'' as m_movement_id,
'' as m_productionplan_id,
'' as production_plan
FROM M_TRANSACTION t
JOIN AP_ATTRIBUTE a ON a.m_product_id = t.m_product_id
JOIN M_INOUTLINE l ON l.m_inoutline_id = t.m_inoutline_id
JOIN M_INOUT i ON i.m_inout_id = l.m_inout_id
JOIN C_BPARTNER c ON c.c_bpartner_id = i.c_bpartner_id
LEFT JOIN AP_BASIC b ON b.ap_basic_id = a.ap_basic_id
LEFT JOIN M_PRODUCTPRICE p ON p.m_product_id = t.m_product_id
AND p.m_pricelist_version_id = '69CBAFD24AB24E3CB9B9A44E282D62EC'
WHERE t.ad_client_id = ANY(
'{FF80818129E99DC80129E9AD546A0708
,0}')
AND t.ad_org_id = ANY(
'{44523886B0E0423584BB0E87133F3EE4
,4510F92E007E48B28EE6CEB088A78348
,0}')
AND t.movementdate >= '2012-12-01 0:0'::timestamp
AND t.movementdate < '2013-01-01 0:0'::timestamp
AND i.m_warehouse_id = '50657AE0F49A421A9F10154C8632A726'
AND i.issotrx = 'N'
AND a.isactive = 'Y'
GROUP BY
a.stylename,
a.color,
a.size,
b.style,
b.ap_sizesequence_id,
t.movementdate,
p.pricelist,
i.m_inout_id,
c.value
ORDER BY
t.movementdate,
i.m_inout_id,
b.style,
a.color,
a.size
添加表别名,让怪物更容易阅读。
删除了一些多余的列别名,例如b.ap_sizesequence_id AS apsizesequenceid
转换为小写,其中混合大小写标识符只是噪音。
使用加入条件将您的联接转换为 ANSI加入。使复杂查询更易于阅读和调试。
从i.documentno
子句中删除了GROUP BY
。 I Postgres 9.1 PK列i.m_inout_id
已涵盖整个表格。可能有更多冗余列。自己检查一下。
t.m_inoutline_id IS NOT NULL
是多余的。覆盖:
JOIN M_INOUTLINE l ON l.m_inoutline_id = t.m_inoutline_id
= ANY()
略快于IN()
AND a.isactive = 'Y'
将LEFT JOIN AP_ATTRIBUTE
强制转换为常规JOIN
。
t.movementdate
是timestamp
(因为EXPLAIN输出告诉我)。相应地简化表达。
i.issotrx
和a.isactive
最有可能是 boolean
类型,而不是character
(bpchar
)。 (无法对 )
您需要M_TRANSACTION.movementdate
上的至少 索引:
CREATE INDEX m_transaction_movementdate_idx
ON m_transaction(movementdate)
或者可能是multicolumn index喜欢:
CREATE INDEX m_transaction_movementdate_idx
ON m_transaction(ad_client_id, ad_org_id, movementdate)
取决于您的实际数据分布和其他情况。
您需要AP_ATTRIBUTE.m_product_id
上的索引:
CREATE INDEX ap_attribute_m_product_id_idx
ON ap_attribute (m_product_id)
可能更好的部分索引:
CREATE INDEX ap_attribute_m_product_id_idx
ON ap_attribute (m_product_id)
WHERE isactive = 'Y'
我发布了很多关于部分索引的答案。 Try a search here on SO
另一个索引可能有所帮助:
CREATE INDEX m_inout_m_warehouse_id_idx ON m_inout (m_warehouse_id)
再次,可能部分与
...
WHERE issotrx = 'N'